Андрей Овчаров

маленькое невинное хобби

Повторяющиеся задачи на 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.