// Данный код выполняет действие с периодом PERIOD на время WORK_TIME, эдакий свернизкочастотный ШИМ // Банально автополив // Нам нужно задать период таймера В МИЛЛИСЕКУНДАХ // дней*(24 часов в сутках)*(60 минут в часе)*(60 секунд в минуте)*(1000 миллисекунд в секунде) // (long) обязательно для больших чисел, иначе не посчитает // можно посчитать на калькуляторе, но какбэ ардуино и есть калькулятор, пусть считает... unsigned long period_time = (long)5*24*60*60*1000; unsigned long work_time = 10000; // время, на которое ну скажем включится лампочка #define TIMER_START 0 // 1 - отсчёт периода с момента ВЫКЛЮЧЕНИЯ лампочки, 0 - с ВКЛЮЧЕНИЯ // переменная таймера, максимально большой целочисленный тип (он же uint32_t) unsigned long period_timer, work_timer; boolean work_flag; void setup() { period_timer = millis(); // "сбросить" таймер } void loop() { if ((long)millis() - period_timer > period_time) { period_timer = millis(); // "сбросить" таймер периода work_timer = millis(); // сбросить таймер выполнения work_flag = true; // начали выполнение // включить лампу, помпу, реле, что угодно // банально digitalWrite(пин, HIGH) } if ( ((long)millis() - work_timer > work_time) && work_flag) { work_flag = false; // сброс флага на выполнение // можно сбросить таймер периода ПОСЛЕ выполнения задачи. Подумайте над этим! if (TIMER_START) period_timer = millis(); // выключить лампу, помпу, реле, что угодно // банально digitalWrite(пин, LOW) } if (work_flag) { // а вот этот блок кода выполняется всегда, пока мы находимся по времени "внутри" WORK_TIME } }
Ссылка на источник: https://alexgyver.ru/arduino-algorithms/