Здравствуйте, Я начинающий перепеловод и решил модернизировать свой старенький инкубатор с помощью Ардуино. Сделать авто переворот, включение и выключение вентилятора с определенной периодичностью времени, регулирование температуры и влажности относительно показаний датчиков. И так что я имею: - 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(); Прошу Вашей помощи в модернизации кода. Может что-то не так и он не будет правильно работать?
В общем случае, определить, правильно ли работает программа, можно единственным способом - запустить и проверить. На форум же имеет смысл выносить конкретные вопросы. В данном случае, Вы хотя бы откомпилировать программу пробовали? Похоже, нет. Иначе конкретные вопросы и должны были появиться.
Программа компиляции поддаётся, вопрос у меня по delay(1000); // Задержка в 1 секунду не будет ли это тормозить запуск остальных программ - поворот, вкл вентилятора? и как это можно исправить?
Непосредственно для работы инкубатора, одна секунда это скорее мало, а не много. Вряд ли разумно каждую секунду принимать решение о включении или выключении вентилятора. В этом смысле, действия инкубатора как раз _нужно_ будет тормозить. Если включение вентилятора производится через реле, то длительность delay() на его работу никак не влияет. А вот если Вы шаговый двигатель собираетесь крутить из основного цикла программы, то delay() придется убрать. Другое дело, что delay() повлияет на работу объектов Flasher. Способ решения уже есть в вашем алгоритме - вместо delay() используйте для вычисления времени задержки функцию millis().
Маловато будет. Нужны еще часы реального времени RTC. Процесс же длится достаточное время, насколько помню, по курам - 22 дня? Подогрев делать с управлением реле, (скорее всего???), ошибка. Греете лампочками? Лучше использовать что-то из тиристоров. Скоро закончу свою версию инкубатора, выложу. На видео у меня день длится 5 секунд. Отрабатывается автоматическая смена целевой температуры - справа внизу.
У меня маленький инкубатор на 140 перепелиных и 50 куриных яиц, грею теном с нихромовою нитю, Я не особо то и электрик - так любитель, но думаю реле 200 ватную нагрузки выдержит. Нащет часов - тоже думал купить но в программировании Ардуино пока не селен, только учусь. А контролер у Вас супер получится может и я когда то смогу так программировать ))
Реле 200-ваттную нагрузку выдержит. Но вот контакты реле будут постоянно щелкать. Безостановочно. У меня нагрузка 160 ватт - 4 лампочки по 40 ватт. Сделал фазовое управление через тиристор. Здесь уже выкладывал решение. Но что-то найти не могу. Мне казалось, что в этой теме. Очень надеюсь, что в ближайшее время выложу проект. Там нет поворота яиц и управления влажностью, но, думаю, это будет несложно добавить. Сейчас дисплей выглядит так. Вверху - режим, день, целевая температура. Внизу - два термометра и средняя. Два DS18b20 рядом с лампочкой измеряют температуру, а псевдо PID регулятор ее поддерживает.
Никак не устроен - это программное решение. Вот здесь я его делал. Обратите внимание, как точно он держит температуру на фото: целевая и текущая средняя - равны.
Нууу... можно сказать что понял)) Попробую дополнить свой код еще и PID регулятором. Насколько я понял PID регулятор можно только при подключении через тиристор, не могли бы Вы подсказать какой выбрать?
Все нашел )) Спасибо, по такому же принципу можно организовать и управление влажностью.+ добавить переворот по времени.
Доброго всем дня. Собрал я регулятор для инкубатора и столкнулся с проблемой ( скетч выше ) все работает поначалу нормально точного времени не помню примерно через часов 5-6 происходит глюк Ардуино зависает на какой то команде ( переворот, включение вентилятора или обогрева по разному). С чем может бить связана эта проблема. Питание блока реле и Ардуино от одного блока питания, к реле подключено 2 по 220 В (обогрев, поворот) 1-12 В ( вентилятор), 1-24 В (установка туман)
Ааа еще заметил, но нужно точно проверить-когда питание на поворот лотков отключено сутки работает все нормально.