Повторяющиеся задачи на Arduino
По моим ощущениям, практически каждый проект на Arduino использует один и тот же шаблон — нужно выполнять некие действия с периодом, отличающимся от периода основного цикла. Это может быть опрос каких-нибудь датчиков, обновление информации на экране, отправка результатов и т. п. К примеру, некто хочет считывать показания датчика температуры один раз в пять секунд. Сопутствующий кусок кода будет выглядеть примерно так:
#define TEMP_PERIOD 5000
unsigned long lastExecution = 0;
void loop() {
unsigned long now = millis();
if (now > (lastExecution + TEMP_PERIOD)) {
readTemperature();
lastExecution = now;
}
}
Знакомо, не правда ли? Мне тоже. Если же, паче чаяния, нужно выполнять несколько разных задач с разными периодами, то код довольно быстро превращается в трудночитаемую кашу. Поэтому я написал небольшую библиотеку RecurringTask, состоящую всего из пары очень простых шаблонных функций. Она позволяет обернуть требуемый код всего парой строк и получить тот же самый результат:
#include <RecurringTask.h>
void loop()
{
RecurringTask::interval(TEMP_PERIOD, []() {
readTemperature();
});
}
Доступны две функции — interval
и every
. Первая выполняет переданный код через заданное количество миллисекунд, а вторая — после заданного количества итераций основного цикла.
Код библиотеки доступен на github, а при использовании PlatformIO в свой проект ее можно добавить просто указав название библиотеки в зависимостях platformio.ini
.