Освещение в курятнике

Тема в разделе "Силовая электроника", создана пользователем NeAndryxa, 1 ноя 2016.

  1. Tomasina

    Tomasina Сушитель лампочек Модератор

    Добавь отладку:
    Код (C++):
    void setup()
    {
      Serial.begin(9600);
      Wire.begin();
    // далее как было
    }

    void loop()
    {
      DateTime now = rtc.now();
    // ============== вывод данных в консоль
      char buffer[80];
      sprintf(buffer, "\nTime = %d:%d", now.hour(), now.minute() );
      Serial.println(buffer);
       for(byte event =0; event < EVENTS; event++)
       {
          sprintf(buffer, "Shedule %d = %d:%d", event, shedule[event, 0], shedule[event, 1] );
          Serial.println(buffer);
        }
    // ============================
       for(byte event =0; event < EVENTS; event++)
       if(now.hour()>= shedule[event, 0] && now.minute()>= shedule[event, 1])
           { relayManager(shedule[event, 2]);}
    }
    Что покажет?
     
  2. NeAndryxa

    NeAndryxa Нерд

    Показывает
    Time = 17:10
    Shedule 0 = 256:259
    Shedule 1 = 256:259
    Shedule 2 = 256:259
    Shedule 3 = 256:259
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    хм, осталось понять откуда в расписании появляется 256 часов и 259 минут, тогда как должно быть 7 часов 0 минут :)
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    ага, мой косяк, давит наследие Паскаля.

    Вот как надо:
    Код (C++):
    sprintf(buffer, "Shedule %d = %d:%d", event, shedule[event][0], shedule[event][1] );
    Код (C++):
    if (now.hour() >= shedule[event][0] && now.minute() >= shedule[event][1])
     
  5. NeAndryxa

    NeAndryxa Нерд

    теперь в удобоваримом виде
    Time = 21:55
    Shedule 0 = 7:0
    Shedule 1 = 9:30
    Shedule 2 = 12:50
    Shedule 3 = 21:15

    но как не выставляй таймер ничего не происходит
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    странно, у меня условие if срабатывает корректно, надпись "Bingo!" появляется после 12:50.
    Вот весь код:
    Код (C++):

    #include <Wire.h>                                   //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
    #include <RTClib.h>
    RTC_DS3231 rtc;

    #define ON                    0           // метка для включения реле (поставить 0, если реле управляется низким уровнем)
    #define OFF                   1           // метка для отключения реле (поставить 1, если реле управляется низким уровнем)
    #define EVENTS                4           // количество событий в сутки


    const byte Relay1 = 11;                            //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
    const byte Relay2 = 12;                            //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля

    enum {LIGHT_OFF, LIGHT_ON, LIGHT_MIDDLE}; // перечисляем возможные события (состояния системы)


    // Само расписание (каждая строка состоит из 3-х элементов: час, минута, событие)
    byte shedule[EVENTS][3] = {
      7,  0,  LIGHT_MIDDLE,                   // в 7:00 включаем неяркую подсветку
      9,  30, LIGHT_ON,                       // в 9:30 включаем подсветку на полную (тусклая отключается автоматом, поэтому нефиг засорять расписание)
      12, 50, LIGHT_MIDDLE,                   // в 19:45 включаем неяркую подсветку (яркая отключается автоматом, поэтому нефиг засорять расписание)
      21, 15, LIGHT_OFF,                      // в 21:15 наступает полная темнота
    };

    void setup() {
      Wire.begin();
      Serial.begin(9600);
      pinMode(Relay1, OUTPUT);                       //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
      pinMode(Relay2, OUTPUT);                       //Инициализируем порт для ВТОРОГО канала как ВЫХОД
      digitalWrite(Relay1, OFF);                    //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
      digitalWrite(Relay2, OFF);                    //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой
    }

    void loop()
    {
      DateTime now = rtc.now();
      byte hh = 12; // временно для тестирования
      byte mm = 51; // временно для тестирования
      // ============== вывод данных в консоль
      char buffer[80];
      sprintf(buffer, "\nTime = %d:%d", now.hour(), now.minute() );
      Serial.println(buffer);
      for (byte event = 0; event < EVENTS; event++)
      {
        sprintf(buffer, "Shedule %d = %d:%d", event, shedule[event][0], shedule[event][1] );
        Serial.println(buffer);
      }
      // ============================
      for (byte event = 0; event < EVENTS; event++)
        //if (now.hour() >= shedule[event][0] && now.minute() >= shedule[event][1])
        if (hh >= shedule[event][0] && mm >= shedule[event][1])
        {
          Serial.print("Bingo!  ");
          relayManager(shedule[event][2]);
          break;
        }
      delay (3000);
    }


    // входной параметр - событие (одно из LIGHT_OFF, LIGHT_ON, LIGHT_MIDDLE)
    void relayManager(byte state)
    {
      switch (state)
      {
        case LIGHT_OFF:
          Serial.println("LIGHT_OFF");
          digitalWrite(Relay1, OFF);
          digitalWrite(Relay2, OFF);
          break;

        case LIGHT_MIDDLE:
          Serial.println("LIGHT_MIDDLE");
          digitalWrite(Relay1, ON);
          digitalWrite(Relay2, OFF);
          break;

        case LIGHT_ON:
          Serial.println("LIGHT_ON");
          digitalWrite(Relay1, ON);
          digitalWrite(Relay2, ON);
          break;
      } // конец switch
    }
     
     
    Последнее редактирование: 3 ноя 2016
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    но есть другой нюанс: например, текущее время 23:00, но свет не будет выключен, т.к. условие && now.minute() >= shedule[event][1] не выполняется.
    Короче, нефиг привязываться к часам и минутам, надо делать единое время, равное сумме часов и минут, прошедших с 0:00.
     
  8. NeAndryxa

    NeAndryxa Нерд

    закоминтил
    byte hh = 12; // временно для тестирования, т.к. у меня нет RTC
    byte mm = 51; // временно для тестирования
    и
    if (hh >= shedule[event][0] && mm >= shedule[event][1])
    раскоминтировав строчку выше
    вышло красиво

    Time = 22:21
    Shedule 0 = 7:0
    Shedule 1 = 9:30
    Shedule 2 = 22:0
    Shedule 3 = 22:25
    Bingo!
    Bingo!
    но реле молчат.
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    вставь весь мой код из #46, должно работать.
    if можно раскомментировать твой
     
  10. NeAndryxa

    NeAndryxa Нерд

    а я грешу на digitalWrite(Relay1, ON/OFF); ON/OFF же не дает ни HIGH ни LOW
     
  11. NeAndryxa

    NeAndryxa Нерд

    код из #46

    Time = 22:31
    Shedule 0 = 7:0
    Shedule 1 = 9:30
    Shedule 2 = 22:0
    Shedule 3 = 22:33
    Bingo!
    Bingo!
     
  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    ON - это 0, т.е. LOW (это определено в #define ON 0), так что тут все корректно.
     
  13. NeAndryxa

    NeAndryxa Нерд

    может тогда еще одно событие добавить c 00-00 до 7-00, с параметром офф
     
  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    лишнее. Покажите свой код.
     
  15. NeAndryxa

    NeAndryxa Нерд

    на что сейчас смотрю
    Код (C++):


    #include <Wire.h>                                   //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
    #include <RTClib.h>
    RTC_DS3231 rtc;

    #define ON                    1           // метка для включения реле (поставить 0, если реле управляется низким уровнем)
    #define OFF                   0           // метка для отключения реле (поставить 1, если реле управляется низким уровнем)
    #define EVENTS                4           // количество событий в сутки


    int Relay1 = 11;                            //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
    int Relay2 = 12;                            //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля

    enum {LIGHT_OFF, LIGHT_ON, LIGHT_MIDDLE}; // перечисляем возможные события (состояния системы)


    // Само расписание (каждая строка состоит из 3-х элементов: час, минута, событие)
    byte shedule[EVENTS][3] = {
      7,  0,  LIGHT_MIDDLE,                   // в 7:00 включаем неяркую подсветку
      9,  30, LIGHT_ON,                       // в 9:30 включаем подсветку на полную (тусклая отключается автоматом, поэтому нефиг засорять расписание)
      22, 0, LIGHT_MIDDLE,                   // в 19:45 включаем неяркую подсветку (яркая отключается автоматом, поэтому нефиг засорять расписание)
      22, 33, LIGHT_OFF,                      // в 21:15 наступает полная темнота
    };

    void setup() {
      Serial.begin(9600);
      Wire.begin();

      pinMode(Relay1, OUTPUT);                       //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
      pinMode(Relay2, OUTPUT);                       //Инициализируем порт для ВТОРОГО канала как ВЫХОД


      digitalWrite(Relay1, HIGH);                    //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
      digitalWrite(Relay2, HIGH);                    //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой
    }

    void loop() {
      DateTime now = rtc.now();
    byte hh = 22; // временно для тестирования, т.к. у меня нет RTC
    byte mm = 17; // временно для тестирования
    // ============== вывод данных в консоль
    char buffer[80];
      sprintf(buffer, "\nTime = %d:%d", now.hour(), now.minute() );
      Serial.println(buffer);
      for (byte event = 0; event < EVENTS; event++)
      {
        sprintf(buffer, "Shedule %d = %d:%d", event, shedule[event][0], shedule[event][1] );
        Serial.println(buffer);
      }
    // ============================

      for (byte event = 0; event < EVENTS; event++)
        if (now.hour() >= shedule[event][0] && now.minute() >= shedule[event][1])
    if (hh >= shedule[event][0] && mm >= shedule[event][1])
        {
          relayManager(shedule[event, 2]);
          Serial.println("Bingo!");
        }
      delay (2000);
    }
    // входной параметр - событие (одно из LIGHT_OFF, LIGHT_ON, LIGHT_MIDDLE)
    void relayManager(byte state)
    {
      switch (state)
      {
        case LIGHT_OFF:
          digitalWrite(Relay1, OFF);
          digitalWrite(Relay2, OFF);
          break;

        case LIGHT_MIDDLE:
          digitalWrite(Relay1, ON);
          digitalWrite(Relay2, OFF);
          break;

        case LIGHT_ON:
          digitalWrite(Relay1, ON);
          digitalWrite(Relay2, ON);
          break;
      } // конец switch
    }
     
  16. Tomasina

    Tomasina Сушитель лампочек Модератор

    в коде из #46:
    Код (C++):
          relayManager(shedule[event][2]);
    у вас:
    Код (C++):
          relayManager(shedule[event, 2]);
    :)
    И другие отличия есть
     
  17. NeAndryxa

    NeAndryxa Нерд

    я разява :( просмотрел. Да так работает
     
  18. NeAndryxa

    NeAndryxa Нерд

    Time = 23:3
    Shedule 0 = 7:0
    Shedule 1 = 9:30
    Shedule 2 = 22:0
    Shedule 3 = 23:2
    Bingo!
    Bingo!

    реле 2 не выключилось
     
  19. Tomasina

    Tomasina Сушитель лампочек Модератор

    break;
    проглядели в коде :)
     
  20. NeAndryxa

    NeAndryxa Нерд

    break'и убрал реле замолчали ))
    Time = 23:18
    Shedule 0 = 7:0
    Shedule 1 = 9:30
    Shedule 2 = 23:16
    Shedule 3 = 23:18
    Bingo!