Ошибка в коде реле
- Войдите на сайт для отправки комментариев
Вс, 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);
Работает великолепно