Мой первый инкубатор был коробкой из пенопласта, лампой на 40 ватт и термостатом из прошлого урока, перенесённым туда почти без правок. На четвёртые сутки я полез проверять кладку бытовым термометром и чуть не сел на пол: датчик показывал 37,8, а термометр, лежавший на яйцах, — 40,3. Два дня я честно крутил пороги по показаниям датчика, тем самым поднимая и поднимая реальную температуру в коробе. Виноват оказался не датчик и не скетч — виновато место: сенсор висел у щели дверцы, где гулял сквозняк, и каждый опрос врал в холодную сторону.
Инкубатор отличается от гаража ценой ошибки. Куриные яйца держат 37,8 °C с допуском примерно 37,5–38,0: ниже 36,0 эмбрион замирает, выше 39,0 гибнет за считаные часы — перегрев убивает быстрее недогрева, и эта асимметрия диктует всю автоматику. Влажность первые 18 дней держат 50–55 %, на выводе поднимают до 65–75, яйца переворачивают 4–6 раз в сутки. Сбоя датчика на полчаса здесь не прощают: скетч обязан знать, что делать, когда показаний нет.
В этом уроке перенесём термостат на инкубаторные константы, поставим два предохранителя — реакцию на сбой сенсора и таймер непрерывного нагрева — и разберём силовую часть: почему лампа мягче ТЭНа и когда механическое реле стоит поменять на твердотельное. Выбор сенсора здесь не обсуждается: сравнение DHT11 и DHT22 заканчивается однозначно, потому что у DHT11 погрешность ±2 °C шире всего инкубационного коридора.
Лампа, реле и искры: силовая часть инкубатора
Лампа накаливания — недооценённый нагреватель: 40 ватт в пенопластовом коробе на два десятка яиц дают мягкий, предсказуемый нагрев с готовым индикатором — светится, значит работает. Коммутируем её релейным модулем, и вот здесь начинается разница между комнатным проектом и инкубатором. Механическое реле при каждом переключении даёт микродугу, а короб замкнут: наводки и искры оседают на питании, и платы в инкубаторах регулярно уходят в перезагрузку в самый неподходящий момент — авторы таких проектов в итоге почти поголовно переезжают на твердотельные реле.
Твердотельное реле — ключ на оптопаре и симисторе: щелчка нет, искры нет, наводок нет. Граница моего мнения такая: на лампе 40 ватт выживет и обычный релейный модуль, если питание Arduino взять отдельным проводом и развести земли аккуратно. Но с нагревателем от 100 ватт и выше, а также когда короб ночует без присмотра, я ставлю только твердотельное: дороже на пару сотен рублей, греется само и просит радиатор, зато перезагрузок нет.
И правило, которое старше всех Arduino: у термостата должен быть начальник. Биметаллический аварийный терморегулятор на пару градусов выше рабочей границы, в разрыве нагревателя, спасёт кладку, когда зависнет loop, залипнет контакт или датчик отвалится вместе с кронштейном. Скетч — не защита от скетча.
| Параметр | Значение | Почему так |
|---|---|---|
| Температура | 37,8 °C, допуск 37,5–38,0 | выше 39,0 зародыши гибнут быстрее, чем ниже 36,0 — перегрев опаснее |
| Влажность, дни 1–18 | 50–55 % | вода в ванночке; следит тот же DHT22 |
| Влажность, на выводе | 65–75 % | долить ванночку; на крышке появится конденсат |
| Переворот яиц | 4–6 раз в сутки | вручную; автоматизация — отдельный проект с сервоприводом |
| Опрос датчика | раз в 2 секунды | быстрее DHT22 не отвечает — только nan |
Термостат, который не верит одному показанию
Коридор здесь узкий: 37,6–38,0, всего 0,4 °C, и это осознанный риск. Шум DHT22 между опросами — 0,1–0,3 °C, коридор перекрывает его впритык, зато обе границы лежат внутри безопасной вилки. Расплата за узость — редкие лишние щелчки реле: контакты переживут, а зародыш скажет спасибо. Именно поэтому в инкубаторе нельзя экономить на сенсоре: паспортные ±0,5 °C — это больше половины коридора, и каждый лишний градус погрешности ломает всю арифметику.
Второе отличие от гаража — реакция на пустое показание. В гараже nan означал «пропусти и подожди»: комната переживёт две секунды без решений. В инкубаторе пустое показание означает «я не знаю, 37,8 там или 40,2» — и единственный безопасный ответ: не греть. Правило «не знаю — не грею» звучит дико для бытовой логики, но перегрев убивает быстрее холода, и при сомнении выбор всегда в сторону недогрева. Откуда nan берётся и как его ловить — уже разобрано в уроке про диагностику nan; здесь мы просто ставим это знание на страже кладки.
#include "DHT.h" #define DHTPIN 2#define DHTTYPE DHT22#define RELAY 7 #define T_ON 37.6#define T_OFF 38.0#define RUN_LIMIT 150 // 150 чтений по 2 с = 5 минут непрерывного нагрева DHT dht(DHTPIN, DHTTYPE); int heat = 0;int run = 0; // сколько чтений подряд греем void setup() { Serial.begin(9600); pinMode(RELAY, OUTPUT); digitalWrite(RELAY, LOW); dht.begin(); Serial.println("start: incubator 37.6-38.0");} void loop() { float t = dht.readTemperature(); if (isnan(t)) { heat = 0; // не знаю — не грею run = 0; Serial.println("err=sensor"); } else { if (t < T_ON) heat = 1; else if (t > T_OFF) heat = 0; if (heat == 1) run = run + 1; else run = 0; if (run == RUN_LIMIT) Serial.println("alarm=heater-stuck"); } digitalWrite(RELAY, heat == 1 ? HIGH : LOW); Serial.print("t="); Serial.println(t); Serial.print("heat="); Serial.println(heat); Serial.print("run="); Serial.println(run); delay(2000);}Здесь три уровня защиты, и все умещаются в двадцать строк. Первый — обычный гистерезис: ниже 37,6 нагреватель включается, выше 38,0 выключается, в коридоре держится решение. Второй — ветка isnan: если датчик не ответил, нагреватель принудительно выключается, а в мониторе появляется err=sensor — по частоте этих строк видно, умирает ли линия данных раз в неделю или раз в минуту.
Третий уровень — таймер непрерывного нагрева. Если реле греет дольше пяти минут, а температура так и не перевалила за верхнюю границу, что-то не так: лампа перегорела и короб остывает, дверь приоткрыли, реле залипло в замкнутом состоянии. Скетч не может починить это сам, но может закричать: на пороге счётчика печатается alarm=heater-stuck — строку, которую в домашнем проекте я дублирую зуммером. Пятнадцать чтений, которые вы увидите в симуляторе, в жизни я ставлю равными пяти минутам — тем самым 150 чтениям.
Датчик на высоте яиц: половина успеха
В коробе живёт градиент: у лампы воздух на три градуса теплее, чем в центре лотка, у стенки на градус холоднее. Датчик обязан измерять то место, за которое мы отвечаем, — высоту яиц, — а не удобный угол. Мой монтаж после той истории: сенсор на уровне середины лотка, экран между ним и лампой из картона с фольгой, провод без натяга. Критерий правильности не «кажется, нормально», а число: показания датчика и бытового термометра, лежащего на яйцах, должны разойтись меньше чем на полградуса.
Сам сенсор тоже греется: DHT22 потребляет пару миллиампер и прогревает собственный корпус на десятые доли градуса — в комнате незаметно, а в узком коридоре инкубатора каждая десятая на счету. Поэтому не заворачивайте датчик в пенопласт наглухо и не сажайте его на прямую линию от лампы: воздух мимо сенсора должен гулять, но не горячий. Поверку я делаю раз в сезон: аптечный термометр рядом с датчиком на час, расхождение больше полуградуса — сенсор в утиль.
Влажность на выводе подскочит до 65–75 %, и на внутренней стороне крышки выступят капли — это не поломка, а точка росы в действии; что за явление и как его считать — в уроке про точку росы. Обе цифры крупно, прямо на коробе, показывает термогигрометр на LCD — он собирается за вечер из деталей этого же урока.
- Поставьте RUN_LIMIT 150 и убедитесь, что в масштабах симулятора тревога стала недостижимой — так это выглядит в жизни, где короб сам идёт в рост от лампы.
- Добавьте вторую вилку: если t держится выше 38,5 при выключенном нагревателе три чтения подряд, печатайте warn=overheat — признак чужого тепла в коробе.
- Прикрутите к термостату счётчик щелчков из прошлого урока: при щелчке раз в четыре минуты за 21 день инкубации набегает около семи с половиной тысяч переключений — прикиньте, что узкий коридор делает с ресурсом контактов.
- 1. Датчик не ответил, readTemperature вернул nan. Что делает правильный инкубаторный термостат?
- 2. Почему для инкубатора советуют твердотельное реле вместо механического?
- 3. Куда ставить датчик в инкубаторе?
- 4. Почему коридор инкубатора 0,4 °C, хотя в гараже я держал 2 °C?
- 5. Нагреватель включён дольше лимита, но коридор не нарушен. О чём кричит alarm=heater-stuck?
- 37,8 °C с коридором 37,6–38,0; перегрев выше 39,0 опаснее недогрева, поэтому любое сомнение — в сторону выключенного нагревателя.
- «Не знаю — не грею»: ветка isnan выключает нагреватель и оставляет err=sensor в мониторе.
- Таймер непрерывного нагрева ловит перегоревшую лампу и открытую дверь: дольше лимита — alarm=heater-stuck.
- Лампу до 40 Вт тянет обычное реле при разведённом питании; от 100 Вт и для ночных смен — твердотельное, а над скетчем — биметаллический аварийный терморегулятор.
- Датчик — на высоте яиц, вдали от лампы и сквозняков; поверка аптечным термометром раз в сезон, расхождение больше полуградуса — замена.
Термостат инкубатора — это гаражный термостат с двумя предохранителями и переносом датчика на высоту яиц. Ни один из приёмов не уникален для инкубации: таймер непрерывной работы и правило «не знаю — не грею» я потом переиспользовал в насосе теплицы, о которой пойдёт речь в следующем уроке про влажность и полив. Силовая часть с реле и 220 вольтами разобрана в уроке про релейный модуль: если короб будет жить в сарае без присмотра, перечитайте его перед монтажом.
И про скромность цифр. ±0,5 °C у DHT22 — это паспорт, а не гарантия конкретного экземпляра: клоны плавают в обе стороны. Поверка аптечным термометром занимает час и стоит ноль рублей, а после неё коридор 37,6–38,0 перестаёт быть верой и становится измерением. Инкубатор — как раз тот случай, где полградуса между верой и измерением стоят кладки.
Частые вопросы по теме урока
- Датчик не ответил, readTemperature вернул nan. Что делает правильный инкубаторный термостат?
- «Не знаю — не грею»: перегрев убивает кладку быстрее недогрева, греть по устаревшему значению в этой игре нельзя. Ветку видно в мониторе по строкам err=sensor. Выключает нагреватель и ждёт честного показания
- Почему для инкубатора советуют твердотельное реле вместо механического?
- Микродуга механического реле в замкнутом пенопластовом коробе роняет питание платы, и проекты инкубаторов после пары таких ночей переезжают на твердотельное реле. Плата за тишину — цена и радиатор. Оно не даёт искр и наводок, от которых Arduino в замкнутом коробе уходит в перезагрузку
- Куда ставить датчик в инкубаторе?
- Мерить нужно то место, за которое отвечаем, — высоту яиц. Мой сенсор у щели дверцы показывал 37,8, пока на яйцах было 40,3: два дня честной подстройки порогов в ту самую сторону. На высоте середины лотка с яйцами, вдали от прямого потока лампы и сквозняков
- Почему коридор инкубатора 0,4 °C, хотя в гараже я держал 2 °C?
- Коридор 0,4 °C чуть шире межопросного шума DHT22, и обе его границы лежат внутри безопасной вилки. Расплата — редкие лишние щелчки; это дешевле, чем плавать на два градуса вокруг цели. Потому что цена ошибки велика, а шум DHT22 позволяет узкий коридор внутри безопасной вилки
- Нагреватель включён дольше лимита, но коридор не нарушен. О чём кричит alarm=heater-stuck?
- Если нагрев включён, а температура не дошла до верхней границы за весь лимит — тепло не выделяется или уходит наружу. Дальше ждать бессмысленно, строка в мониторе — повод идти смотреть руками. Короб не греется от нагревателя: перегорела лампа, открыли дверь или залипло реле