В интернете очень легко купить терморегулятор для инкубатора в множестве разновидностей и вариантов исполнения, так зачем огород городить?
Обратимся на какое-то время к теории так, чтобы понять и зачем вообще нужен терморегулятор для инкубатора и какими характеристиками он должен обладать.
Инкубатор как искуственная квочка.
Инкубатор можно применть для самых различных пернатых, для простоты восприятия информации и чтобы не делать какой-то научный трактат, предлагаю ограничиться рассмотрением вопроса на примере температурно — влажностного режима цыплят, как, пожалуй, самых распространенных детенышей инкубатора.
Итак, идеальный с точки зрения яйца температурно — влажностный режим перевода в состояние цыпленка.
сутки инкубации | температура | влажность |
---|---|---|
1-3 | 38.1 | 60% |
4-14 | 37.8 | 50% |
15-18 | 37.6 | 55% |
19-23 | 37.3 | 70% |
Не трудно заметить, что терморегулятор для инкубатора должен работать в очень ограниченном диапазоне температур, но точность поддержания температуры на уровне десятых долей градуса. И , если первое утверждение, облегчает инженерную задачу, то второе, ее сильно усложняет!
Дополнительные сложности проектирования инкубатора :
- превышение температуры выше 39 градусов опасно для зародышей и с большой долей вероятности приведет к гибели поголовья.
- «задохлики» могут появиться и если температура яиц упадет ниже 34 градусов и это за всё время инкубации
- терморегулятор для инкубатора должен обеспечивать быстрый набор температуры — особенно это важно в первые сутки инкубации непосредственно при закладке яиц
Техническое задание.
Переведём эти требования в техническое задание для проектирования терморегулятора для инкубатора:
- Жёсткий контроль за превышениями температуры выше заданной
- Резервное питание для предотвращения падения температуры ниже нормы
- Мощный нагревательный элемент
- Точный и стабильный датчик температуры
Поднимите руки те кто считает что терморегулятор для инкубатора за 15$ обладает вышепереисленными характеристиками.
Так что, при всём богатстве выбора……..будем делать терморегулятор для инкубатора своими руками. Естественно, максимально используя наработки ардуинщиков в своем проекте!
Датчик температуры DS18B20.

Начнём с 4 пункта — в идеале, конечно, неплохо бы применть датчик температуры, который позволит измерять с точностью более 0.1 градуса и получать достоверную температуру, но, мы же инженеры!
Если подойти к вопросу творчески, то по большому счету, не слишком важно насколько соответствует полученная нашим датчиком температура, реальной! Важно, чтобы наш терморегулятор для инкубатора выдерживал ее с достаточной точностью.
То есть — в диапазоне от 36,5 до 40 градусов цельсия нам нужна точность поддержания температуры выше 0,2 градуса цельсия. Если изучить даташит DS18B20, то на первый взгляд , тоность измерения +- 0.5 градуса, но это точность абсолютного показателя температуры, то есть при температуре в 37.5 датчик может выдать от 37.0 до 38.0 градусов. Температурный дрейф же, находится в пределах 0.1 градуса.
Если убрать постоянную ошибку, то дельта нас вполне даже устроит! На этом и остановимся — внесем в программу коректировку показаний датчика измерив постфактум медицинским термометром температуру в инкубаторе .
Нагревательный элемент инкубатора.

Температурный диапазон в районе 37 градусов, позволяет с успехом применять в качестве нагревательных элементов обычные лампы накаливания.
Забегу чуток наперед — автономное питание приводит к тому, то есть смысл в применении автомобильных 12 вольтовых ламп накаливания например по 10 Ватт.
Требование быстрого набора температуры особенно, в момент когда в нагретый предварительно объём, помещаются относительно холодные теплоемкие яйца в момент закладки инкубатора, приводит к мощному нагревательному элементу, а требование к точности регулировки температуры исключает релейный способ регулирования и приводит нас к ПИД регулятору.
Емпирически, мощность нагревателя для инкубатора на примерно 50 яиц должна быть от 40 Ватт.
Терморегулятор для инкубатора своими руками.
Критически важным оказалось, является именно наличие:
- Пропорционально Интегрально Дифференционального регулирования нагрева
- Мощного нагревательного элемента
- Резервного питания
- Строгое ограниение превышения порога заданной температуры
- Защита от дурака
Что я имею ввиду под защитой от дурака — можно сделать идеальное многоуровневое красивое меню с удобным заданием режима и выходом из меню после установки всех параметров, но более важным является непрерывная работа терморегулятора для инкубатора даже во время регулировки и отсутствие сервисного режима когда терморегулятор не выполняет функцию регулирования.
Это слегка бесит во время задания температуры, но зато, даже во время установки режима происходит регулирование и невозможно забыть нажать какую-то кнопку для перехода в рабочий режим — как только Вы отпустили кнопку — заданное значение температуры записано в ЕЕПРОМ и даже если отсутствует резервное питание, как только вернется напряжение, терморегулятор для инкубатора сам перезапустится, считает предустановленное значение температуры из внутренней энергонезависимой памяти и начнет отрабатывать ошибку.
Ограниение превышения заданной температуры.
ПИД регулятор подбирается к заданной точке плавно — волнообразно , что очень легко может привести к превышению критической температуры и последующее появление «задохликов» поэтому наш терморегулятор для инкубатора отключает нагревательный элемент полностью при превышении порога заданной температуры больше чем на 0.2 градуса. Это делает ПИД регулирование несимметричным и корявым, существенно увеличивает время вхождения ПИД регулятора в режим, но так ли это важно для конечного результата? А вот отсутствие критического превышения температуры, очень важно для успешного инкубирования.
ПИД регулятор.
Зачем , кстати, именно ПИД регулятор? Не сильно вдавась в теорию, можно обьснить просто — чем меньше мощность нагревательного элемента, тем плавнее будет происходить регулирование температуры, а принцип пропорционально интегрально дифференционального регулирования , предполагает установку такой мощности нагревателя, при которой тепловая системма находится в равновесии — то есть — мы с помощью ШИМ регулируем мощность нагревателя.

К слову, в оригинал ПИД регуятора, который взят за основу терморегулятора для инкубатора, внесены изменения в часть кода отвечающую и за PWM что привело к увеличению частоты ШИМ и отсутствию мерцания ламп нагрева (может это и лишнее, но почему бы и нет, ресурс позволяет)
Перспективы усовершенствования исходя из опыта эксплуатации.
Думаю, это не финальная версия терморегулятора для инкубатора, в следующей программе скорее всего будет добавлена :
- карта температуры и влажности для нескольких видов инкубируемых пернатых — температура будет в зависимости от суток инкубации браться с энергонезависимой памяти
- дополнительный стартовый мощный с питанием от сети нагревательный элемент
- управление увлажнителем
- управление автоматическим поворотом яиц
- автоматическое проветривание
- регулирование 4 автономных вентиляторов по 4 отдельным датчикам температуры, так как получается даже в таком небольшом обьёме и при постоянной работе кулеров, все равно на уровне закладки яиц существует перепад температуры в несколько десятых градуса.
Но это уже следующая история, пока есть такая версия и такая программа. Наш терморегулятор для инкубатора умеет точно поддерживать заданную температуру, индицирует влажность, сутки инкубации, исклюает шоковые температуры для инкубируемых яиц и не зависает, максимально ограничивает пользователю возможность «накосячить» во время эксплуатации.
Скетч для записи в ардуину.
Скетч доступен для скачивания с сайта непосредственно либо в виде текстового файла:
// Farik 14.05.2022 // https://farion.top/termoregulyator-dlya-inkubatora/ // потужність нагріву регулюється PWM // регулювання темератури відбувається по ПІД принципу // датчик температуры DS18B20 // датчик вологості DHT #include <EEPROM.h> #include <LiquidCrystal.h> #include <PID_v1.h> #include <microDS18B20.h> MicroDS18B20<49> sensor2; // датчик на 49 #include <iarduino_DHT.h> // подключаем библиотеку для работы с датчиком DHT iarduino_DHT sensor(48); // объявляем переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик (сейчас 48pin) LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define B A1 // #define KEY A2 // #define TEMP_MAX 39.7 // діапазон настройки термостата #define TEMP_MIN 36.6 unsigned long f_day; // змінна для визначення скільки діб від закладки яєць static char day[3]; // массив символів для виводу на єкран кількості діб static char power[2]; // массив символів для виводу на єкран потужності нагріву int i_power = 100; // PWM для нагрівача float f_power; float Temperature = 37.5; // змінна температури float Tempkoeff = - 0.7; // коррекція похибки температури DS18B20 static char l_Temp[4]; // массив символів для виводу на єкран температури static char l_hum[2]; // масив вологості double Setpoint; double Input, Output; double Kp=200, Ki=50, Kd=2.5; PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); void setup() { TCCR1A = 0b00000011; // 10bit TCCR1B = 0b00000001; // x1 phase correct pinMode(11, OUTPUT); // шим выход на МОП транзистор 8 КГц pinMode(48, INPUT); // цифровий вхід датчику вологості та темератури DHT-11 pinMode(49, INPUT); // цифровий вхід датчику темератури DS18B20 pinMode(97, INPUT); // цифровий вхід енкодера pinMode(96, INPUT); // цифровий вхід енкодера pinMode(95, INPUT); // цифровий вхід енкодера Serial.begin(9600); lcd.begin(16, 2); Serial.begin(9600); // проверка ЕЕПРОМ для первого включения if (EEPROM.read(0) == 255 && EEPROM.read(4) == 255){ EEPROM.write(0, 10); EEPROM.write(1, 0); EEPROM.write(2, 240); EEPROM.write(3, 65); } EEPROM.get(0, Setpoint); myPID.SetOutputLimits(0, WindowSize); myPID.SetMode(AUTOMATIC); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Temp"); lcd.setCursor(8, 0); lcd.print("\xDF""C"); lcd.setCursor(11, 0); lcd.print("W="); lcd.setCursor(15, 0); lcd.print("%"); lcd.setCursor(0,1); lcd.print("Damp"); lcd.setCursor(6, 1); lcd.print("%"); lcd.setCursor(10, 1); lcd.print("day"); lcd.setCursor(14, 1); f_day = 1 + millis()/86400000; // яка доба йде з моменту закладки яєць dtostrf(f_day,2, 0, day); // всього 2 знаки після коми нуль знаків lcd.print(day); f_power = i_power; dtostrf(f_power*100/255,2, 0, power); lcd.setCursor(13, 0); lcd.print(power); // процент від максимальної потужності нагрівача // читаем прошлое значение if (sensor2.readTemp()) Serial.println(sensor2.getTemp()); else Serial.println("error"); sensor2.requestTemp(); // запрашиваем новое измерение Temperature = sensor2.getTemp(); dtostrf(=Temperature,3, 1, l_Temp); lcd.setCursor(4, 0); lcd.print(l_Temp); // масив виводу температури на єкран sensor.read(); // читаем показания датчика DHT dtostrf(sensor.hum,2, 0,l_hum); lcd.setCursor(4, 1); lcd.print(l_hum); // вологість //---------------обробка енкодера----------------- if(!digitalRead(KEY)) // если надавили на кнопку, входим в настройки { Serial.println(Setpoint); lcd.clear(); lcd.setCursor(13, 1); lcd.print("<<"); lcd.setCursor(0, 0); lcd.print(" Temperature"); lcd.setCursor(1, 1); lcd.print(Setpoint); // управление lcd.setCursor(7, 1); lcd.print("\xDF""C"); if (digitalRead(B) == LOW) { // якщо нажато кнопку мінус Setpoint -= .1; // зменшимо задану температуру if (Setpoint < TEMP_MIN) Setpoint = TEMP_MIN; // проверяем пределы настроек } else { // якщо кнопка мінус не нажата Setpoint += .1; // збільшимо температуру if (Setpoint > TEMP_MAX) Setpoint = TEMP_MAX; // } } EEPROM.put(0, Setpoint); // пишeм в еепром настройку encoderPinALast = n; delay(5); } //---------------PID----------------- Input = Temperature; // читається з датчика температури DS18B20 myPID.Compute(); i_power = map(Output, 0, 255, 50, 255); // отриманий результат це період PWM ріжем знизуб бо при потужності // меньшій, наш нагріва не має ніякого сенсу - ККД нуль if ((Temperature - Setpoint) > 0.2 ) // перегрів дуже шкідливий може бути летальний випадок { // тому при перевищенні температури вимикаємо зовсім нагрів i_power = 0; } if ((Setpoint-Temperature ) > 2 ) // якщо температура дуже далеко від заданної може бути летальний випадок { // тому вмикаємо 100% нагрів i_power = 255; } Serial.print("температура "); Serial.println(Temperature); Serial.print("шим "); Serial.println(i_power); //---------------PID----------------- analogWrite(11,i_power); delay(3000); } i_power = 255; } Serial.print("температура "); Serial.println(Temperature); Serial.print("шим "); Serial.println(i_power); //---------------PID----------------- analogWrite(11,i_power); delay(3000); }
По правде говоря, можно выставить в программе
#define TEMP_MAX 38.1
#define TEMP_MIN 37.7
float Temperature = 37.9
тогда заданные пределы регулирования температуры будут гарантировать выводок, пусть и не в идеальных условиях инкубирования и с меньшим процентом выхода.
Техниеские детали, подробности для самостоятельного изготовления и описание применемых деталей у меня на сайте по ссылке терморегулятор для інкубатора
Для корректной работы скетча в Arduino IDE нужно догрузить библиотеки, они собраны на отдельной странице сайта.