Помогите доработать код контролера для инкубатора

Тема в разделе "Флудилка", создана пользователем Vadim-13, 9 мар 2016.

  1. Vadim-13

    Vadim-13 Нуб

    Здравствуйте, Я начинающий перепеловод и решил модернизировать свой старенький инкубатор с помощью Ардуино. Сделать авто переворот, включение и выключение вентилятора с определенной периодичностью времени, регулирование температуры и влажности относительно показаний датчиков.

    И так что я имею:

    - Arduino UNO
    - 4-х канальный модуль реле 12В 10А
    - Arduino датчик влажности и температуры GY-21 HTU21
    - Блок питания на 12 В

    И вот такой код:

    Код (C++):

    #include "HTU21D.h" // датчик
    #define tPIN 7 // Пин управления температурой
    #define hPIN 6 // Пин управления влажностью
    HTU21D myHumidity;
    int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
    int temp = 37.5; //Желаемая
    int hStatus = HIGH;//// определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
    int hum = 55; // Желаемая влажность
    class Flasher
    {
      // Переменные - члены класса
      // Инициализируются при запуске
      int ledPin; // номер пина со светодиодом
      long OnTime; // время включения в миллисекундах
      long OffTime; // время, когда светодиод выключен
      // Текущее состояние
      int ledState; // состояние ВКЛ/ВЫКЛ
      unsigned long previousMillis; // последний момент смены состояния
      // Конструктор создает экземпляр Flasher и инициализирует
      // переменные-члены класса и состояние
      public:
      Flasher(int pin, long on, long off)
      {
       ledPin = pin;
       pinMode(ledPin, OUTPUT);
       OnTime = on;
       OffTime = off;
       ledState = LOW;
       previousMillis = 0;
      }
      void Update()
      {
       // выясняем не настал ли момент сменить состояние светодиода
       unsigned long currentMillis = millis(); // текущее время в миллисекундах
       if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
       {
         ledState = LOW; // выключаем
         previousMillis = currentMillis; // запоминаем момент времени
         digitalWrite(ledPin, ledState); // реализуем новое состояние
       }
       else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
       {
         ledState = HIGH; // выключаем
         previousMillis = currentMillis ; // запоминаем момент времени
         digitalWrite(ledPin, ledState); // реализуем новое состояние
       }
      }
    };

    Flasher led1(11, 1000, 4000);
    Flasher led2(12, 3500, 3500);

    void setup()
    {
      myHumidity.begin();// Инициализируем датчик
      Serial.begin(9600); // Инициализируем COM-порт
      Serial.println("HTU21D Example!");

    pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
    pinMode(hPIN, OUTPUT);
     
    }
    void loop()
    {
      float h = myHumidity.readHumidity();// Считываем влажность
      float t = myHumidity.readTemperature();// Считываем температуру
      tStatus = (t < temp) ? LOW:HIGH; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
    digitalWrite(tPIN, tStatus);
    if (h < hum) hStatus = LOW; else hStatus = HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
    digitalWrite(hPIN, hStatus);
      delay(1000); // Задержка в 1 секунду
    Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.println(h);
    // Отправляем информацю о климате на COM-порт
      led1.Update();
      led2.Update();

     
    Прошу Вашей помощи в модернизации кода. Может что-то не так и он не будет правильно работать?
     

    Вложения:

  2. Sindbad

    Sindbad Гик

    В общем случае, определить, правильно ли работает программа, можно единственным способом - запустить и проверить. На форум же имеет смысл выносить конкретные вопросы.

    В данном случае, Вы хотя бы откомпилировать программу пробовали? Похоже, нет. Иначе конкретные вопросы и должны были появиться.
     
  3. Vadim-13

    Vadim-13 Нуб

    Программа компиляции поддаётся, вопрос у меня по delay(1000); // Задержка в 1 секунду не будет ли это тормозить запуск остальных программ - поворот, вкл вентилятора? и как это можно исправить?
     
  4. Sindbad

    Sindbad Гик

    Непосредственно для работы инкубатора, одна секунда это скорее мало, а не много. Вряд ли разумно каждую секунду принимать решение о включении или выключении вентилятора. В этом смысле, действия инкубатора как раз _нужно_ будет тормозить.
    Если включение вентилятора производится через реле, то длительность delay() на его работу никак не влияет. А вот если Вы шаговый двигатель собираетесь крутить из основного цикла программы, то delay() придется убрать.

    Другое дело, что delay() повлияет на работу объектов Flasher. Способ решения уже есть в вашем алгоритме - вместо delay() используйте для вычисления времени задержки функцию millis().
     
  5. ИгорьК

    ИгорьК Гуру

    Маловато будет. Нужны еще часы реального времени RTC. Процесс же длится достаточное время, насколько помню, по курам - 22 дня?
    Подогрев делать с управлением реле, (скорее всего???), ошибка. Греете лампочками? Лучше использовать что-то из тиристоров.
    Скоро закончу свою версию инкубатора, выложу. На видео у меня день длится 5 секунд. Отрабатывается автоматическая смена целевой температуры - справа внизу.

     
    Vadim-13 нравится это.
  6. Vadim-13

    Vadim-13 Нуб

    У меня маленький инкубатор на 140 перепелиных и 50 куриных яиц, грею теном с нихромовою нитю, Я не особо то и электрик - так любитель, но думаю реле 200 ватную нагрузки выдержит. Нащет часов - тоже думал купить но в программировании Ардуино пока не селен, только учусь. А контролер у Вас супер получится может и я когда то смогу так программировать ))
     
  7. ИгорьК

    ИгорьК Гуру

    Реле 200-ваттную нагрузку выдержит. Но вот контакты реле будут постоянно щелкать. Безостановочно. У меня нагрузка 160 ватт - 4 лампочки по 40 ватт. Сделал фазовое управление через тиристор. Здесь уже выкладывал решение. Но что-то найти не могу. Мне казалось, что в этой теме.
    Очень надеюсь, что в ближайшее время выложу проект. Там нет поворота яиц и управления влажностью, но, думаю, это будет несложно добавить.
    Сейчас дисплей выглядит так. Вверху - режим, день, целевая температура. Внизу - два термометра и средняя.
    447788.jpg
    Два DS18b20 рядом с лампочкой измеряют температуру, а псевдо PID регулятор ее поддерживает.
     
  8. Vadim-13

    Vadim-13 Нуб

    А
    А как устроен PID регулятор?
     
  9. ИгорьК

    ИгорьК Гуру

    Никак не устроен - это программное решение. Вот здесь я его делал.
    Обратите внимание, как точно он держит температуру на фото: целевая и текущая средняя - равны.
     
    Последнее редактирование: 10 мар 2016
  10. ИгорьК

    ИгорьК Гуру

  11. Vadim-13

    Vadim-13 Нуб

    Нууу... можно сказать что понял)) Попробую дополнить свой код еще и PID регулятором. Насколько я понял PID регулятор можно только при подключении через тиристор, не могли бы Вы подсказать какой выбрать?
     
  12. ИгорьК

    ИгорьК Гуру

    Там же схема есть.
     
  13. Vadim-13

    Vadim-13 Нуб

    Все нашел )) Спасибо, по такому же принципу можно организовать и управление влажностью.+ добавить переворот по времени.
     
  14. Vadim-13

    Vadim-13 Нуб

    А при отключении счетчик дней не сбивается?
     
  15. ИгорьК

    ИгорьК Гуру

    Нет. И температура не сбивается.
     
  16. Vadim-13

    Vadim-13 Нуб

    Доброго всем дня. Собрал я регулятор для инкубатора и столкнулся с проблемой ( скетч выше ) все работает поначалу нормально точного времени не помню примерно через часов 5-6 происходит глюк Ардуино зависает на какой то команде ( переворот, включение вентилятора или обогрева по разному). С чем может бить связана эта проблема. Питание блока реле и Ардуино от одного блока питания, к реле подключено 2 по 220 В (обогрев, поворот) 1-12 В ( вентилятор), 1-24 В (установка туман)
     
  17. Vadim-13

    Vadim-13 Нуб

    Ааа еще заметил, но нужно точно проверить-когда питание на поворот лотков отключено сутки работает все нормально.
     
  18. Tomasina

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

    Попробуй их разделить. GND всех блоков питания надо соединить.