Ошибка в коде реле
- Войдите на сайт для отправки комментариев
Вс, 15/11/2015 - 16:45
Есть код ниже. 4 кнопки.
2 реле (готовая плата с 2мя реле)
1 реле light работает на включение/выключение
2 реле работает от кнопок in_30mr и in_60mr замыкая контакты на определенное время
Код вроде работает нормально кроме первого старта.
После старта реле 2 замкнуто. Из-за этого начать нормальную работу надо два раза нажать in_30mr или in_60mr (вкл/выкл).
Ней пойму где ошибка
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;
Нехватает инициализации состояния выходных пинов в setup. Там только инициализация направления работы. По умолчанию состояние LOW - вот и приходится 2 раза жать кнопки.
Попробуйте в void setup() установить нужное Вам значение для Вашего реле. Например: digitalWrite(out_rele, LOW);
Спасибо!
В сетапе -
digitalWrite(out_rele, HIGH);
Работает великолепно