Automatizirani ekološki uzgoj pilića
OŠ IverAutomatizirani ekološki uzgoj pilića u objektu i van objekta u ograđenom prostoru, upravljan aplikacijom na pametnom mobilnom telefonu. Pilići se, dok su mali, moraju uzgajati u objektu, jer vani ne mogu održavati svoju temperaturu. U objektu se automatski kontrolira i upravlja vlagom, temperaturom, rasvjetom i pojilicom. Prema potrebi se automatski puni pojilica vodom iz bunara, te provjerava napunjenost hranilice i obavještava na e-mail ako ima potrebe za nadopunjavanje. Kad porastu, pilići se preko dana puštaju van u ograđeni prostor. Kad je dan pilići se puštaju van automatskim otvaranjem vrata objekta. Kad padne noć, piliće se pomoću “tjeralice” potjera u objekt, te kad PIR sensor utvrdi da vani nema pilića, zatvore se vrata objekta. Automatiziranim procesom ostvarujemo uštedu električne energije i vode te tako čuvamo naš okoliš.
Video snimka
Izrada projekta
Hranilica koja pomoću lasera i fotootpornika provjerava ima li hrane u njoj. Ako nema, pomoću Blynk aplikacije šalje se obavijest na e-mail.
Bunar s pumpom za vodu, te pojilica koja pomoću senzora (dva čavla) provjerava ima li vode u njoj. Ako nema vode uključuje se pumpa koja iz bunara crpi vodu.
Senzor temperature i vlage za mjerenje i pomoć pri regulaciji povoljnih uvjeta u objektu. Crvena led dioda predstavlja grijalicu. Ako je temperatura niža od zadane, preko releja uključujemo grijalicu odnosno led diodu. Na isti način možemo upravljati pravim grijalicama na visokim naponima. Ako je temperatura previsoka, otvara se prozor i uključuje ventilator. Kad temperatura postigne zadanu razinu, zatvara se prozor i isključuje ventilator. Na isti način reguliramo i vlažnost zraka, ali prozor se otvara samo do pola, kako ne bi gubili previše topline.
Mobilna aplikacija
Dva “value display” widget-a koji prikazuju temperaturu (preko virtualnog pina V1) i vlagu (preko virtualnog pina V2). Dva “Step V” widget-a za namještanje željene temperature i vlage (preko virtualnih pinova V0 i V3). Jedan “e-mail” widget pomoću kojega šaljemo mailove kad nema hrane u hranilici. “Switch Button” widget pomoću kojega omogućavamo ili onemogućavamo automatsko otvaranje vrata (preko virtualnog pina V4).
Shema projekta
Senzor vode / dva čavla = pin A0
Senzor hrane / Fotootpornik = pin A1
Senzor svjetla / Fotootpornik = pin A2
Senzor za temperaturu i vlagu / DHT11 = pin A3
Svjetlo / LED-bijela = pin A4
Pumpa vode = pin 0
Senzor hrane / Laser = pin 1
Ventilator = pin 2
Vrata / Servo = pin 3
Prozor / Servo = pin 4
Tjeralica / Servo = pin 6
Zujalica / Buzzer = pin 7
Grijalica / LED-crvena = pin 8
PIR senzor = pin 9
Grijalica (crvena LED dioda) je spojena preko releya kako bi simulirali mogućnost upravljanja grijalicama visokog napona. Servo motori (tjeralica, prozor i vrata), pumpa vode i ventilator spojeni su na vanjsko napajanje 6V. Pumpa vode i ventilator spojeni su preko tranzistora NPN tip 120.
Shemu ovoga projekta možete preuzeti ovdje.
Arduino program
#define BLYNK_PRINT Serial #define PROZOR_OTVOREN 100 #define PROZOR_POLUOTVOREN 50 #define PROZOR_ZATVOREN 0 #define VRATA_OTVORENA 150 #define VRATA_ZATVORENA 0 #define TJERALICA_MIN 0 #define TJERALICA_MAX 180 #define NEMA_VODE 1000 #define NEMA_HRANE 500 #define MAX_OSVJETLJENJE 890 #define MIN_OSVJETLJENJE 370 #define DAN_NOC_GRANICA 400 // granica osvjetljenja dana i noći (za zatvaranje i otvaranje vratiju) #define PUMPA_PIN 0 // 0 pin pumpe vode #define LASER_PIN 1 // 1 pin lasera #define VENTILATOR_PIN 2 // 2 pin ventilatora #define VRATA_PIN 3 // 3 pin servo motora vratiju #define PROZOR_PIN 4 // 4 pin servo motora prozora #define TJERALICA_PIN 6 // 6 pin servo motora tjeralice #define ZUJALICA_PIN 7 // 7 pin zujalice #define GRIJALICA_PIN 8 // 8 pin releja za upravljenje grijalicom #define PIR_SENZOR_PIN 9 // 9 pin PIR senzora #define SENZOR_VODE_PIN A0 // A0 pin senzora vode #define SENZOR_HRANE_PIN A1 // A1 pin senzora hrane #define SENZOR_SVJETLA_PIN A2 // A2 pin senzora svjetla #define DHT_PIN A3 // A3 pin DHT11 #define SVJETLO_PIN A4 // A4 pin svjetla #include#include #include #include #include BlynkTimer timer; // timer - potreban za pozivanje funkcija svakih nekoliko sekundi dht DHT; // senzor temperature i vlage Servo m_prozor; // servo motor prozora Servo m_vrata; // servo motor vrata Servo m_tjeralica; // servo motor tjeralice int PoslaoMail; float vlaznost, temperatura; int VrijednostSvjetlosnogSenzora; int JacinaSvjetla; int DefiniranaTemp; int DefiniranaVlag; int AutomatskoOtvaranjeVrata; int OcitaniPirSenzor; int ProzorOtvoren; int VrataOtvorena; int GrijalicaUkljucena; int TjeralicaPozicija; int KorakTjeralica; int ProzorOtvorenStanjePrije; // postavke BLYNK-a char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxx"; char ssid[] = "xxxxxx"; char pass[] = "xxxxxxx"; void setup() { Serial.begin(9600); // izlazni pinovi pinMode(SVJETLO_PIN, OUTPUT); pinMode(PUMPA_PIN, OUTPUT); pinMode(GRIJALICA_PIN, OUTPUT); pinMode(VENTILATOR_PIN, OUTPUT); pinMode(LASER_PIN, OUTPUT); pinMode(ZUJALICA_PIN, OUTPUT); // ulazni pinovi pinMode(SENZOR_HRANE_PIN, INPUT); pinMode(SENZOR_SVJETLA_PIN, INPUT); pinMode(SENZOR_VODE_PIN, INPUT); pinMode(PIR_SENZOR_PIN, INPUT); // dodjela pinova servo motorima m_vrata.attach(VRATA_PIN); m_prozor.attach(PROZOR_PIN); m_tjeralica.attach(TJERALICA_PIN); Blynk.begin(auth, ssid, pass); // početne pozicije servo motora m_prozor.write(PROZOR_ZATVOREN); m_vrata.write(VRATA_ZATVORENA); m_tjeralica.write(TJERALICA_MAX); ProzorOtvoren = 0; VrataOtvorena = 0; GrijalicaUkljucena = 0; TjeralicaPozicija = TJERALICA_MAX; // pozicija tjeralice KorakTjeralica = -60; // korak tjeralice PoslaoMail = 0; // mail o praznoj hranilici nije još poslan timer.setInterval(2000L, ProvjeriSenzorTemp); // definiraj poziv funkcije ProvjeriSenzorTemp svakih 2 sekunde timer.setInterval(3000L, ProvjeriSenzorHranilice); // definiraj poziv funkcije ProvjeriSenzorHranilice svakih 3 sekunde timer.setInterval(3000L, ProvjeriSenzorPojilice); // definiraj poziv funkcije ProvjeriSenzorPojilice svakih 3 sekunde noTone(ZUJALICA_PIN); // isključi zujalicu delay(2000); // pričekaj da se DHT senzor stabilizira } // očitanje temperature i vlage void ProvjeriSenzorTemp() { DHT.read11(DHT_PIN); // čitaj vrijednosti DHT s pina DHT_PIN temperatura=DHT.temperature; // varijabli temperatura pridruži temperaturu vlaznost=DHT.humidity; // varijabli vlaga pridruži postotak vlage Blynk.virtualWrite(V1, temperatura); // pošalji temperaturu na Blynk virtualni pin 1 Blynk.virtualWrite(V2, vlaznost); // pošalji vlagu na Blynk virtualni pin 2 // ispiši temperaturu i vlagu na serijski monitor (za provjeru) Serial.print("Vlaznost="); Serial.print(vlaznost); Serial.print("% "); Serial.print("Temperatura="); Serial.print(temperatura); Serial.println("C"); } // provjera hranilice void ProvjeriSenzorHranilice() { int OcitaniSenzorHrane; digitalWrite(LASER_PIN, HIGH); // uključi laser kako bi provjerili ima li hrane u hranilici delay(300); //pričekati da laser proradi OcitaniSenzorHrane=analogRead(SENZOR_HRANE_PIN); // pročitaj s pina senzora hrane vrijednost if (OcitaniSenzorHrane < NEMA_HRANE) // AKO NEMA HRANE if (PoslaoMail == 0) // i ako mail nije poslan još poslan { // pošalji mail "nema hrane" Blynk.email("xxxxx.xxxxxx@xxxxxxx.xxx", "NEMA HRANE", "Napuni hranilicu!"); PoslaoMail = 1; // zabilježi da je mail poslan } if (PoslaoMail == 1) // ako je mail poslan, ne šalji novi sve dok se ne napuni hranilica if (OcitaniSenzorHrane > NEMA_HRANE) // tek kad se napuni hranilica PoslaoMail = 0; // dozvoljeno je slanje novih mailova digitalWrite(LASER_PIN, LOW); // isključi laser kako bi se štedjela energija } // provjera pojilice void ProvjeriSenzorPojilice() { int voda = analogRead(SENZOR_VODE_PIN); // pročitaj s pina senzora pojilice vrijednost if (voda < NEMA_VODE) // ako nema vode { digitalWrite(PUMPA_PIN, HIGH); // pokrenu pumpu vode delay(4000); // pričekaj jedno vrijeme digitalWrite(PUMPA_PIN, LOW); // isključi pumpu vode } } // tjeranje pilica u objekt i zatvaranje vrata void zatvaranje_vrata() { OcitaniPirSenzor=digitalRead(PIR_SENZOR_PIN); Serial.print("OcitaniPirSenzor:"); Serial.println(OcitaniPirSenzor); if (OcitaniPirSenzor == LOW) // ako PIR senzor ne vidi nikog { noTone(ZUJALICA_PIN); // isključi zujalicu m_vrata.write(VRATA_ZATVORENA); // zatvori vrata m_tjeralica.write(TJERALICA_MAX); // postavi tjeralicu u početnu poziciju VrataOtvorena = 0; TjeralicaPozicija = TJERALICA_MAX; // za slijedeće zatvaranje postavi poziciju tjeralice KorakTjeralica = -60; // za slijedeće zatvaranje postavi korak tjeralice } else // ako PIR senzor vidi nekog { tone(ZUJALICA_PIN, 1000); // zujalica 1KHz zvuk TjeralicaPozicija = TjeralicaPozicija + KorakTjeralica; if (TjeralicaPozicija >= TJERALICA_MAX) { KorakTjeralica=-60; // TjeralicaPozicija = TjeralicaPozicija + KorakTjeralica; } if (TjeralicaPozicija <= TJERALICA_MIN) { KorakTjeralica=60; // TjeralicaPozicija = TjeralicaPozicija + KorakTjeralica; } m_tjeralica.write(TjeralicaPozicija); // postavi tjeralicu na poziciju delay(100); // čekaj da se servo motor postavi na poziciju } } BLYNK_WRITE(V0) // čitanje V0 virtualnog pina { DefiniranaTemp = param.asInt(); } BLYNK_WRITE(V3) // čitanje V3 virtualnog pina { DefiniranaVlag = param.asInt(); } BLYNK_WRITE(V4) // čitanje V4 virtualnog pina { AutomatskoOtvaranjeVrata = param.asInt(); } void loop() { timer.run(); // pokreni timer - potreban za pozivanje funkcija svakih nekoliko sekundi Blynk.run(); // pokreni Blynk // regulacija osvjetljenja pomocu foto otpornika VrijednostSvjetlosnogSenzora = analogRead(SENZOR_SVJETLA_PIN); if (VrijednostSvjetlosnogSenzora < MIN_OSVJETLJENJE) VrijednostSvjetlosnogSenzora=MIN_OSVJETLJENJE; if (VrijednostSvjetlosnogSenzora > MAX_OSVJETLJENJE) VrijednostSvjetlosnogSenzora=MAX_OSVJETLJENJE; JacinaSvjetla = map(VrijednostSvjetlosnogSenzora, MIN_OSVJETLJENJE, MAX_OSVJETLJENJE, 0, 255); analogWrite(SVJETLO_PIN, JacinaSvjetla); // automatsko otvaranje i zatvaranje vrata if (AutomatskoOtvaranjeVrata==1) // Ako je omogučeno otvaranje vrata { if (VrijednostSvjetlosnogSenzora < DAN_NOC_GRANICA and VrataOtvorena==0) // ako je dan i vrata nisu otvorena { m_vrata.write(VRATA_OTVORENA); //otvori vrata VrataOtvorena = 1; } if (VrijednostSvjetlosnogSenzora > DAN_NOC_GRANICA and VrataOtvorena==1) // ako je noć i vrata su otvorena zatvaranje_vrata(); // pozovi funkciju za provjeru PIR senzora i zatvaranje vrata } else // ako nije automatsko otvaranje { if (VrataOtvorena==1) // ako su vrata otvorena zatvaranje_vrata(); // pozovi funkciju za provjeru PIR senzora i zatvaranje vrata } // temperatura, vlaga, ventilator, grijalica, otvaranje prozora ProzorOtvoren=0; GrijalicaUkljucena=0; if (vlaznost > DefiniranaVlag) // ako je velika vlažnost ProzorOtvoren=1; // otvori prozor na pola if (temperatura > DefiniranaTemp) // ako je temperatura prevelika ProzorOtvoren=2; // otvori prozor potpuno if (temperatura < DefiniranaTemp) // ako je temperatura nedovoljna GrijalicaUkljucena=1; // uključi grijalicu, prozor zatvoren ili zbog vlage otvoren na pola if (ProzorOtvoren==0 and ProzorOtvorenStanjePrije!=0) // ako zatvori prozor { m_prozor.write(PROZOR_ZATVOREN); // zatvori prozor digitalWrite(VENTILATOR_PIN, LOW); // isključi ventilator } if (ProzorOtvoren==1 and ProzorOtvorenStanjePrije!=1) // ako otvori prozor na pola { m_prozor.write(PROZOR_POLUOTVOREN); // otvori prozor na pola digitalWrite(VENTILATOR_PIN, HIGH); // uključi ventilator } if (ProzorOtvoren==2 and ProzorOtvorenStanjePrije!=2) // ako otvori prozor potpuno { m_prozor.write(PROZOR_OTVOREN); // otvori prozor potpuno digitalWrite(VENTILATOR_PIN, HIGH); // uključi ventilator } ProzorOtvorenStanjePrije = ProzorOtvoren; // grijalica if (GrijalicaUkljucena==1) // ako treba uključiti grijalicu digitalWrite(GRIJALICA_PIN, HIGH); // uključi preko releja grijalicu else digitalWrite(GRIJALICA_PIN, LOW); // isključi preko releja grijalicu }
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt su izradili Maja Pavlić i Mihael Orak uz mentorstvo Romana Rubčića iz OŠ Iver.
Projekt je prijavljen na temu: Internet of Things: Kućni ljubimci i domaće životinje.