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

Тема в разделе "Arduino & Shields", создана пользователем moskovskiy82, 15 ноя 2015.

  1. moskovskiy82

    moskovskiy82 Нерд

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

    Radius Гик

    У вас в самом начале определено: int rele1_state = HIGH; // the current state of the output pin.
    Если хотите чтобы после включения питания реле 2 было выключено, то определите int rele1_state = LOW;