Асинхронный таймер в Arduino

21.05.2019 20:29

genaonyx



Введение

Рано или поздно каждый Ардуинщик создает свой первый скетч, где сталкивается с проблемой функции delay(), а именно то, что она работает в блокирующем режиме и полностью останавливает работу микроконтроллера на указанный промежуток времени. А ведь в этот момент мы можем или должны (по логике скетча) использовать ресурсы микроконтроллера для различных подсчетов, работы с периферией или модулями.

И в этот момент нам на помощь приходят асинхронные таймеры.

Асинхронные таймеры – это таймеры, работа которых не блокирует работу основного цикла программы (скетча), и позволяющие нам удобно и самое главное вовремя выполнить нужные нам действия не мешая основной логике программы (скетча).

Основным применением асинхронных таймеров можно назвать вывод данных на экран. Как правило, LCD дисплеи или другие аналогичные устройства не способны обновлять данные на своем экране больше 10-30 раз в секунду (большего в принципе и не надо), следовательно, нам нет необходимости в каждом цикле обновлять экран, а освободившееся время потратить на более полезную работу. Или в вашем проекте используются светодиодные ленты, и вы хотите реализовать различные эффекты смены цветов или яркости светодиодов. И таких примеров куча и маленькая тележка, все зависит от фантазии и умений ардуинщика.

Далее выложен пример реализации простейшего асинхронного таймера.


Пример

// Переменная, хранящая время.
unsigned long Time1 = 0;

// Функция реализующая асинхронный таймер.
bool Timer(uint32_t *startTime, uint32_t period)
{
  uint32_t currentTime = millis();
  bool result = (currentTime >= *startTime) ? currentTime >= *startTime + period : currentTime >= 4294967295 - *startTime + period;
  if (result) *startTime = currentTime;
  return result;
}

// Запуск скетча.
void setup()
{
  // Настройка 13-го порта как выход.
  pinMode(13, OUTPUT);
}

// Основной цикл скетча.
void loop()
{
  // Мерцание светодиодом раз в секунду.
  if (Timer(&Time1, 1000)) digitalWrite(13, !digitalRead(13));
}


Описание

И так, в данном скетче реализована функция Timer являющаяся нашим асинхронным таймером.

Для ее работы необходимо завести переменную, в нашем случае это Time1 (Типа unsigned long). Переменная эта содержит время последнего срабатывания таймера в миллисекундах. Для работы функции ей необходимо передать ссылку на переменную Time1, а так же период срабатывания таймера в миллисекундах (в нашем случае это 1000 миллисекунд или 1 секунда). И на этом все, раз в секунду таймер будет срабатывать и заставлять светодиод то включаться то выключатся.

Если вам необходимо два разных таймера, например один должен срабатывать раз в секунду, а другой раз в 200мс, то для этого необходимо завести вторую переменную, например Timer2 и так же выполнить функцию Timer передав ей переменную Timer2 и период равный 200.



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.