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

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

  1. Tomasina

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

    вот код, который корректно обрабатывает проблемную ситуацию, описанную в #47.
    P.S. код менять полностью, весь скетч!
    Код (C++):
    #include <Wire.h>                                   //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
    #include <RTClib.h>
    RTC_DS3231 rtc;

    #define ON                    LOW         // метка для включения реле (поставить 1, если реле управляется высоким уровнем)
    #define OFF                   HIGH        // метка для отключения реле (поставить 0, если реле управляется высоким уровнем)
    #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 наступает полная темнота
    };
    unsigned int eventTime[EVENTS];           // массив для хранения хеша времени наступления события

    void setup() {
      Wire.begin();
      Serial.begin(9600);
      pinMode(Relay1, OUTPUT);                 //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
      pinMode(Relay2, OUTPUT);                 //Инициализируем порт для ВТОРОГО канала как ВЫХОД
      digitalWrite(Relay1, HIGH);              //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
      digitalWrite(Relay2, HIGH);              //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой
      for (byte event = 0; event < EVENTS; event++)
        eventTime[event] = 60 * shedule[event][0] + shedule[event][1];  // рассчитываем хеши времени наступления событий
    }

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

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

        case LIGHT_MIDDLE:
          Serial.println("LIGHT_MIDDLE");
          digitalWrite(Relay1, ON);
          digitalWrite(Relay2, OFF);
          break;
      } // конец switch
    }


    void loop()
    {
      DateTime now = rtc.now();
      unsigned int currentTime = now.hour() * 60 + now.minute(); // рассчитываем хеш текущего времени (уникальный для каждой минуты в сутках)

      // ============== вывод данных в консоль
      char buffer[80];
      sprintf(buffer, "\n%d:%02d \t\t\t(currentTime = %d)", now.hour(), now.minute(), currentTime );
      Serial.println(buffer);
      for (byte event = 0; event < EVENTS; event++)
      {
        sprintf(buffer, "Shedule%d = %d:%02d \t(eventTime%d = %d)", event, shedule[event][0], shedule[event][1], event, eventTime[event] );
        Serial.println(buffer);
      }
      // ============================

      byte counter = 0;
      for (byte event = 0; event < EVENTS; event++) if (currentTime >= eventTime[event]) counter++;
      if (counter == 0) relayManager(LIGHT_OFF);
      else relayManager(shedule[counter - 1][2]);
      delay (5000); // временно для отладки, чтобы не мелькало на экране
    }
     
    Securbond и NeAndryxa нравится это.
  2. NeAndryxa

    NeAndryxa Нерд

    Спасибо огромное, код отлично работает но я изменил
    Код (C++):
      case LIGHT_ON:
          Serial.println("LIGHT_ON");
          digitalWrite(Relay1, OFF);
          digitalWrite(Relay2, ON);
          break;
    иначе оба реле включены одновременно
     
  3. Tomasina

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

    Ну да. Это я на светиках тренировался ;)
     
  4. NeAndryxa

    NeAndryxa Нерд

    Выражаю огромную благодарность Tomasina и всем неравнодушным.
    Я успешно автоматизировал освещение в курятнике и прилагаю скетч и фото.
    IMG_20161126_122341.jpg IMG_20161126_122452.jpg IMG_20161126_122154.jpg IMG_20161126_122414.jpg
     

    Вложения:

    ИгорьК нравится это.
  5. NeAndryxa

    NeAndryxa Нерд

    Оставил так же как у вас, т.к. решил вместо лампочек использовать светодиодные ленты.
     
  6. Tomasina

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

    С этим поосторожнее, там видимый спектр отличается от привычного курам (особенно много синего в лентах "холодного свечения", которых на фото большинство).
    [​IMG]
    [​IMG]
    Птицы гораздо более восприимчивы к красному и синему излучению, чем человек. Разные части спектра оказывают влияние на разные процессы в организме птицы. Неслучайно для кур-несушек предпочтительнее освещение красным светом, для бройлеров – сине-зеленым.
    К тому же, перейдя на ленты, вы почти полностью лишили кур ИК-излучения (это и безсквозняковый обогрев, и комфорт).
     
  7. NeAndryxa

    NeAndryxa Нерд

    До моей инсталляции работала одна энергосберегайка на 55W холодного белого, куры неслись 1 яйцо от 1 курицы в сутки (как летом), ну а сейчас понаблюдаем, если будет плохо то не долго и rgb ленту купить но думаю нынешних ленточек будет достаточно. Сейчас заказал еще плату ардуино и пару мосфетов продолжу как получу эксперименты с ШИМ.
     
  8. Tomasina

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

    RGB точно не надо - будет еще хуже.
     
  9. orbb

    orbb Нуб

    Здравствуйте. Я хотел бы повторить ваш проект. Но при загрузке в ардуину появляются ошибки. Пробовал раскомментировать код rtc , затем вернул обратно, но безрезультатно... в чем ошибка? в работе с ардуино новичок...
     

    Вложения:

  10. b707

    b707 Гуру

    не трогайте код, с кодом у вас все в порядке, на картинках видно что компиляция проходит успешно.
    Проблема при загрузке, причин может быть масса
    - не стоят драйвера ардуино
    - не выбран правильный порт
    - не выбрана правильная плата
    - плохой usb кабель
    - проблемы с самой ардуиной
     
  11. orbb

    orbb Нуб

    драйверы стоят.
    порт выбран верный
    плату выбрать пробовал и Arduino Nano и Arduino mini Pro
    usb кабель - нормальный, со своего телефона информацию через него на комп скидываю, он фирменный
    насчет проблем с ардуиной - врядли, так как пробовал 2 разных на 328-м чипе.

    Ругается на код - что-то типа "код никогда не будет исполнен".
    p.s. кнопку RESET на плате ардуино пробовал нажимать сразу после компиляции - но безрезультатно.
     
  12. orbb

    orbb Нуб

    вы больше не вносили изменений в код?
     
  13. orbb

    orbb Нуб

    всем спасибо, у меня в итоге получилось. Попались бракованные релейные модули. Сделал на мощных полевых транзисторах с компьютерных материнских плат. в коде поменял "LOW" на "HIGH". Плату ардуино использовал Arduino Mini Pro, скетч залил при помощи cp201x.
     
  14. orbb

    orbb Нуб

    только так и не понял, как управление временем получилось в скетче автора.
    в часы DS3231 время залил при помощи скетча, найденного в интернете.

    #include <DS1307RTC.h>
    #include <Time.h>
    #include <Wire.h>
    void setup() {
    setSyncProvider(RTC.get);
    setTime(14,40,0,22,01,2021);
    RTC.set(now());
    }
    void loop() {
    delay(100);
    }