Инкубатор
- Войдите на сайт для отправки комментариев
Доброго дня! Хочу представить вашему внимаю инкубатор, сделанный на основе ардуино. Инкубатор уже 3 раза сделал свое дело, все узлы прошли проверку.
Кратко опишу работу данных узлов. В качестве нагревателя, испольлзую две лампы накаливания мощностью 40 Вт. Две - т.к. при перегорании одной, вторая возьмет на себя всю работу. Питание их осуществляется в паралель с помощью ШИМа ардуино. Благодоря этому, регулируется мощность нагревателя в зависимости от температуры внутри инкубатора. Регулировка сделана с задержкой времени в 4 минуты, т.к. процес нагрева не может происходить мгновенно. Показания влажности снимает датчик DHT11, если она меньше заданной, то включается насос на 5 сек и в поддон качает воду. После этого, через час, снова снимаются показания. Каждые три часа мк дает сигнал на поворот яйц. Это осуществляется с помощью старого компьютерного дисковода (привода). Привод немного переделан, но суть таже - он либо выезжает, либо заезжает и тянет за собой сетку, в которой лежат яйца. Они катятся и переварачиваются. Внутри инкубатора постоянно работает большой куллер, он размешивает воздух, что бы температура была одинакова во всех углах коробки. Коробка склеена из пенопласта толщиной 50мм. Если кому интересны узлы или внейшний вид, напишите, сделаю фото. Может я не все расскрыл, спросите, с радостью отвечу.
По поводу программы. В ней все максимально упрощенно, нет ни какой EEPROM и иных допонительных модулей. Может кто скажет что это не правильно. Чем проще, тем надежнее. В программе можно проследить, после 14 дней инкубации необходимо включить проветривание и после 18 отключить поворот яиц. Это делается при соблюдение условия или день или включена кнопка. Это сделано для того, что бы была возможность долаживать яйца и держать температуру на нужной величине, так же в случаи отключения напряжения для продолжения работы необходимого цикла. Для МК предусмотрено резервное питание от батареи 9 В, в случаи пропадания основного.
#include "DHT.h" //датчик влажности и температуры DHT11
#define DHTPIN 4 //подключение к пину 4 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); #include <Wire.h> #include <BMP085.h> //датчик температуры BMP085 dps = BMP085(); #include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //дисплей подключение выводов const int ledPin = 13; // номер выхода светодиода для индикации счета времени long Temperature = 0; unsigned int b = 0; //переменная для хранения промежуточного значения температуры unsigned long time1 = 0; unsigned char i = 40; //переменная мощности нагревателя, в качестве нагревателя 2 лампочки по 40 Вт - объем камеры инкубации примерно 0,4 м^3 long prevmicros = 0;//переменная для хранения значений таймера unsigned char sek = 0;//значение секунд unsigned char minu = 0;//значение минут unsigned char m = 0; unsigned char chas = 0;//значение часов unsigned char den = 1; boolean counter = false; // счетчик для полусекунд unsigned int t = 378; // требуемая температура 37,8 C unsigned char H = 60; //требуемая влажность unsigned char povorot = 0; boolean p = 0; // поворот boolean r = 0; //режим инкубации до 18 дней - 0, после - 1 boolean j = 0; // переменная для кнопки unsigned char ventil = 0; void setup() { lcd.begin(16, 2); Wire.begin(); dht.begin(); //распиновка пинов-------------------------------------------------------- pinMode(ledPin, OUTPUT); pinMode(0, INPUT); // кнопка режима инкубации digitalWrite(0, HIGH); pinMode(1, INPUT); //кнопка включения проветривания digitalWrite(1, HIGH); pinMode(6, OUTPUT); //подключение ШИМ нагревателя pinMode(5, OUTPUT); //подключение вентилятора проветривания pinMode(3, OUTPUT); //поворот яиц pinMode(2, OUTPUT); //подключение насоса для поддержания влажности dps.init(MODE_STANDARD, 25000, true); delay(1000); } void loop() { //работа кнопок----------------------------------------------------------- if ((digitalRead(0) == LOW) || (den > 17)) {t = 375; H = 80; r = 1;} //переключение режима работы до и после 18 дней else {t = 378; H = 60; r = 0;} if ((digitalRead(1) == LOW) || (den > 14)) j = 1; //на 15 день включение проветривания else {j = 0;} //работа часов------------------------------------------------------------ if (micros() - prevmicros > 500000) {prevmicros = micros(); counter=!counter; if (counter==false) {sek++; lcd.setCursor(3,0); lcd.print(":"); //выводим символ ":"между часами и минутами digitalWrite(13, HIGH); } else { lcd.setCursor(3,0); lcd.print(" "); digitalWrite(13, LOW); } if(sek>56) {sek=0; minu++; m++;} if(minu>59) {minu=0; chas++; povorot++; ventil++; } if(chas>23) {chas=0; den++;} } //Поворот яиц--------------------------------------------------------------- if ((r == 0) && (povorot == 3)) {digitalWrite(3, HIGH); povorot = 0; // поворот до 18 дня delay(500); digitalWrite(3, LOW); p = !p;} //вентиляция яиц------------------------------------------------------------ if ((j == 1) && (ventil > 12)) {digitalWrite(5, HIGH); ventil = 0; lcd.clear(); lcd.setCursor(2,0); analogWrite(6,0); lcd.print("provetrivanie"); delay(1080000); //остановка всей программы, проветривание инкубатора 18 минут--------- minu = minu + 18; digitalWrite(5, LOW); lcd.clear(); } //опрос датчика влажности и темперетуры--------------------------------------- if (((millis() - time1)/1000.0) >= 1.0) {dps.calcTrueTemperature(); time1 = millis();} float h = dht.readHumidity(); dps.getTemperature(&Temperature); //работа насоса поддержания влажности------------------------------------- if ((minu == 0) && (h < H) && (sek == 0)) //выполняется раз в час, при условии влажности меньше заданной {digitalWrite(2, HIGH); } if ((digitalRead(2) == HIGH) && (sek > 5)) {digitalWrite(2, LOW);} //насос рвботает 5 сек, время определяется опытным путем //печать на дисплей-------------------------------------------------------- lcd.setCursor(1,0);//выводим значение часов if (chas>=0 && chas<10) {lcd.print("0"); lcd.print(chas);} else lcd.print(chas); lcd.setCursor(4,0);//выводим значение минут if (minu>=0 && minu<10) {lcd.print("0"); lcd.print(minu);} else lcd.print(minu); lcd.setCursor(7,0);//выводим значение дня инкубации lcd.print("d"); lcd.print(den); lcd.setCursor(11,0); lcd.print("H"); lcd.print(h,0);//влажность lcd.print("%"); lcd.setCursor(0,1); lcd.print(Temperature*0.1,1); //температура если (,1) - 1 знак после запятой lcd.print("*C "); lcd.setCursor(7,1); lcd.print("i"); //ШИМ на нагрев if (i>=0 && i<20) {lcd.print("0"); lcd.print(i/2);} else lcd.print(i/2); lcd.print("%"); lcd.setCursor(12,1); lcd.print(p); lcd.print(" "); lcd.print(r); lcd.print(j); //работа нагревателя------------------------------------------ if (Temperature >= (t+4)) digitalWrite(5, HIGH); //если температура больше на 0,5 градуса, вкл охлаждение if (Temperature <= (t+3)) digitalWrite(5, LOW); if ((m > 3) && (Temperature != t) && (r == 0)) //работа нагревателя до 18 дней, температура 37,8 { switch (Temperature) { case 375: i = i+12; break; case 376: i = i+4; break; case 377: i = i+2; break; case 379: i = i-6; break; case 380: i = i-12; break; case 381: i = i-16; break; case 382: i = i-20; break; } if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20; if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10; m = 0; b = Temperature; } if ((m > 3) && (Temperature != t) && (r == 1)) //работа нагревателя после после 18 дней, температура 37,5 { switch (Temperature) { case 372: i = i+12; break; case 373: i = i+4; break; case 374: i = i+2; break; case 376: i = i-6; break; case 377: i = i-12; break; case 378: i = i-16; break; } if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20; if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10; m = 0; b = Temperature; } if (Temperature < t - 38) {i = 150; m = 0;} if (Temperature == t - 38) i = 100; if ((i == 8) && (Temperature > t + 2)) {i = 0; m = 0;} //выключение нагревателя if ((i == 0) && (Temperature == t)) i = 16; if (i >= 160) i = 160; if (i <= 8) i = 8; analogWrite(6,i); }
Здравствуйте!Напишите пожалуйста, какие "железяки" использовали?И фото если можно?
Вангую - использованы следующие железяки:
1. BMP085
2. DHT11
3. Двустрочный символьный LCD
4. Вентилятор
5. Насос
6. Нагреватель
7. Тактовые кнопки
А зачем датчик давления?
А он ещё и температуру меряет :)
Датчик давления измеряет температуру, т.к. у него точность измерения - 0,1 С, а у DHT11 - 1 C. По поводу железяк, немного поправлю пользователя выше) - 2 вентилятора, один постоянно гоняет воздух, а другой включается для проветривания. В качестве нагревателя - лампочки накаливания. ,
Все компоненты вместил в коробку, в которой раньше был счетчик. На дисплее выводится время инкубации, день, влажность, температура, мощность нагревателя, положение привода, и последние две цифры говорят о текущем режиме работы. На фото видно, как переделан привод.
Спасибо!А можно,( для тех кто в танке) по - подробнее,что куда подключали,на фото и транзистор на радиаторе!!!поймите только првильно, далекий я!а инкубатор хочу!!!
Вы начните делать, а непонятные моменты по ходу дела помогу вам решить.
Для подключение дисплея есть много информации, включение вентилятора и насоса происходит через транзистор BD139 - обязателен обратный диод, подключение датчиков Вы тоже найдете без труда, управление силовым транзистором (IRFBE 30, можно любой напряжением выше 400 В на ток более 2 А - параметры завешены для надежности) по такой схеме: (вместо двигателя лампочка)
Нужно внимательно отнестись к работе транзистора и обязательно установить его на радиатор. При минимально-возможном напряжении на лампочке, на транзисторе выделяется большое количество тепла. Так же на радиаторе установлены две кренки на 12 и 5 В. Температура радиатора не превышает 40С.
Здравствуйте!!! а не могли бы схемку набросать? зарание Спасибо!!!
Здравствуйте! Пожалуйста, для облегчения моего труда, укажите конкретный узел(ы), который вам интересен.
Может будет полезно: https://www.youtube.com/watch?v=oUXaYEYK_vM
Код программы будет дорабатываться, хоть и работает он безотказно. Писал я его в "первом класе", сейчас уже перешел во второй, и вижу, что многое можно написать более грамотно.
Версия прошивки 2.0. Используется энергонезависимая память, система управления не требует резервного питания, более точно работает нагреватель.
Делаю инкубатор нужна помощь! Сделал пока поворотный механизм лотков на серво приводе, у Вас хочу взять идею с регулировкой температуры и влажности и таймером. С ардуино знаком около 3-х месяцев кроме паялки и всяких простых вещей ничего не собирал. Хотелось что-бы Вы помогли.
Как говорил раньше лотки поворачивают сервомоторы, нагреватель хочу поставить 12 вольтовый (пластины) и скомутировать через релле.
Хочу взять ваш код и подтянуть под свое железо но врятли сам справлюсь ;)
Конечно помогу! ;) По вашей задумке, сколько яиц вмещает инкубатор? Хотелось бы увидеть как сделан поворот на серве. По вашему условию работы, код будет проще. Вашему мк не нужно считать выходную мощность для нагревателя, а просто включать его и отключать при достижении температурных границ. Для большей инерционности в ваш инкубатор я бы положил пару кирпичей. О регулировании влажности мой образец полностью вам подходит.
буду использовать корпус небольшой морозильной камеры 50/60 яиц. На выходных буду на даче сфоткаю макет поворотного механизма, я сразу делаю с пластика (ПВХ) макет а потом уже зная какие где детали буду их изготавливать из подходящего материала. Код поворота :
delay(5000) поменять на время между поворотами,
у меня будет стоять три серво подключены на один пин управления а питание через ключ из полевого транзистора
я хотел сразу использовать цифровой термо регулятор (https://ru.aliexpress.com/item/1pcs-48-40mm-Xh-w1209-Digital-Temperature-Controller-High-precision-Temperature-Controller-Micro-temperature-Control-Board/32786169364.html?spm=2114.03020208.6.4.1locgd&s=p) и ардуинку на все остальное но мне ето не очень нравится. Как-то не серьёзно :)
сбросьте адрес почты у меня есть видео поворотного механизма
Поворот яиц - это очень ответственный момент. Ваши серво должны быть с запасом по мощности, и по- хорошему, обратная связь с мк, о выполненном повороте. Если вы напишете делей(2 часа) между поворотами, то ваш атмега больше ничего не сможет делать, кроме как ждать. Необходимо задать условие - скажем, по истечении 2х часов выполнить часть этого кода.
Терморегулятор хорошая вещь, но если у вас есть мощнейший мк, который сам всё может, зачем тогда лишние затраты. Нужен точный датчик температуры типа 18D20 или подобный. Он умеет считать десятые доли градуса. Но вообще, если о вашем проекте, можно и простой терморезистор или DHT11/ DHT22, т.к. нагреватель ваш работает в релейном режиме с гистерезисом в ~2 градуса.
Почта: Emeljanowich@mail.ru
""Если вы напишете делей(2 часа) между поворотами, то ваш атмега больше ничего не сможет делать, кроме как ждать. Необходимо задать условие - скажем, по истечении 2х часов выполнить часть этого кода.""---- вот ето и есть для меня сложность собрать из нескольких кодов один чтобы серво ждало а контроль температуры и влажности работал
по поводу обратной связи хочу поставить на каждый механизм опто концевик с принтера
Emeljanowich, а почему отказались от симисторного регулирования накалом, деталей примерно так же, зато нет тепловыделения на силовом элементе и сам он дешевле.
Для температуры-влажности SHT** хороши, правда дороги если с DHT11 сравнивать.
Собрал автоматику инкубатора по схеме Umka http://arduino.ru/forum/proekty/prostoi-umnyi-inkubator
Пользуюсь им 2-й год (9 инкубаций) очень доволен, результат -ОТЛИЧНЫЙ!!!!
В автоматике реализовано все: Регулировка температуры ПИД, контроль по 2-м цифровым датчикам (DS18b20, SHT10), управление и контроль влажностью, управление переворотом лотков, оповещение в случае аварии (недогрев), оповещение и сбросс температуры в случае перегрева, дополнительный автоматический нагреватель и т.д.

я думаю сделать таймер отдельно от ардуино и по сигналу от него переворачивать. Ардуино научить считать перевороты и на какомто перевороте отключить таймер. (как-то так)
Как Вы думаете ?
Отдельно не нужно делать никакие таймеры! Ардуино вам все посчитает, и если придет время отключит поворот. Программно это все можно сделать, я Вам помогу. По вашему видео о повороте: я вот сомневаюсь, что серва потянет. Вам нужно реальные условия смоделировать. И динамику поворота надо бы поубавить - это тоже программно, вечером выложу код для этого.
bwn (ну и странный ж у вас логин), с вами полностью согласен. Главное результат, а совершенствовать можно до бесконечности ;)
А что в ФИО может быть странного? Вот Харитонова Ульяна Яковлевна, гораздо хуже.))))
я хотел сразу использовать цифровой термо регулятор (https://ru.aliexpress.com/item/1pcs-48-40mm-Xh-w1209-Digital-Temperature-Controller-High-precision-Temperature-Controller-Micro-temperature-Control-Board/32786169364.html?spm=2114.03020208.6.4.1locgd&s=p) и ардуинку на все остальное но мне ето не очень нравится. Как-то не серьёзно :)
Термостат то цифровой, а вот датчик температуры - аналоговый (терморезистор)
p.s. Однажды сталкивался с таким - результат огорчил.
на один серво будет три лотка на подшипниках на 20яиц будет три серво
Вы говорите об етом:
Не, всё намного проще. Посмотрите внимательно мой код, там есть переменная, которая плюсует 1 каждый час. Когда она больше 2х т.е. = 3, выполняется условие поворота и переменная обнуляется. И так погругу пока день станет > 18.
Внутри у сервы очень маленькие хлюпинькие шестерни - особенно у самых дешевых китайских. Запас прочности маленький, подумайте, пока не поздно,о чем то более серьёзном.
Загрузите этот код и проверьте работу нагруженной сервы
MVN123P, я уверен, что мой проект дешевле, 3 раза выводил в нем цыплят, ни разу не было серьезных проблем. Только программную часть раз 100 допиливал ;) И мой расчет мощности на нагрев работает не хуже хваленого ПИДа. На теперешний момент, только симистор туда поставил бы вместо транзистора, и то это по замечанию bwn. Планирую переделать лоток, что бы туда можно было >= 300 яиц ложить, но пока нет в этом необходимости.
На теперешний момент, только симистор туда поставил бы вместо транзистора, и то это по замечанию bwn.
Если заинтересовало, то библиотека, там и схема есть. Для надежности сделал бы два независимых канала, каждой лампе свой. Хоть лампа, хоть ключ померли, инкубатор работает.
ошбка
я так понял функция обьявлена внутри функции я сделал
кампиляция прошла серво поворачивает лоток и есть дребезг я раньше отключал его функцией
куда ее вписать и как показать что после поворота povorot=0
извените может сильно туплю:)
Попробуйте так. Щас серва под рукой, все проверил.
та же ошибка с строчкой 29 и я пошол другим путём:
с 12 на 10 и с 8 на 9 пин через делитель подаю сигнал получаю поворот что скажете?
вот проверил просто и работает
для проверки менял значение е
у меня вопрос функция ++ до скольки считает?
Emeljanowich подскажите какие Вы брали датчики насос и дисплей хочу сегодня заказать все
Все детали указанны в постах выше. Пожалуйста, внимательно посмотрите.
у меня вопрос функция ++ до скольки считает?
Считает до тех пор пока не переполнится переменная, после чего начинает сначала. В зависимости от типа переменной устанавливается число, до которого считает. Тип переменной привел для вас в картинке ниже.
понял спасибо
Здравствуйте. Начал знакомится с ардуино,купил уно,кейпад шилд,пару датчиков,дс 18б20 и sht 21.Решил сделать инкубатор,на форуме "перепелка" скачал скетч,все работает,но после нескольких минут работы на экране появляются кракозябры.В чем может быть причина?Прошу помощи!При нажатии rst все становится как надо. но пото сново фигня какая то!
Здравствуйте! По-вашему, я на кофейной гуще ответ на ваш вопрос искать буду? :р Нужен скетч, пару фото что да как. Тогда и попробую помочь.
Для начала берем спирит, щетку зубную и тщательно промываем все места засранные флюсом. Ну и надеюсь это все не на макетке с воткнутыми проводами.
Он мой скетч скачал, тут есть кстати. Дисплей лагает по причине недостаточного питания, длинных проводов I2C, плохой подтяжки шины и прочих помех. Проблема 100% аппаратная.
И вот вам диммер-шиммер. Код тут есть, "attiny85 и прерывание " почему-то называется. Рулится по i2c или по ШИМ. Код щас кину свежий.
https://www.youtube.com/watch?v=wXA2jGXWzno
Пост №28, (bwn спасибо!) Отлично работает не нужны никакие атину85. Собрал три схемы по примеру, все сразу заработало, причем идеально без скачков провалов, остановок, мерцаний, какой бы код не был в лоопе и сколько бы не ставили делеев.
Роман, скетч Александра( Папа псих[code]
ромаха28, во-первых, ознакомьтесь с правилами написания и вставки кода на данном сайте, а во-вторых, Umka вам всё разъяснил!
Ну, не так все сладко, есть проблемы когда что то запрещает прерывания, тогда наблюдаются помигивания. Для инкуба или другого термостата это без разницы, а вот если это освещение.((( На отдельном МК таких проблем точно не будет, ну или 20 независимых каналов потребуется, на I2C вешай хоть сотню.
А, тот код в Flprog создан и понять в нем что-то все равно что в бинарнике ковыряться. Диммеры наверное все перепробовал в коде инкубатора - не работают они ровно. В чистом микроконтроллере работают, а с кодом инкубатора нет. Поэтому сделал на отдельной тиньке, ей цена то 50р. Сейчас залью её в эпоксидку и можно прямо к нагревателя ставить. Подальше убрать 220 от контроллера. Ну тут оно дело хозяйское.
вот собрал проверте может чтото не так (влажность и количество поворотов пока не сделал)
Для новичка сойдет. С первого взгляда такие моменты бросаются: подсветку дисплея не нужно от мк запитывать, переменную е нужно к минутам привязать и даже лучше к часам, т.е. не нужно ее считать до 10800, а до двух и обнулить (в условие проверки минут её напишите), нет смысла опрашивать датчик температуры и влажности и посылать байты данных на дисплей примерно 10 млн раз в секунду, нужно это привязать к условию проверки секунд и делать это раз в секунду (простите за масло-масленное). Я бы сделал управление нагревателем более точным - привязал бы его потребляемую мощность к количеству потерь и управлял бы ШИМом или фазовым методом (#28 - обратите внимание). Вообщем вы на верном пути, продолжайте!
Подсветку дисплея хочу поставить на датчик движения инкубатор маме делаю (кнопки зло) ;) , переменную исправил, датчик исправил, нагреватели у меня из 3D принтера вставленые в радиатор а он прикручен до внутренёго алюмин. корпуса через термопасту плюс стоит кулер на обдув радиатора. Через пол часа подымается температура на 37 градусов и внутрений корпус равномерно прогрет, может не надо игратся с шим полёвик отлично справляется. Хочу поставить LM35DZ TO92 датчик температуры и более точно по (пингвинам) настроить, как Вы думаете?
Я, наверное, сбиваю вас с толку. В коде я не нашёл где переменная е плюсуется и зачем ей присваивается значение минут? Дисплей нет необходимости очищать каждые пол секунды. LM35 - это вроде аналоговый датчик, как терморезистор работает. В вашем случаи сгодится. Нужно настраивать все конечно в реальных условиях (по пингвинам). Немного измененный ваш код приведен ниже.
я не правельно привязал серво наверное буду возвращатся к е++