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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
#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.