Ошибка в коде реле

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

Есть код ниже. 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;

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Нехватает инициализации состояния выходных пинов в setup. Там только инициализация направления работы. По умолчанию состояние LOW - вот и приходится 2 раза жать кнопки.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте в void setup() установить нужное Вам значение для Вашего реле. Например: digitalWrite(out_rele, LOW);

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

Спасибо!

В сетапе -

 digitalWrite(out_rele, HIGH);

Работает великолепно