Connect IT Pametni hodnik

Connect IT Slavonski Brod

Hodnik koji vodi od ulaza do naše učionice/radionice danju je zbog prozora dobro osvijetljen. No često se razne aktivnosti naše udruge zbivaju u večernjim satima, kada je u hodniku mrak. Tada su u njemu svjetla (najčešće cijelo vrijeme) upaljena, iako za to nema potrebe. Zato smo osmislili sustav koju bi niz žarulja duž hodnika palio i gasio kako se netko kreće hodnikom.

Za to nam je bio potreban veći broj senzora koji bi detektirali kretanje, pa smo odlučili “posuditi” ultrazvučne senzore s naših m-bot robota. 10 robota -10 senzora… to bi trebalo biti dovoljno za cijeli hodnik. Izračunali smo da je 5 žarulja dovoljno za duljinu hodnika, pa smo pribavili i 5 releja. Tako je svaka žarulja pokrivena s 2 senzora. Hodnik je širok oko 120 cm, pa smo podesili Arduino da (pomoću “ping”-a) izračuna najmanju udaljenost nekog predmeta od senzora. Ako je ta udaljenost manja od 100 cm, znači da netko prolazi hodnikom, te se šalje signal releju da uključi žarulju za koju je “zadužen” taj senzor. Nakon što osoba prođe pored senzora, udaljenost ponovno postave veća od 100 cm i žarulja se gasi. Na Arduino pločicu je spojen i senzor osvjetljenja (Photo Resistor Sensor Module) koji čitav sustav isključuje kada je osvjetljenje u hodniku dovoljno.
U projektu se za napajanje žarulja koristi visoki napon (220V) koji može biti opasan, te je čitav projekt rađen uz veliki oprez te posebnu pažnju mentora.
Sustav je još uvijek daleko od idealnog. Bilo bi potrebno još dosta dotjerivanja (i tehničkog i programskog) kako bi zaista bio funkcionalan. Ipak, nama kao početnicima u radu s Arduinom, bio je jako zanimljiv i poučan, te vjerujemo da smo ipak učinili jedan korak naprijed, kako u našem znanju, tako i u modernizaciji našeg prostora i nastojanjima za uštedom energije.

Video snimka
Izrada projekta

Na ovoj fotografiji gotovog projekta, u šumi kablova, nemoguće je bilo što raspoznati. No, stvar je jednostavna. 10 ultrazvučnih senzora raspoređeno je na udaljenost po cca. 50 cm. Svi su spojeni na izvode 5V i GND. Svaki od signalnih izvoda je spojen na pinove u “donjem redu” (1-5;17-21) Svih 5 releja je spojeno na VCC i GND. Svaki signalni izvod je spojen na pinove u “gornjem redu” (7-11) Senzor osvjetljenja je spojen na 5V, GND i pin 12.

Na ovom (pojednostavljenom) primjeru na Arduino pločicu spojeni su samo jedan ultrazvučni senzor i jedan relej. Narančasto – 5V Žuto – GND Bijelo, sivo – VCC (3.3V) Zeleno – signal ultrazvučnog senzora (na pin 5) Plavo – signal releja (na pin 6).

Mobilna aplikacija

Ovaj projekt zamislili smo tako da radi bez mobilne aplikacije, te ona nije implementirana u ovoj inačici. Ideja za moguću nadogradnju bila bi mogućnost da se cijeli sustav uključuje i isključuje putem aplikacije. Također za neku buduću nadogradnju ostaje mogućnost daljinskog podešavanja parametara (minimalna razina osvjetljenja koja isključuje sustav, udaljenost za svaki pojedini senzor (npr. ako na sredinu hodnika postavimo biljku, tada na je na tom senzoru potrebno smanjiti udaljenost).. itd).

Shema projekta

Shema je pojednostavljena (2 senzora i 2 releja) Crveno – 5V Crno – GND Narančasto – VCC (3.3V) Plavo, Ljubičasto – signal ultrazvučnog senzora (pin 5, 4…) Zeleno, Žuto – signal releja (pin 6, 7…).

Arduino program

#define BLYNK_PRINT /*

#define ON LOW //relej se aktivira na LOW signal
#define OFF HIGH // na signal HIGH relej se isključuje
#define Pauza 1000 // vrijeme koje će žarulja ostati uključena nakon što senzor isključi relej

int svjetlo1 = 7; // pinovi za spajanje releja (žarulja) – “gornji red”
int svjetlo2 = 8;
int svjetlo3 = 9;
int svjetlo4 = 10;
int svjetlo5 = 11;

int senzor_svjetla = 12; // senzor osvjetljenja

int senzor1 = 5; // pinovi za spajanje ultrazvučnih senzora – “donji red”
int senzor2 = 4;
int senzor3 = 3;
int senzor4 = 2;
int senzor5 = 1;
int senzor6 = 21;
int senzor7 = 20;
int senzor8 = 19;
int senzor9 = 18;
int senzor10 = 17;

long duration1, distance1; // duration – vremenski period “ping”-a potreban za računanje udaljenosti
long duration2, distance2; // distance – udaljenost najbliže prepreke u cm
long duration3, distance3; // varijable su definirane za svaki senzor posebno
long duration4, distance4;
long duration5, distance5;
long duration6, distance6;
long duration7, distance7;
long duration8, distance8;
long duration9, distance9;
long duration10, distance10;

unsigned long time1, time2, time3, time4, time5; //vrijeme proteklo od paljenja svakog releja (Žarulje)

void setup() {

pinMode(svjetlo1, OUTPUT); // sve pinove za svjetlo postavi u izlazni mod
pinMode(svjetlo2, OUTPUT);
pinMode(svjetlo3, OUTPUT);
pinMode(svjetlo4, OUTPUT);
pinMode(svjetlo5, OUTPUT);

pinMode(senzor_svjetla, OUTPUT); // pin za senzor svjetla postavi u izlazni mod
9
digitalWrite(svjetlo1, OFF); // isključi sva svjetla (postavi pinove u stanje OFF (HIGH))
digitalWrite(svjetlo2, OFF);
digitalWrite(svjetlo3, OFF);
digitalWrite(svjetlo4, OFF);
digitalWrite(svjetlo5, OFF);

}

void loop() {
int osvjetljenje = analogRead(senzor_svjetla); //analogno očitaj stanje senzora osvjetljena
if (osvjetljenje > 200) { //veći broj označava manju svjetlost. Ocijenili smo da je iznos manji od 200 dovoljna osvjetljenot
// ako je iznos osvjetljenja veći od 200 izvrši sljedeći blok naredbi (koji čini cijeli program)

ping(senzor1); // pozovi funkciju “ping” na senzoru 1
duration1 = pulseIn(senzor1, HIGH); //očitaj vrijeme potrebno da se signal vrati do senzora
distance1 = microsecondsToCentimeters(duration1); // pomoću funkcije “microsecondsToCentimeters” izračunaj udaljenost

ping(senzor2);
duration2 = pulseIn(senzor2, HIGH);
distance2 = microsecondsToCentimeters(duration2);

if (prolaz(distance1) || prolaz(distance2)){ // ako je funkcija “prolaz” na bilo kojem senzoru u prvom paru istinita
time1 = millis(); // vrijeme kad se pali prva žarulja
digitalWrite(svjetlo1, ON); // upali prvu žarulju
}else{ // ako je funkcija “prolaz” = false
if (millis()-time1 > Pauza){ // ako je proteklo više vremena od onog definiranog u varijabli Pauza (1 sekunda)
digitalWrite(svjetlo1, OFF); // isključi žarulju
time1 = millis(); //resetiraj vrijem paljenja prve žarulje
}
}
//gore upisani komentari vrijede dalje za svako svjetlo i svaki par senzora

ping(senzor3);
duration3 = pulseIn(senzor3, HIGH);
distance3 = microsecondsToCentimeters(duration3);

ping(senzor4);
duration4 = pulseIn(senzor4, HIGH);
distance4 = microsecondsToCentimeters(duration4);

if (prolaz(distance3) || prolaz(distance4)){
time2 = millis();
digitalWrite(svjetlo2, ON);
}else{
if (millis()-time2 > Pauza){
digitalWrite(svjetlo2, OFF);
time2 = millis();
}
}

ping(senzor5);
duration5 = pulseIn(senzor5, HIGH);
distance5 = microsecondsToCentimeters(duration5);

ping(senzor6);
duration6 = pulseIn(senzor6, HIGH);
distance6 = microsecondsToCentimeters(duration6);

if (prolaz(distance5) || prolaz(distance6)){
time3 = millis();
digitalWrite(svjetlo3, ON);
}else{
if (millis()-time3 > Pauza){
digitalWrite(svjetlo3, OFF);
time3 = millis();
};
}

ping(senzor7);
duration7 = pulseIn(senzor7, HIGH);
distance7 = microsecondsToCentimeters(duration7);

ping(senzor8);
duration8 = pulseIn(senzor8, HIGH);
distance8 = microsecondsToCentimeters(duration8);

if (prolaz(distance7) || prolaz(distance8)){
time4 = millis();
digitalWrite(svjetlo4, ON);
}else{
if (millis()-time4 > Pauza){
digitalWrite(svjetlo4, OFF);
time4 = millis();
}
}

ping(senzor9);
duration9 = pulseIn(senzor9, HIGH);
distance9 = microsecondsToCentimeters(duration9);

ping(senzor10);
duration10 = pulseIn(senzor10, HIGH);
distance10 = microsecondsToCentimeters(duration10);

if (prolaz(distance9) || prolaz(distance10)){
time5 = millis();
digitalWrite(svjetlo5, ON);
}else{
if (millis()-time5 > Pauza){
digitalWrite(svjetlo5, OFF);
time5 = millis();
}
}
}
}

boolean prolaz (int distance){ //funkcija prolaz prima kao parametar udaljenost od ultrazvučnog senzora
int D = 100; // udaljenost za aktivaciju svjetla je 100 cm
if (distance < D && distance != 0){ // ako je udaljenost manja od 100 cm
// i različita od 0 (ovaj uvjet je dodan jer smo u praksi uočili da senzor ponekad (iz nepoznatog razloga) bilježi udaljenost 0
return true; //vrati vrijednost “true” – upalit će povezano svjetlo
}else{
return false; //vrati vrijednost “false” – ugasit će povezano svjetlo
}
}

void ping(int pin) { //standarsno arduino primjer “ping” pretvoren u funkciju kojoj kao parameta pridružujemo naziv (pin) senzora
pinMode(pin, OUTPUT);

digitalWrite(pin, LOW);
delayMicroseconds(2);

digitalWrite(pin, HIGH);
delayMicroseconds(10);
digitalWrite(pin, LOW);

pinMode(pin, INPUT);
}

long microsecondsToCentimeters(long microseconds) {// funkcija koja preračunava trajanje “ping”-a u centimetre
return microseconds / 29 / 2;
}

Arduino program ovoga projekta možete preuzeti ovdje.

Autori

Projekt su izradili Dominik Lovrić i Mihael Lovrić uz mentorstvo Hrvoja Ćosića iz Connect IT Slavonski Brod.

 

Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.