Терморегулятор для инкубатора на arduino mega .

В интернете очень легко купить терморегулятор для инкубатора в множестве разновидностей и вариантов исполнения, так зачем огород городить?

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

Инкубатор как искуственная квочка.

Инкубатор можно применть для самых различных пернатых, для простоты восприятия информации и чтобы не делать какой-то научный трактат, предлагаю ограничиться рассмотрением вопроса на примере температурно — влажностного режима цыплят, как, пожалуй, самых распространенных детенышей инкубатора.

Итак, идеальный с точки зрения яйца температурно — влажностный  режим перевода в состояние цыпленка.

 

инкубация цыплят
сутки инкубации температура влажность
1-3 38.1 60%
4-14 37.8 50%
15-18 37.6 55%
19-23 37.3 70%

Не трудно заметить, что  терморегулятор для инкубатора должен работать в очень ограниченном диапазоне температур, но точность поддержания температуры на уровне десятых долей градуса. И , если первое утверждение, облегчает инженерную задачу, то второе, ее сильно усложняет!

Дополнительные сложности проектирования инкубатора :

  • превышение температуры выше 39 градусов опасно  для зародышей и с большой долей вероятности приведет к гибели поголовья.
  • «задохлики» могут появиться и если температура яиц упадет ниже 34 градусов и это за всё время инкубации
  • терморегулятор для инкубатора должен обеспечивать быстрый набор температуры — особенно это важно в первые сутки инкубации непосредственно при закладке яиц

Техническое задание.

Переведём эти требования в техническое задание для проектирования терморегулятора для инкубатора:

  1. Жёсткий контроль за превышениями температуры выше заданной
  2. Резервное питание для предотвращения падения температуры ниже нормы
  3. Мощный нагревательный элемент
  4. Точный и стабильный датчик температуры

Поднимите руки те кто считает что терморегулятор для инкубатора за 15$ обладает вышепереисленными характеристиками.

Так что, при всём богатстве выбора……..будем делать терморегулятор для инкубатора своими руками. Естественно, максимально используя наработки ардуинщиков в своем проекте!

Датчик температуры DS18B20.

Датчик температуры DS18B20
Датчик температуры герметичный

Начнём с 4 пункта — в идеале, конечно, неплохо бы применть датчик температуры, который позволит измерять с точностью более 0.1 градуса и получать достоверную температуру, но, мы же инженеры!

Если подойти к вопросу творчески, то по большому счету, не слишком важно насколько соответствует полученная нашим датчиком температура, реальной! Важно, чтобы наш терморегулятор для инкубатора выдерживал ее с достаточной точностью.

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

Если убрать постоянную ошибку, то дельта нас вполне даже устроит! На этом и остановимся — внесем в программу коректировку показаний датчика измерив постфактум медицинским термометром температуру в инкубаторе .

Нагревательный элемент инкубатора.

автомобильная 12 вольтоваяя лампа накаливания
автомобильная лампа накаливания

Температурный диапазон в районе 37 градусов, позволяет с успехом применять в качестве нагревательных элементов обычные лампы накаливания.

Забегу чуток наперед — автономное питание приводит к тому, то есть смысл в применении автомобильных 12 вольтовых ламп накаливания например по 10 Ватт.

Требование быстрого набора температуры особенно, в момент когда в нагретый предварительно объём, помещаются относительно холодные теплоемкие яйца в момент закладки инкубатора, приводит к мощному нагревательному элементу, а требование к точности регулировки температуры исключает релейный способ регулирования и приводит нас к ПИД регулятору.

Емпирически, мощность нагревателя для инкубатора на примерно 50 яиц должна быть от 40 Ватт.

Терморегулятор для инкубатора своими руками.

Критически важным оказалось, является именно наличие:

  • Пропорционально Интегрально Дифференционального регулирования нагрева
  • Мощного нагревательного элемента
  • Резервного питания
  • Строгое ограниение превышения порога заданной температуры
  • Защита от дурака

Что я имею ввиду под защитой от дурака — можно сделать идеальное многоуровневое красивое меню с удобным заданием режима и выходом из меню после установки всех параметров, но более важным является непрерывная работа терморегулятора для инкубатора даже во время регулировки и отсутствие сервисного режима когда терморегулятор не выполняет функцию регулирования.

Это слегка бесит во время задания температуры, но зато, даже во время установки режима происходит регулирование и невозможно забыть нажать какую-то кнопку для перехода в рабочий режим — как только Вы отпустили кнопку — заданное значение температуры записано в ЕЕПРОМ и даже если отсутствует резервное питание, как только вернется напряжение, терморегулятор для инкубатора сам перезапустится, считает предустановленное значение температуры из внутренней энергонезависимой памяти и начнет отрабатывать ошибку.

Ограниение превышения заданной температуры.

ПИД регулятор подбирается к заданной точке плавно —  волнообразно , что очень легко может привести к превышению критической температуры и последующее появление «задохликов» поэтому наш  терморегулятор для инкубатора отключает нагревательный элемент полностью при превышении порога заданной температуры больше чем на 0.2 градуса. Это делает ПИД регулирование несимметричным и корявым, существенно увеличивает время вхождения ПИД регулятора в режим, но так ли это важно для конечного результата? А вот отсутствие критического превышения температуры, очень важно для успешного инкубирования.

ПИД регулятор.

Зачем , кстати, именно ПИД регулятор? Не сильно вдавась в теорию, можно обьснить просто — чем меньше мощность нагревательного элемента, тем плавнее будет происходить регулирование температуры, а принцип пропорционально интегрально дифференционального регулирования , предполагает установку такой мощности нагревателя, при которой тепловая системма находится в равновесии — то есть — мы с помощью ШИМ регулируем мощность нагревателя.

arduino mega
arduino mega

К слову, в оригинал  ПИД регуятора, который взят за основу терморегулятора для инкубатора, внесены изменения в часть кода отвечающую и за 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 нужно догрузить библиотеки, они собраны на отдельной странице сайта.