Pametna ulična rasvjeta

Tehnička škola Bjelovar

Projekt pokazuje način rada ulične rasvjete, koja se može koristiti na cestama izvan gradova pri čemu bi se štedjela električna energija. Rasvjeta ima više načina rada kako bi se pokazala kakve se može kontrola imati nad takvom rasvjetom.

Video snimka
Izrada projekta

Izrada bandera i provlačenje žica kroz bandere.

Nakon što smo napravili sve bandere i provukli žice, namontirali smo sve bandere na postolje, provukli žice i provjerili radi li sve.

Spajanje LED diode na MKR 1000, prema shemi kako bi radio posebni način multipleksiranja.

Spajanje ultrasoničnih senzora na Arduino prema shemi.

Mobilna aplikacija

Slika aplikacije za upravljanje pametnom rasvjetom.

Slika kako je napravljen menu za odabir.

Shema projekta

Shema na desno strani prikazuje Arduino mega (koji glumi MKR 1000) spojen na mrežu LED dioda, koju upravlja na način na koji mi želimo. Na lijevoj strani Arduino mega na kojeg je spojeno 6 HC-SR04 senzora za mjerenje udaljenosti koji javljaju preko serijske komunikacije gdje se nalazi auto.

 

Shemu ovoga projekta možete preuzeti ovdje.

Arduino program

#define BLYNK_PRINT /*

#include
#include
#include

#define BLYNK_PRINT Serial

int led[13][2] = { //Tablica ledica, potrebna dva pita radi multipleksiranja
{0,7}, //1 0 broj 16 nema veze s ni jednim pinom, tamo stoji samo tako da bude neki broj
{1,16}, //2 1
{10,16},//3 2
{3,16}, //4 3
{4,7}, //5 4
{0,8}, //6 5
{4,8}, //9 6
{5,7}, //10 7
{5,8}, //11 8
{6,7}, //12 9
{6,8}, //13 10
{2,7}, //14 11
{2,8} //15 12
};

int nacin_rada = 0; //Sluzi za pospremanje vrijednosti nacina rada iz Blynk aplikacije
int trenutno_stanje = 0; //Pomocna varijabla za provjeru u prekidanju petlje

char auth[] = “16e0da18ec8043998a43b7d9f89c4f0f”; //Token
char ssid[] = “Ksenija”; //Ime wifia
char pass[] = “mmbr9C3J”; //Šiffra wifia

void Pali_odredenu(int); //Funkcija za paljenje određene ledice
void Gasi_odredenu(int); //Funkcija za gašenje određene ledice
void Gasi_sve(); //Funkcija za gašenje svih ledica
void ON(); //Funkcija glavnog autonomnog nacina rada pametne rasvijete
void OFF(); //Funkcija koja gasi svu rasvijetu i ostavlja ju ugasenu
void ODRZAVANJE(); //Funkcija za paljenje načina rada gdje se privjerava dali je svaka ledica ispravna
void PISTA(); //Funkcija za paljenje načina rada gdje svijetla glume pistu za sljetanje
void KAOS(); //Funkcija za paljenje načina rada gdje se svijetla ponašaju kao da je apokalipsa

BLYNK_WRITE(V0) //Blynk funkcija za uzivanje vrijednosti sa virtualnog pina V0
{
nacin_rada = param.asInt();
}

void setup()
{
Serial1.begin(9600); //Pokretanje serijeske komunikacije
Blynk.begin(auth, ssid, pass); //Spajanje MKR-a na internet
for(int i=0;i<11;i++) //Postavljanje digitalnih pinova na HIGH
pinMode(i,OUTPUT);
}

void loop()
{
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
switch(nacin_rada){ //Provjera koji način rada želimo
case 1: { //Pokretanje funkcije ON()
trenutno_stanje = 1;
ON();
break;
}
case 2: { //Pokretanje funkcije OFF()
trenutno_stanje = 2;
OFF();
break;
}
case 3: { //Pokretanje funkcije ODRZAVANJE()
trenutno_stanje = 3;
ODRZAVANJE();
break;
}
case 4: { //Pokretanje funkcije PISTA()
trenutno_stanje = 4;
PISTA();
break;
}
case 5: { //Pokretanje funkcije KAOS()
trenutno_stanje = 5;
KAOS();
break;
}
}
}

void Pali_odredenu(int trenutna) //Funkcija za paljenje određene ledice
{
digitalWrite(led[trenutna-1][0],1); //Pošto koristimo multipliciranje ledica, moramo paliti dva pina odjednom
digitalWrite(led[trenutna-1][1],1);
}

void Gasi_odredenu(int prijsanja) //Funkcija za gašenje određene ledice
{
digitalWrite(led[prijsanja-1][0],0); //Pošto koristimo multipliciranje ledica, moramo gasiti dva pina odjednom
digitalWrite(led[prijsanja-1][1],0);
}

void Gasi_sve() //Funkcija za gašenje svih ledica
{
for(int i=0;i<11;i++) //Najlakše gasimo sve ledica tako da sve pinove stavimo na 0
digitalWrite(i,0);
}

void ON() //Funkcija glavnog autonomnog nacina rada pametne rasvijete
{
Pali_odredenu(3); //Pošto su kružanja malo opasnija mjesta prometa, tamo svijetlo stalno radi
int pozicija,trenutna_pozicija=-1; //Pošto sve ledice rade u parvima onda mozemo onda tranzistora stavit da propuštaju struju
digitalWrite(7,1);
digitalWrite(8,1);
while(1){ //Petlja u kojoj gledamo gdje se nalazi auto i tako palimo svijetla
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Serial1.write(2); //Slanje vrijednosti koje obaviještava drugi arduino da ne šalje ništa
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Serial1.write(1); //Govorimo drugom arduinu da počne slati vrijednosti
delay(100);
if(Serial1.available()){ //Provjeravamno jeli nešto poslano
pozicija = Serial1.read(); //Čitanje primljene vrijednosti
if(pozicija!=trenutna_pozicija){ //Prvjera jeli auto promjenio poziciju s jedne bandere na drugu
trenutna_pozicija=pozicija; //Ako je mjenjamo stanje auta
Gasi_sve(); //Gasimo sve ledice i tranzistore
}
}
switch(pozicija){ //Biranje pozicije auta
case 1:{ //Prva pozicija lijevo
digitalWrite(led[0][0],1);
break;
}
case 2:{ //Prva pozicija dolje
digitalWrite(led[9][0],1);
break;
}
case 3:{ //Prva pozicija desno
digitalWrite(led[4][0],1);
break;
}
case 4:{ //Druga pozicija lijevo
digitalWrite(led[0][0],1);
digitalWrite(led[1][0],1);
break;
}
case 5:{ //Druga pozicija dolje
digitalWrite(led[7][0],1);
digitalWrite(led[9][0],1);
break;
}
case 6:{ //Druga pozicija desno
digitalWrite(led[3][0],1);
digitalWrite(led[4][0],1);
break;
}
case 7:{ //Ispred raskrizja lijeva
digitalWrite(led[0][0],1);
digitalWrite(led[1][0],1);
break;
}
case 8:{ //Ispred raskrizja dolje
digitalWrite(led[9][0],1);
digitalWrite(led[7][0],1);
break;
}
case 9:{ //Ispred raskrizja desno
digitalWrite(led[4][0],1);
digitalWrite(led[3][0],1);
break;
}
case 10:{ //Raskrizju
digitalWrite(led[1][0],1);
digitalWrite(led[3][0],1);
digitalWrite(led[7][0],1);
break;
}
}
}
}

void OFF() //Funkcija koja gasi svu rasvijetu i ostavlja ju ugasenu
{
Gasi_sve(); //Gasimo sve ledice
while(1){ //Ulazimo u petlju koja ne dopušta završetak funkcije
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
}
}

void ODRZAVANJE() //Funkcija za paljenje načina rada gdje se privjerava dali je svaka ledica ispravna
{
Gasi_sve();
while(1){ //Petlja koja ne dopušta završetak funkcije
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
for(int i=1;i<14;i++){ //Petlja za paljenje ledica
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(i); //Paljnje i-te ledice
delay(1000);
Gasi_odredenu(i); //Gašenje i-te ledice
}
}
}

void PISTA() //Funkcija za paljenje načina rada gdje svijetla glume pistu za sljetanje
{
Gasi_sve();
while(1){ //Petlja koja ne dopušta završetak funkcije
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(1); //Paljenje prvog para banderi
Pali_odredenu(6);
delay(500);
Gasi_odredenu(1); //Gašenje prvog para banderi
Gasi_odredenu(6);
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(2); //Paljenje drugog para banderi
Pali_odredenu(12);
delay(500);
Gasi_odredenu(2); //Gašenje drugog para banderi
Gasi_odredenu(12);
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(3); //Paljenje središnje bandere
delay(500);
Gasi_odredenu(3); //Gašenje središnje bandere
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(4); //Paljenje treceg para banderi
Pali_odredenu(13);
delay(500);
Gasi_odredenu(4); //Gašenje treceg para banderi
Gasi_odredenu(13);
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Pali_odredenu(5); //Paljenje četvrtog para banderi
Pali_odredenu(7);
delay(500);
Gasi_odredenu(5); //Gašenje četvrtog para banderi
Gasi_odredenu(7);

}

}

void KAOS() //Funkcija za paljenje načina rada gdje se svijetla ponašaju kao da je apokalipsa
{
int trenutna1= random(1,13),trenutna2= random(1,13),trenutna3= random(1,13); //Uziamnje inicijalne vrijednosti za bandere
Gasi_sve();
while(1){ //Petlja koja ne dopušta završetak funkcije
Blynk.run(); //Uzimanje vrijednosti s Blynk aplikacije
if(nacin_rada != trenutno_stanje){ //Provjera dali se stanje rada promijenilo
Gasi_sve(); //Gasimo sve ledice i tranzistore
break;
}
Gasi_odredenu(trenutna1); //Gašenje random bandere
trenutna1 = random(1,13); //Uzimanje nove vrijednosti za random bandere
Pali_odredenu(trenutna1); //Paljenje random bandere
delay(300);
Gasi_odredenu(trenutna2); //Gašenje random bandere
trenutna2 = random(1,13); //Uzimanje nove vrijednosti za random bandere
Pali_odredenu(trenutna2); //Paljenje random bandere
delay(300);
Gasi_odredenu(trenutna3); //Gašenje random bandere
trenutna3 = random(1,13); //Uzimanje nove vrijednosti za random bandere
Pali_odredenu(trenutna3); //Paljenje random bandere
delay(300);
}
}

Arduino program ovoga projekta možete preuzeti ovdje.

#define BLYNK_PRINT /*

#include //Library za Ultrasoonične senzore HC-SR04

NewPing sonar1(3,2,20); //Incijalizacije prvog senzora
NewPing sonar2(5,4,20); //Incijalizacije drugog senzora
NewPing sonar3(7,6,100); //Incijalizacije trečeg senzora
NewPing sonar4(9,8,100); //Incijalizacije četvrtog senzora
NewPing sonar5(11,10,20); //Incijalizacije petog senzora
NewPing sonar6(13,12,20); //Incijalizacije šestog senzora

int mod = 2; //Varijabla kojom provjera morali slati podatke ili jos uvjek ceka

void Interupt(); //Funkcija koja provjera jeli potrebno išta slati

void setup() {
Serial.begin(9600);
}

void loop() {
while(mod==2){ //Ceka da glavni arduino krene u ON funkciju
if(Serial.available()){
mod = Serial.read();
}
}
while(mod==1){
delay(50);
Interupt();
unsigned int uS1 = sonar1.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s prvog senzora
unsigned int uS2 = sonar2.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s drugog senzora
unsigned int uS3 = sonar3.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s trečeg senzora
unsigned int uS4 = sonar4.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s četvrtog senzora
unsigned int uS5 = sonar5.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s petog senzora
unsigned int uS6 = sonar6.ping()/ US_ROUNDTRIP_CM;; //Dobivanje vrijednosti udaljenosti s šestog senzora
if(uS6!=0) //Provjera i slanje pozicije
Serial.write(4);
if(uS5!=0) //Provjera i slanje pozicije
Serial.write(7);
if(uS4>0&&uS4<20) //Provjera i slanje pozicij Serial.write(10); if(uS4>20&&uS4<45) //Provjera i slanje pozicije Serial.write(8); if(uS4>45&&uS4<65) //Provjera i slanje pozicije Serial.write(5); if(uS4>65) //Provjera i slanje pozicije
Serial.write(2);
if(uS2!=0) //Provjera i slanje pozicije
Serial.write(9);
if(uS1!=0) //Provjera i slanje pozicije
Serial.write(6);
}
}

void Interupt()
{
if(Serial.available()){
mod = Serial.read();
}
}

Arduino program ovoga projekta možete preuzeti ovdje.

Autori

Projekt su izradili Matija Rajković i Luka Ravenščak uz mentorstvo Ljudevita Sakala iz Tehničke škole Bjelovar.

 

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