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š.

Video snimka

Izrada projekta

Servo motori za automatsko upravljanje vratima i prozorom.

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.

Vanjski prostor opremljen “tjeralicom” (servomotor sa zastavicom i buzzer), kako bi navečer potjerao piliće u objekt. Kada PIR senzorom utvrdimo da su svi pilići napustili vanjski prostor, automatski zatvaramo vrata.

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.

Drugi projekti