Есть код ниже. 4 кнопки. 2 реле (готовая плата с 2мя реле) 1 реле light работает на включение/выключение 2 реле работает от кнопок in_30mr и in_60mr замыкая контакты на определенное время Код вроде работает нормально кроме первого старта. После старта реле 2 замкнуто. Из-за этого начать нормальную работу надо два раза нажать in_30mr или in_60mr (вкл/выкл). Ней пойму где ошибка Код (C++): int in_pwr = 3; int pwr_rst = 9; int in_light = 5; // the number of the input pin int out_light = 4; // the number of the output pin int in_30mr = 6; int in_60mr = 7; // the number of the input pin int out_rele = 8; // the number of the output pin int light_state = HIGH; // the current state of the output pin int light_reading; // the current reading from the input pin int light_previous = LOW; // the previous reading from the input pin int rele_state = HIGH; // the current state of the output pin int rele1_state = HIGH; // the current state of the output pin int run30; int run60; int in_30mr_state = HIGH; int in_30mr_reading; int in_30mr_previous; int in_60mr_state = HIGH; int in_60mr_reading; int in_60mr_previous; long time = 0; // the last time the output pin was toggout long debounce = 50; // the debounce time, increase if the output flickers unsigned long previousMillis = 0; long tm_30m = 15000; long tm_60m = 40000; void setup() { //BUTTONS pinMode(in_pwr, INPUT_PULLUP); pinMode(in_light, INPUT_PULLUP); pinMode(in_30mr, INPUT_PULLUP); pinMode(in_60mr, INPUT_PULLUP); //OUTPUT pinMode(out_light, OUTPUT); pinMode(out_rele, OUTPUT); pinMode(pwr_rst, OUTPUT); Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); light_reading = digitalRead(in_light); in_30mr_reading = digitalRead(in_30mr); in_60mr_reading = digitalRead(in_60mr); if (light_reading == HIGH && light_previous == LOW && millis() - time > debounce) { if (light_state == LOW) { light_state = HIGH; Serial.println("LIGHT OFF"); } else { light_state = LOW; Serial.println("LIGHT ON"); time = millis(); } } //PROVERAEM KAK DOLGO RABOTAET VITYAZKA if (run30 && rele_state == LOW && (currentMillis - previousMillis >= tm_30m)) { rele_state = HIGH; digitalWrite(out_rele, rele_state); rele1_state = HIGH; previousMillis = currentMillis; Serial.println("MILLIS RELE OFF"); } if (run60 && rele1_state == LOW && (currentMillis - previousMillis >= tm_60m)) { rele_state = HIGH; rele1_state = HIGH; digitalWrite(out_rele, rele1_state); previousMillis = currentMillis; Serial.println("MILLIS RELE1 OFF"); } //======================END========================= /////////////////////////KNOPKA1 if (in_30mr_reading == HIGH && in_30mr_previous == LOW && millis() - time > debounce) { if (rele_state == LOW) { rele_state = HIGH; digitalWrite(out_rele, rele_state); run30 = false; Serial.println("RELE OFF"); } else { rele_state = LOW; digitalWrite(out_rele, rele_state); run30 = true; run60 = false; Serial.println("RELE ON"); previousMillis = millis(); time = millis(); } } /////////////////////////KNOPKA2 if (in_60mr_reading == HIGH && in_60mr_previous == LOW && millis() - time > debounce) { if (rele1_state == LOW) { rele1_state = HIGH; digitalWrite(out_rele, rele1_state); run60 = false; Serial.println("RELE1 OFF"); } else { rele1_state = LOW; digitalWrite(out_rele, rele1_state); run60 = true; run30 = false; previousMillis = millis(); Serial.println("RELE1 ON"); time = millis(); } } digitalWrite(out_light, light_state); // digitalWrite(out_rele, rele_state); // digitalWrite(out_rele, rele1_state); light_previous = light_reading; in_30mr_previous = in_30mr_reading; in_60mr_previous = in_60mr_reading; }
У вас в самом начале определено: int rele1_state = HIGH; // the current state of the output pin. Если хотите чтобы после включения питания реле 2 было выключено, то определите int rele1_state = LOW;