И снова о millis()

неправильно находите.
Моменты, которые вы пытаетесь вычислить в строчках 30 и 40 - это разные моменты.

В строке 30 вы отмеряете интервал stopor от момента tiktik, а в строке 40 вы отмеряете тот же интервал от рестарта ардуины.
И хотя численно эти моменты практически совпадают, но логически это ошибка.
В строке 40 нужно считать delta от значения tiktik, а не от нуля.

этот комментарий не вполне верный. В этом коде страшны не любые задержки, а только такие, что превышают period13.

Но в целом да - код на миллис и задержки несовместимы, если вы хотите отмерять время миллисом - все задержки из кода надо убрать.

Ну, остаток-то от деления вставили, надеюсь?

Да:

int sec_sec = delta % 60;

Что делает

в строке №41? Зачем он там? Вот просто нахрена Вы его туда влепили? Пытаетесь запудрить мозги компилятору и спровоцировать его на ошибку? Не выйдет, на таких простых вещах они (компиляторы) не ошибаются.

Буду надеяться на это.

Т.е. ответа на вопрос

не будет? Ну, дело хозяйское.

Для подстраховки. Если бы я знал об операторе целочисленного деления, то его там бы не было.

Какой нахрен подстраховки? У Вас в левой части стоит переменная какого типа?

Вот эта самая delta – она какого типа у Вас?

Так вот, для подстраховки приводят правую часть к тому же типу, что левая, а не к другому, причём “опасно другому”, т.к. здесь очень велика вероятность получить “undefined behavior” со всеми вытекающими!

У меня вот всё укрепляется ощущение, что Вы всё знаете, просто троллите. Вы совершенно не слушаете, что Вам говорят и игнорируете всё сказанное, как будто с Вами шутки шутят.

2 лайка

Для того, чтобы не убирать задержки, в строке 23 было так:

moment13 = moment13+period13;

Вот представьте. Водителю надо проехать из A в B за заданное время.
Водитель вычислил среднюю скорость, на карте поставил контрольные точки и время их прохождения.
Но на пути встречаются разные препятствия: светофоры, переходы…
В строке 23 так было сделано для компенсации отставания.

Опять к тому же

Вам человек совершенно правильно сказал, если Вы хотите полагаться на millis, Вы должны полностью избавиться от delay.

Кстати, сравните, что я Вам говорил ещё позавчера:

Вы же, вместо того, чтоб избавляться от задержек пытаетесь всем доказать, что они необходимы и в сотый раз спрашиваете: “Как сделать чёткую работу миллис при секундных задержках в программе?” и не можете понять просто ответа – никак! Избавляйтесь от задержек.

Дополню, моё утверждение:

по гамбургскому счёту неверно. Можно, это это будет такой говнокод, через такую глубокую задницу … Могу показать, но при условии, что на этом Вы прекратите доставать нас этой темой. Показать?

Торжественно клянусь, что это - последний мой вопрос в этой теме. Но комментарии продолжу отслеживать (если они будут).

static uint32_t period13 = 500;
static uint32_t moment13;

int st;
int st2;
bool trigger;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600);
}
void loop()
{
  if (millis() - moment13 >= period13)
  {
    moment13 = moment13+period13;
    trigger = !trigger;
    digitalWrite(13, trigger);
    if (trigger)
    {
      st2++;
      Serial.println(st2);
      st++;
    }
  }
  if (st==10)
  {
    delay(3000);
    st=0;
  }
}

Итак. Каждые 10 секунд в строке 30 происходит задержка на 3 секунды. А затем идет нагон упущенного времени.
Точность работы millis() меня вполне устраивает.
У кого есть возможность - посмотрите вывод переменной st2 в мониторе.
Мне нужна именно такая работа.

Что не так в строке 18, если сам ЕвгенийП здесь благославил меня на это?

Там же в #14.

Все. Здесь вопросов больше не задаю!

Куда идёт? Где идёт? Какой нагон? Ничего никуда не идёт.

По-прежнему не хотите избавляться от delay? А чего не попросили показать “череззадничный метод”? Я ведь предлагал.

Я прекратил доставать этой темой. Вопросы не задаю. Только отвечаю на них. Показывайте свой код. Поучусь у авторитетного человека.

О нагоне (догоне). Строка 23 должна выполняться раз в секунду. Но, “благодаря” delay (от которого пока не получается избавиться) в строке 30, у нее (у строки 23) это не получается: ну не дали ей вовремя сработать, не да-ли. Так вот. Чтобы вернуть упущенные несработки (вернее, сработки), строка 18 написана имеенно так. Посмотрите монитор порта, или представьте - что там будет. А будет там то, что мне надо.

Беда только в том, что никто не знает, что же Вам надо. Я вот думал, что Вам надо, чтобы оно равномерно мигало независимо от задержек, поплёвывая на delay. Вот, держите такой пример (я же не знал, что Вам надо по три секунды “немигания”).

void mignutEsliNado(void) {
	static constexpr uint32_t poluPeriodMigania = 500ul;
	static uint32_t oldMillis = 0;
	const uint32_t currentMillis = millis();
	if (currentMillis - oldMillis >= poluPeriodMigania) {
		oldMillis = currentMillis;
		digitalWrite(LED_BUILTIN, ! digitalRead(LED_BUILTIN));
	}
}

void yield(void) {
	mignutEsliNado();
}

void setup(void) {
	pinMode(LED_BUILTIN, OUTPUT);
}

void loop(void) {
	mignutEsliNado();
	delay(100500);
}

Всё мигает, на делэй плюёт, но, предупреждаю – это череззадничный говнокод.

Вам и так и сяк, а вы…

if (st==10)
  {
    delay(3000);
    st=0;
  }

… через миллис не могёте?..до сих пор? :slight_smile:

Могу. Строки 16-27. А delay(3000) - для примера. Не всегда от delay можно избавиться. Даже в библиотеках встречается delay.

Я обещал не задвать вопросы в этой теме, поэтому не буду спрашивать - что говнистого в этом коде. Попытаюсь разобраться самостоятельно. Спасибо!

Похоже, что нет понимания, как это работает.Задержка внутри периода 10сек, длящаяся 3сек ни на что не влияет. (TIMER0 на это время не останавливается) Ничего нагонять не надо. Следующий цикл миллис будет всё так же через 10 сек