// Данный код выполняет действие с периодом 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/