// Данный код выполняет действие с периодом PERIOD на время WORK_TIME, эдакий свернизкочастотный ШИМ
// Банально автополив
// Нам нужно задать период таймера В МИЛЛИСЕКУНДАХ
#if defined (ESP32)
//do one thing
#define Red 26
#define Blue 22
#elif defined(ARDUINO_ARCH_ESP8266)
//do another
#define Red 6
#define Blue 2
#else
#error Architecture unrecognized by this code.
#endif
//unsigned long period_time = (long)5*24*60*60*1000; //5 дней
unsigned long period_time = (long)10*1000; //10 сек
unsigned long work_time = 3*1000; // время, на которое ну скажем включится лампочка 10 сек
#define TIMER_START 0 // 1 - отсчёт периода с момента ВЫКЛЮЧЕНИЯ лампочки, 0 - с ВКЛЮЧЕНИЯ
unsigned long period_timer, work_timer;
boolean work_flag;
void setup() {
Serial.begin(115200);
pinMode(Red, OUTPUT); //светодиод
pinMode(Blue, OUTPUT); //светодиод
period_timer = millis(); // сбросить таймер периода
}
void loop() {
if ((long)millis() - period_timer > period_time) {
period_timer = millis(); // сбросить таймер периода
work_timer = millis(); // сбросить таймер выполнения
work_flag = true; // начали выполнение
digitalWrite(Red, HIGH); // включить лампу, помпу, реле, что угодно (т.е. разовое выполнение)
}
if (((long)millis() - work_timer > work_time) && work_flag) {
work_flag = false; // сбросить флаг на выполнение
if (TIMER_START) period_timer = millis(); // сбросить таймер периода (можно ПОСЛЕ выполнения задачи. Подумайте над этим!
digitalWrite(Red, LOW); // выключить лампу, помпу, реле, что угодно (т.е. разовое выполнение)
}
if (work_flag) {
Serial.println(millis()); //постоянное выполнение "внутри" work_time
}
delay(100);
}