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

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

  1. NeAndryxa

    NeAndryxa Нерд

    заказывать ничего не нужно, мне не понятно что я упустил а точнее как сделать чтобы при прохождении следующего loop программа не читала условие которое по времени уже прошло
     
  2. NeAndryxa

    NeAndryxa Нерд

    сделал вот как и опять тоже самое при выполнении третьего задания диод горит в пол накала... думаю может return дописать куда нибудь чтобы пропускать одно условие после его отработки

    Код (C++):
    #include <Wire.h>

    #define DS1307_I2C_ADDRESS 0x68

    int second;
    int minute;
    int hour;

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

    int hour_on_r1 = 15;
    int hour_off_r1 = 15;

    int minute_on_r1 = 30;
    int minute_off_r1 = 33;

    int hour_on_r2 = 15;
    int hour_off_r2 = 15;

    int minute_on_r2 = 32;
    int minute_off_r2 = 35;

    int hour_on_r3 = 15;
    int hour_off_r3 = 15;

    int minute_on_r3 = 34;
    int minute_off_r3 = 37;

    ///////////  часы  /////////////////////

    byte decToBcd(byte val) {
      return ( (val / 10 * 16) + (val % 10) );
    }

    byte bcdToDec(byte val) {
      return ( (val / 16 * 10) + (val % 16) );
    }

    void get_time()
    {
      Wire.beginTransmission(104);
      Wire.write(0);
      Wire.endTransmission();
      Wire.requestFrom(104, 3);
      second = bcdToDec(Wire.read() & 0x7f);
      minute = bcdToDec(Wire.read());
      hour = bcdToDec(Wire.read() & 0x3f);
    }


    void setup()
    {
      Wire.begin();

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

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


    }

    void loop()
    {
      get_time();

      if (hour >= hour_on_r1 && minute >= minute_on_r1)
      {
        digitalWrite(RelayChn1,LOW); //  включаем
      }
      if (hour >= hour_off_r1 && minute >= minute_off_r1)
      {
        digitalWrite(RelayChn1,HIGH);  //  выключаем
      }
       if (hour >= hour_on_r2 && minute >= minute_on_r2)
      {
        digitalWrite(RelayChn2,LOW); //  включаем
      }
      if (hour >= hour_off_r2 && minute >= minute_off_r2)
      {
        digitalWrite(RelayChn2,HIGH); //  выключаем
      }
       if (hour >= hour_on_r3 && minute >= minute_on_r3)
      {
        digitalWrite(RelayChn1,LOW); //  включаем
      }
      if (hour >= hour_off_r3 && minute >= minute_off_r3)
      {
        digitalWrite(RelayChn1,HIGH);  //  выключаем
      }
    }

     
     
  3. Onkel

    Onkel Гуру

    похоже логика нужна примерно такая
    Если( восхд <время И время<закат)
    Вкл
    Else
    Выкл
    И также по 2 светильнику
     
  4. NeAndryxa

    NeAndryxa Нерд

    спасибо за пинок в нужном направлении, сейчас попробую
     
  5. Onkel

    Onkel Гуру

    Обращайтесь. За пиночком дело не встанет.
     
  6. NeAndryxa

    NeAndryxa Нерд

    попробовал заполнить промежуток между срабатываниями реле условием чтобы реле между включениями был off, второе включение так отработало так же (диод в пол накала), уже мозг в раскоряку
     
  7. NeAndryxa

    NeAndryxa Нерд

    родилась идея попробовать goto (применимо к изначальному скетчу с юникс временем), поставить условие веред первым условием включения чтобы если время было больше (время вкл + продолжительность+1минута) /*состояние реле офф*/ то goto на второе условие...
     
  8. alp69

    alp69 Форумчанин

    Можете схему устройства выложить? Мне не совсем понятно как одним реле управлять двумя нагрузками.
     
    Последнее редактирование: 2 ноя 2016
  9. Tomasina

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

    либо одна включена, либо другая. Выключить обе невозможно :)
     
  10. alp69

    alp69 Форумчанин

    Так вот я и удивляюсь. Пробежал по всем постам и вижу два варианта задачи:
    1. Попеременная работа и режим "выкл".
    2. Попеременно-совместная работа и режим "выкл".
    И все это одним реле? :eek:
    Что-то у меня не складывается. Поэтому и прошу схему. А может это прорыв в радиотехнике! :D
     
  11. Tomasina

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

    есть еще Главный Рубильник ;)

    Вообще, исходно реле у ТС два.
    И рулить ими можно двумя способами, с обеспечением заданного функционала:

    1) рассвет - включаем "тусклое" реле, ждем, выключаем "тусклое" реле и включаем "яркое" реле.
    закат - выключаем "яркое" реле, включаем "тусклое" реле, ждем, выключаем "тусклое" реле.

    2) рассвет - включаем "тусклое" реле, ждем, включаем "яркое" реле, которое второй парой своих контактов тупо обрубает питание "тусклому" реле.
    закат - выключаем "яркое" реле (т.к. программно "тусклое" реле еще активировано, то автоматом включится "тусклое" реле), ждем, выключаем "тусклое" реле.

    Второй способ проще программно, первый более гибок в части настройки "как хочу,так и верчу".
     
    Последнее редактирование: 2 ноя 2016
  12. alp69

    alp69 Форумчанин

    Или так:
    Рассвет - подали первым реле питание на коммутирующие контакты второго реле. Закат - сняли питание. А а промежутке вторым реле выбираем нужную нагрузку.

    Еще хочу посмотреть схему потому, что имхуется мне, что проблема может быть железная, а не только софтовая. Особенно по поводу подключения релейного модуля.
     
  13. Tomasina

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

    можно и так, но тут недостаток в плане надежности: при неисправности одного из реле света не будет вообще.
    А в моем случае даже в худшем варианте будет неяркая подсветка.
     
  14. alp69

    alp69 Форумчанин

    Не... только если первое помрет.
     
  15. Tomasina

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

    ИМХО, что вы к реле привязались? Реле - это лишь инструмент, а рулить надо понятием "событие" (расписание, если так более понятно).
    Код (C++):
    #define ON                    1           // метка для включения реле (поставить 0, если реле управляется низким уровнем)
    #define OFF                   0           // метка для отключения реле (поставить 1, если реле управляется низким уровнем)
    #define EVENTS                4           // количество событий в сутки
    enum {LIGHT_OFF, LIGHT_ON, LIGHT_MIDDLE}; // перечисляем возможные события (состояния системы)

    // Само расписание (каждая строка состоит из 3-х элементов: час, минута, событие)
    byte shedule[EVENTS][3] = {
      7,  0,  LIGHT_MIDDLE,                   // в 7:00 включаем неяркую подсветку
      9,  30, LIGHT_ON,                       // в 9:30 включаем подсветку на полную (тусклая отключается автоматом, поэтому нефиг засорять расписание)
      19, 45, LIGHT_MIDDLE,                   // в 19:45 включаем неяркую подсветку (яркая отключается автоматом, поэтому нефиг засорять расписание)
      21, 15, LIGHT_OFF,                      // в 21:15 наступает полная темнота
    };
    в loop() соответственно ставим проверку времени:
    Код (C++):
      for (byte event = 0; event < EVENTS; event++)
        if (hour  >= shedule[event, 0]
        && minute >= shedule[event, 1])
           { relayManager(shedule[event, 2]); } // если время совпало, передаем в функцию третий параметр расписания
    и появляется "умная" функция управления реле:
    Код (C++):
    // входной параметр - событие (одно из 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
    }
    При такой архитектуре пофиг сколько там реле и сколько раз в сутки они включаются. Есть событие и есть время выполнения этого события. Время пришло - событие выполняется.
    Можно хоть трижды в день устраивать "сумерки" - достаточно добавить только новые строчки в расписание, больше ничего не надо править.
     
    Последнее редактирование: 2 ноя 2016
    Securbond нравится это.
  16. alp69

    alp69 Форумчанин

    Не к реле привязался. К схеме. Светодиод "вполнакала" наталкивает на мысли о железных проблемах. Кроме того реле, ссылку на которые дает ТС, имеют особенность подключения.
    Поэтому и прошу схему, чтобы не гадать на кофейной гуще.
     
  17. NeAndryxa

    NeAndryxa Нерд

    По просьбам. Не удобно когда разница во времени с Москвой 6 часов, пока сплю идет обсуждение)))
     

    Вложения:

  18. NeAndryxa

    NeAndryxa Нерд

    Собрал все в кучу, что сказал Tomasina но видимо со считыванием времени где то ошибся хотя компиляцию проходит на ура...

    Код (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 включаем подсветку на полную (тусклая отключается автоматом, поэтому нефиг засорять расписание)
      12, 50, LIGHT_MIDDLE,                   // в 19:45 включаем неяркую подсветку (яркая отключается автоматом, поэтому нефиг засорять расписание)
      21, 15, LIGHT_OFF,                      // в 21:15 наступает полная темнота
    };

    void setup() {
      Wire.begin();

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


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

    void loop() {
      DateTime now = rtc.now();  

       for (byte event = 0; event < EVENTS; event++)
        if (now.hour()  >= shedule[event, 0] && now.minute () >= shedule[event, 1])
           { relayManager(shedule[event, 2]); } // если время совпало, передаем в функцию третий параметр расписания
    }
    // входной параметр - событие (одно из 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
    }
     
  19. alp69

    alp69 Форумчанин

    Нда... мало это похоже на схему. Ну да ладно. Сразу навскидку видно отсутствие контакта между пинами SGND и GND на каждом релейном модуле. Это рекомендовано производителем.
    Или подайте внешние 5 вольт на модули реле. Тогда перемычка не нужна. Только GND модулей и Ардуины нужно будет соединить. Этот вариант более предпочтителен.
     
  20. NeAndryxa

    NeAndryxa Нерд

    Перемычки стоят, когда буду уже собирать схему все запитаю от БП от компа но отдельно (реле будут только управляться от ардуины а питание от БП)