Pametna vanjska rasvjeta
Elektrotehnička i ekonomska škola Nova GradiškaIzrađeno je upravljanje vanjskom rasvjetom ceste i parka putem mobilne aplikacije. Kao model odabran je park u Starom Petrovom Selu, rodnom mjestu učenika Ivana Paunova. Park je podijeljen u 3 sektora: rasvjeta ceste, te dva segmenta parka. Pomoću LED dioda simuliraju se pojedine svjetiljke u parku i na cesti, a pomoću modula sa RGB diodom simulira se boja rasvjete koja može biti ugrađena u park. Napravljena su tri moda rada: ručni, putem senzora i putem timera. U ručnom načinu korisnik sam putem aplikacije pali ili gasi pojedini segment rasvjete. Paljenje rasvjete putem senzora odvija se preko modula sa fotootpornikom, koji mjeri razinu dnevne svjetlosti. U trećem modu korisnik u aplikaciji postavlja vrijeme paljenja i gašenja rasvjete. Pomoću zeRGBa widgeta korisnik odabire boju rasvjete u parku te preko klizača postavlja intenzitet svjetlosti rasvjete. Ove opcije se mogu koristiti u sva tri moda rada.
Video snimka
Izrada projekta
Mobilna aplikacija
Pomoću menu widgeta odabire se mod rada: ručno, senzor ili timer. Pomoću zeRGBa widgeta odabire se boja rasvjete u parku a pomoću slider widgeta odabire se intenzitet rasvjete. Ove opcije su dostupne u sva tri moda rada. Za ručni mod koriste se 3 button widgeta za paljenje pojedinog segmenta rasvjete. RGB modul povezan je sa park1 button widgetom. Ako se odabire senzor mod rasvjete omogućuje se automatsko paljenje rasvjete kada nastane mrak i gašenje rasvjete kada izađe sunce. Za timer mod koriste se RTC i time input widget. RTC se koristi za očitanje trenutnog vremena a time input widget omogućuje korisniku postavljanje vremena paljenja i gašenja rasvjete.
Shema projekta
Na pin D7 spojene su LED diode koje predstavljaju rasvjetu ceste. Na pin D8 spojene su LED diode prvog dijela parka, a na D9 LED diode drugog dijela parka. LED RGB modul spojen je na pinove D3,D4 i D5. Vrijednost fotootpornika se očitava preko ulaza A6.
Shemu ovoga projekta možete preuzeti ovdje.
Arduino program
#define BLYNK_PRINT /* #define BLYNK_PRINT Serial #include #include #include #include #include #include /* broj pina na koji se spajaju LED diode i senzor*/ int ledR = 3, ledG = 4, ledB = 5; int ledCesta = 7, ledPark1 = 8, ledPark2 = 9; int sensor = A6; /*inicijalizacija varijabli korištenih u projektu */ int R, G, B; // vrijednosti za RGB diodu primljene iz zeRGBa widgeta bool cesta, park1, park2; // varijable za spremanje stanja buttona int mode; // u varijablu mode se sprema nacin rasvjete 1-rucno, 2- senzor, 3-timer int foto,slider = 50; //ocitanje analognog ulaza sa fotootpornika i slider widgeta bool isFirstConnect = 1; //pomoćna varijabla za početno spajanje na Blynk server long startsecondswd; //varijabla za pocetno vrijeme iz time input widgeta long stopsecondswd; //varijabla za konačno vrijeme iz time input widgeta long nowseconds; //varijabla za trenutno vrijeme iz RTC widgeta /* podatci o wifi mreži i tokenu projekta */ char auth[] = "7f3363218b4b4184b40e6ee47d95c036"; char ssid[] = "Arduino"; char pass[] = "rasvjeta"; SimpleTimer timer; //inicijalizacija timer objekta, za periodičko čitanje virtualnih pinova WidgetRTC rtc; //inicijalizacija RTC objakta void setup() { /* inicijalizacija ulaza i izlaza*/ pinMode(ledR, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledB, OUTPUT); pinMode(ledCesta, OUTPUT); pinMode(ledPark1, OUTPUT); pinMode(ledPark2, OUTPUT); pinMode(sensor, INPUT); /*inicijalizacija serijske komunikacije - korištena za testiranje*/ Serial.begin(9600); Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442); //spajanje na Blynk server rtc.begin(); //pokretanje RTC objekta timer.setInterval(10000L, syncVrijeme); //postavljanje vremena na 10s - za citanje virtualnih pinova } /* funkcija koja se pokreće kada se Arduino prvi put spoji na server, pomoću naredbe Blynk.syncAll() očitava sve vrijednosti sa virtualnih pinova*/ BLYNK_CONNECTED() { if (isFirstConnect) { Blynk.syncAll(); isFirstConnect = false; } } void loop() { Blynk.run(); //pokretanje Blynk komunikacije timer.run(); //pokretanje timera foto = analogRead(A6); //očitanje vrijednosti analognog pina sa fotootpornika if (foto < 200 && mode == 2) //ako je vrijednost sa fotootpornika manja od 200 i odabran je automatski mod { //ugasi svu rasvjetu analogWrite(ledCesta, 0); analogWrite(ledPark1, 0); analogWrite(ledPark2, 0); analogWrite(ledR, 0); analogWrite(ledG, 0); analogWrite(ledB, 0); } else if (mode == 2 && foto >= 200) //ako je vrijednost veća od 200 upali svu rasvjetu { analogWrite(ledCesta, slider); // upali segmente rasvjete intenzitetom postavljenim preko slider widgeta analogWrite(ledPark1, slider); analogWrite(ledPark2, slider); analogWrite(ledR, R); //upali RGB diodu prema boji namještenoj preko zeRGBa widgeta analogWrite(ledG, G); analogWrite(ledB, B); } } void syncVrijeme() //funkcija kojoj smo prethodno pomoću timera namjestili ponavljanje svakih 10s { if (mode == 3) //ako je odabran timer mod rasvjete osvježava vrijeme za paljenje i gašenje rasvjete { Blynk.syncVirtual(V4); } } /* funkcije za očitanje virtualnih pinova, pokreću se kada se promjeni stanje na widgetima */ /*očitavanje vrijednosti virtualnog pina VO. Na VO spojen je menu widget, odabir se sprema u varijablu mode: 1-ručno, 2-senzor, 3- timer */ BLYNK_WRITE(V0) { mode = param.asInt(); } /*očitavanje vrijednosti virtualnog pina V1. Na V1 spojen je button widget, pomoću kojeg se upali ili ugasi rasvjeta ceste u ručnom modu */ BLYNK_WRITE(V1) { cesta = param.asInt(); if (cesta == 1 && mode == 1) //ako je button widget pritisnut i odabran je ručni mod { analogWrite(ledCesta, slider); //upali rasvjetu ceste intenzitetom namještenim sliderom } if (cesta == 0 && mode == 1) //ako button widget nije pritisnut { analogWrite(ledCesta, 0); //ugasi rasvjetu ceste } } /*očitavanje vrijednosti virtualnog pina V2. Na V2 spojen je button widget, pomoću kojeg se upali ili ugasi rasvjeta prvog dijela parka i LED dioda u ručnom modu */ BLYNK_WRITE(V2) { park1 = param.asInt(); if (park1 == 1 && mode == 1) //ako je button widget pritisnut i odabran je ručni mod { analogWrite(ledPark1, slider); //upali rasvjetu parka intenzitetom namještenim sliderom analogWrite(ledR, R); //upali RGB diodu, prema vrijednostima iz zeRGBa widgeta analogWrite(ledG, G); analogWrite(ledB, B); } if (park1 == 0 && mode == 1) //ako button widget nije pritisnut { analogWrite(ledPark1, 0); //ugasi rasvjetu parka i RGB diodu analogWrite(ledR, 0); analogWrite(ledG, 0); analogWrite(ledB, 0); } } /*očitavanje vrijednosti virtualnog pina V3. Na V3 spojen je button widget, pomoću kojeg se upali ili ugasi rasvjeta drugog dijela parka u ručnom modu korištena identična logika kao i za rasvjetu ceste*/ BLYNK_WRITE(V3) { park2 = param.asInt(); if (park2 == 1 && mode == 1) { analogWrite(ledPark2, slider); } if (park2 == 0 && mode == 1) { analogWrite(ledPark2, 0); } } /*očitanje vrijednosti virtualnog pina V5 Na V5 spojen je slider widget, pomoću kojeg se namješta intenzitet svjetljenja rasvjete u svim modovima*/ BLYNK_WRITE(V5) { slider = param.asInt(); Blynk.syncVirtual(V1); //nakon spremanja vrijednosti slidera, ponovno se očitavaju V1, V2 i V3, kako bi se mogao Blynk.syncVirtual(V2); // promjeniti intenzitet LED dioda Blynk.syncVirtual(V3); //potrebno zato što BLYNK_WRITE osvježava vrijednosti samo kada nastaje promjena na widgetu // a unutar BLYNK_WRITE se upravlja LED diodama } /*očitanje vrijednosti virtualnog pina V6 Na V6 spojen je zeRGBa widget, pomoću kojeg se namješta boja RGB rasvjete u svim modovima*/ BLYNK_WRITE(V6) //rgb led { R = param[0].asInt(); //R komponenta boje G = param[1].asInt(); //G komponenta boje B = param[2].asInt(); //B komponenta boje Blynk.syncVirtual(V2); // osvježavanje vrijednosti buttona2 i timera, kako bi se mogla promjeniti boja LED diode Blynk.syncVirtual(V4); } /*očitanje vrijednosti virtualnog pina V4 Na V6 spojen je time input widget, pomoću kojeg se namješta vrijeme paljenja i gašenja rasvjete u timer modu*/ /* odabrano vrijeme se uspoređuje sa trenutnim vremenom dobivenim preko RTC widgeta te u ovisnosti o postavljenom vremenu upali ili ugasi rasvjetu*/ BLYNK_WRITE(V4) { TimeInputParam t(param); //spremanje odabranih vremena u t objekt nowseconds = ((hour() * 3600) + (minute() * 60) + second()); // pretvaranje trenutnog vremena u sekunde if (t.hasStartTime()) //ako je u widgetu postavljeno vrijeme paljenja rasvjete { startsecondswd = (t.getStartHour() * 3600) + (t.getStartMinute() * 60); // pretvaranje vremena paljenja rasvjete u sekunde if (nowseconds >= startsecondswd && mode == 3) // ako je trenutno vrijeme veće od vremena paljenja i odabran je timer mod { analogWrite(ledCesta, slider); // upali svu rasvjetu analogWrite(ledPark1, slider); analogWrite(ledPark2, slider); analogWrite(ledR, R); analogWrite(ledG, G); analogWrite(ledB, B); } } if (t.hasStopTime()) //ako je u widgetu postavljeno vrijeme gašenja rasvjete { stopsecondswd = (t.getStopHour() * 3600) + (t.getStopMinute() * 60); // pretvaranje vremena gašenja rasvjete u sekunde if (nowseconds >= stopsecondswd && nowseconds <= startsecondswd && mode == 3) //ako je trenutno vrijeme u intervalu između gašenja i paljenja rasvjete { analogWrite(ledCesta, 0); // ugasi svu rasvjetu analogWrite(ledPark1, 0); analogWrite(ledPark2, 0); analogWrite(ledR, 0); analogWrite(ledG, 0); analogWrite(ledB, 0); } if (nowseconds <= stopsecondswd && mode == 3) // ako je trenutno vrijeme manje od vremena gašenja rasvjete { analogWrite(ledCesta, slider); //upali svu rasvjetu analogWrite(ledPark1, slider); analogWrite(ledPark2, slider); analogWrite(ledR, R); analogWrite(ledG, G); analogWrite(ledB, B); } } }
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt su izradili Ivan Paunov i Filip Cica uz mentorstvo Borisa Grgića iz Elektrotehnička i ekonomska škola Nova Gradiška.
Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.