Обработка переполнения (ролловера) millis() в Arduino: методы и примеры кода

В программировании Arduino функция millis() обычно используется для задач синхронизации и планирования. Однако у millis() есть ограничение из-за конечного диапазона типа данных, используемого для хранения значения времени. Когда millis() достигает максимального значения, он переполняется и перезапускается с нуля, вызывая потенциальные проблемы в чувствительных ко времени приложениях. В этой статье мы рассмотрим различные методы обработки переполнения millis() в Arduino, а также приведем примеры кода.

Метод 1: использование типа данных Unsigned Long
Функция millis() возвращает длинное значение без знака, максимальный диапазон которого составляет 4 294 967 295 (приблизительно 49,7 дней). Используя этот тип данных, мы можем обнаружить и обработать переполнение, сравнивая текущее время с предыдущим.

unsigned long previousTime = 0;
unsigned long currentTime;
void loop() {
  currentTime = millis();
  if (currentTime - previousTime >= interval) {
    // Perform time-sensitive tasks here
    previousTime = currentTime;
  }
}

Метод 2: использование оператора по модулю
Другой подход — использовать оператор по модулю (%) для обработки переполнения. Сбрасывая предыдущее время на ноль при возникновении переполнения, мы можем обеспечить точные вычисления времени.

unsigned long previousTime = 0;
unsigned long currentTime;
void loop() {
  currentTime = millis();
  if ((currentTime - previousTime) % interval >= interval) {
    // Perform time-sensitive tasks here
    previousTime = currentTime;
  }
}

Метод 3: решения на основе библиотек
Существует несколько библиотек, предоставляющих удобные функции для обработки переполнения millis(). Одной из популярных библиотек является библиотека TimerOne, которая позволяет настраивать таймеры и управлять ими со встроенной функцией обработки переполнения.

#include <TimerOne.h>
void setup() {
  Timer1.initialize(1000000); // Set the timer interval in microseconds
  Timer1.attachInterrupt(timerCallback); // Specify the function to be called on timer overflow
}
void timerCallback() {
  // Perform time-sensitive tasks here
}

Переполнение функции millis() может привести к неточностям в чувствительных ко времени приложениях Arduino. Используя такие методы, как использование типа данных unsigned long, оператора modulo или специальных библиотек, мы можем эффективно обрабатывать переполнение millis(). Внедрение этих методов гарантирует, что ваши проекты Arduino сохранят точное время даже после длительных периодов работы.