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.



