Prisireikė inkubatoriaus vištų kiaušiniams perėti.
Dėžė bus klijuojama iš putplasčio, šildymo elementas paprastos kaitrinės lempos, drėgmei palaikyti bandysim naudoti ultragarsinį oro drėkintuvą. Oro cirkuliacijai ir stabiliai oro temperatūrai bei drėgmei palaikyti inkubatoriaus viduje montuojamas kompiuterio 80mm arba 120mm ventiliatorius, kurio greitį bus galima keisti.
Inkubatoriaus smegenims naudojamas Arduino Nano valdiklis. Temperatūros ir drėgmės daviklis DHT11 (jei pasirodys, kad neužtenka tikslumo naudosiu DHT21), SSD1306 ekranėlis (SPI versija modifikuota į I2C versiją, kad liktų daugiau laisvų mikrovaldiklio prievadų), trys mygtukai režimo nustatymui.
Pradinė valdiklio versija surinkta ant maketinės plokštės.
Programos kodas Arduino aplinkoje:
#include <Arduino.h> #include <string.h> #include <U8g2lib.h> #include <Wire.h> #include <EEPROM.h> #include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define plus 3 #define minus 4 #define rezimas 5 #define ventiliatorius 6 #define dregme 7 #define temperatura 8 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); DHT dht(DHTPIN, DHTTYPE); char buffer[10]; byte mode; boolean keitimai = false, paspausta = false; float h, t, hs, ts, reikia[3]; unsigned long laikas, laikas, daviklis = 0; float readFloat(unsigned int addr) { union { byte b[4]; float f; } data; for (int i = 0; i < 4; i++) data.b[i] = EEPROM.read(addr + i); return data.f; } void writeFloat(unsigned int addr, float x) { union { byte b[4]; float f; } data; data.f = x; for (int i = 0; i < 4; i++) EEPROM.write(addr + i, data.b[i]); } void setup(void) { u8g2.begin(); dht.begin(); pinMode(plus, INPUT_PULLUP); pinMode(minus, INPUT_PULLUP); pinMode(rezimas, INPUT_PULLUP); pinMode(plus, INPUT_PULLUP); pinMode(minus, INPUT_PULLUP); pinMode(rezimas, INPUT_PULLUP); pinMode(ventiliatorius, OUTPUT); pinMode(dregme, OUTPUT); pinMode(temperatura, OUTPUT); for (int i = 0; i < 3; i++) reikia[i] = readFloat(i * 4); if (reikia[0] > 50 || reikia[0] < 10) reikia[0] = 37; if (reikia[1] > 99 || reikia[1] < 10) reikia[1] = 75; if (reikia[2] > 9 || reikia[2] < 0) reikia[2] = 6; h = dht.readHumidity(); t = dht.readTemperature(); } void isvedimas() { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB10_tr); if (isnan(h) || isnan(t)) { u8g2.drawStr(0, 20, "Klaida"); return; } u8g2.drawStr(0, 12, "Temp Dreg Vent"); u8g2.setFont(u8g2_font_ncenB14_tr); dtostrf(t, 4, 1, buffer); u8g2.drawStr(1, 35, buffer); dtostrf(h, 4, 1, buffer); u8g2.drawStr(52, 35, buffer); dtostrf(reikia[2], 2, 0, buffer); u8g2.drawStr(105, 35, buffer); u8g2.drawLine(45 * mode + 10, 62, 45 * mode + 30, 62); u8g2.drawLine(45 * mode + 10, 63, 45 * mode + 30, 63); u8g2.setFont(u8g2_font_ncenB12_tr); for (int i = 0; i < 2; i++) { dtostrf(reikia[i], 4, 1, buffer); u8g2.drawStr(48 * i + 4, 55, buffer); } u8g2.sendBuffer(); hs = h; ts = t; } void issaugom() { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB18_tr); u8g2.drawStr(10, 40, "Issaugom"); u8g2.sendBuffer(); keitimai = false; for (int i = 0; i < 3; i++) writeFloat(i * 4, reikia[i]); delay(5000); } void loop(void) { daviklis++; if (daviklis > 1000) { h = (h * 4 + dht.readHumidity()) / 5; t = (t * 4 + dht.readTemperature()) / 5; daviklis = 0; } if (!digitalRead(rezimas)) { mode++; paspausta = true; if (mode > 2) mode = 0; delay(100); } if (digitalRead(plus) && digitalRead(minus)) laikas = millis(); if (!digitalRead(plus)) { if (mode == 2 || (millis() - laikas) > 3000) { if ((millis() - laikas) > 8000) reikia[mode] = reikia[mode] + 5; else reikia[mode]++; } else reikia[mode] = reikia[mode] + .1; if (mode > 1) { if (reikia[mode] > 9) reikia[mode] = 9; } else { if (reikia[mode] > 99) reikia[mode] = 99; } paspausta = true; keitimai = true; laikas2 = millis(); delay(20); } if (!digitalRead(minus) && (reikia[mode] != 0)) { if (mode == 2 || (millis() - laikas) > 3000) { if ((millis() - laikas) > 8000) reikia[mode] = reikia[mode] - 5; else reikia[mode]--; } else reikia[mode] = reikia[mode] - .1; if (reikia[mode] < 0) reikia[mode] = 0; paspausta = true; keitimai = true; laikas2 = millis(); delay(20); } if (paspausta || ts != t || hs != h) isvedimas(); paspausta = false; analogWrite(ventiliatorius, (reikia[2]) * 255 / 9); if (t < reikia[0]) digitalWrite(temperatura, HIGH); else digitalWrite(temperatura, LOW); if (h < reikia[1]) digitalWrite(dregme, HIGH); else digitalWrite(dregme, LOW); if (keitimai && ((millis() - laikas2) > 30000)) issaugom(); }