Pametna ulična rasvjeta
Tehnička škola BjelovarVideo snimka
Izrada projekta
Nakon što smo napravili sve bandere i provukli žice, namontirali smo sve bandere na postolje, provukli žice i provjerili radi li sve.
Mobilna aplikacija
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.