Сброс счётчика ARDUINO?

В интернете часто вижу вот такой код:
void loop() {
  mainTimer++;

  if (!state) {                          
    if ((long)mainTimer - myTimer > PERIOD) {   // таймер периода
      myTimer = mainTimer;                // сброс таймера
    }
  } else {                                
    if ((long)mainTimer - myTimer > WORK) {     // таймер времени работы
      myTimer = mainTimer;                // сброс
    }
  }

}


Зачем так писать, чем плоха классика?

void loop() {
  mainTimer++;

  if (!state) {                           
    if ((long)mainTimer > PERIOD) {             // таймер периода
      mainTimer = 0;                      // сброс таймера
    }
  } else {                               
    if ((long)mainTimer > WORK) {               // таймер времени работы
      mainTimer = 0;                      // сброс
    }
  }
}
  • Вопрос задан
  • 1720 просмотров
Пригласить эксперта
Ответы на вопрос 3
@evgeniy_lm
В loop отсчитывать интервалы таким образом будет только очень пузатый чайник. Точность в таком случае будет никакая. Увы, порог входа в Arduino почти нулевой (так задумывалось изначально), по этому почти весь ардуинский код есть самый жуткий говнокод (в том числе и оба ваши примера).
Как уже писали, продвинутые чайники используют millis() (или micros()). Тогда код будет выглядеть так.

void loop() {
if (!state) {
if (millis() - myTimer > PERIOD) { // таймер периода
myTimer = millis(); // сброс таймера
}
} else {
if (millis() - myTimer > WORK) { // таймер времени работы
myTimer = millis(); // сброс
}
}

}

Здесь вы можете быть уверенны в точности +-2мс для millis() или +-50мкс для micros()
Программисты для отсчета интервалов используют счетчики таймеры. В таком случае можно осуществлять более точные и сложные измерения. Только при этом нужно помнить, что все таймеры используются функцией analogWrite(), таймер 0 так же используется millis() и micros(). При других настройках таймеров эти функции будут недоступны.
Для очень точного отсчета больших интервалов используйте RTC, в Mega2560 он встроен, для других нужен внешний
Ответ написан
@TriKrista
Возможно mainTimer задействована где то еще, и поэтому ее нельзя сбрасывать.
Возможно копируют код не глядя.
Ответ написан
Комментировать
@kalapanga
Вряд ли Вы на самом деле часто видели именно "вот такой код". В ардуино для отсчёта интервалов времени используется функция millis() (или micros()). Применение смотрите в примере BlinkWithoutDelay из стандартной поставки Arduino IDE.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы