11 svi Automatizirani ekološki uzgoj pilića
OŠ Iver
Automatizirani 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š.
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.
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).
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.
#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.
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.