Периодическое выполнение за длинный период на указанное время

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