#define rele_pin 2
#define button_pin 3
#define rele_timer 5*1000
bool flag = false; // регестрируемое состояние кнопки
bool flag_long = false;
bool flag_state = false;// состояние реле
bool flag_state_short = false;// режим реле 1 -долгий
bool last_btnState = false; // регестрируемое состояние кнопки
uint32_t btnTimer = 0;
uint32_t releTimer = 0;
void setup() {
Serial.begin(9600);
pinMode(button_pin, INPUT_PULLUP);
pinMode(rele_pin, OUTPUT);
}
void loop() {
// читаем инвертированное значение для удобства
bool btnState = !digitalRead(button_pin);
if (last_btnState != btnState) { //изменилось состояние
btnTimer = millis();
last_btnState = btnState;
flag = true;
flag_long=true;
}
if (btnState && flag && millis() - btnTimer > 50) {//фиксируе нажатие
flag_state = !flag_state;
Serial.println(last_btnState);
flag = false;
flag_state_short=true; // устанавливаем короткий режим
releTimer=millis();
}
if (flag_state && flag_state_short && millis() -releTimer> rele_timer){// отключаем реле при коротком режиме
flag_state_short==false;
flag_state=false;
}
if (btnState && flag_long && millis() - btnTimer > 1000) {// фексируем длинное нажатие
flag_state = true;
flag_state_short=false; // устанавливаем долгий режим
Serial.println(2);
flag_long = false;
// Serial.println(String("flag_state=") + flag_state);
// digitalWrite(13, 1);
}
if (!btnState && flag && millis() - btnTimer > 50) { //фиксируем отпускание
// flag_state = false;
// btnTimer = millis();
flag = false;
flag_long=false;
Serial.println(last_btnState);
}
digitalWrite(rele_pin, flag_state);
}