Svjetlosni komunikator
Tehnička škola,Rijeka, u suradnji sa Centrom tehničke kulture RijekaVideo snimka
Izrada projekta
Projekt se sastoji od glavnog dijela i niza senzora koji javljaju korisniku uvjete iz okoline kao niz svjetlosnih signala.
Mobilna aplikacija
Shema projekta
Opis je u shemi.
Shemu ovoga projekta možete preuzeti ovdje.
Arduino program
#define BLYNK_PRINT /* void kisa(){ //Funkcija "kisa()" koja ce se poslije moci pozvati u glavni program. String currentTime = String(hour()) + ":" + minute() + ":" + second()+" "; //Odredivanje vremena (sat,minuta,sekunda). String currentDate = String (day()) + "." + month() + "." + year()+" "; //Odredivanje datuma (dan,mjesec,godina). for (int i=0; i<60;i=i+20){ if( second()==i){ //Ako je uvjet "second()" jednako kao varijabla "i" onda izvrsi sljedece radnje. lcd.setCursor(0,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" Kisa pada "); //Na LCD-u ispisuje " Kisa pada ". lcd.setCursor(0,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("________________"); //Na LCD-u ispisuje "________________". delay(1000); //Zaustavljaju se radnje na 1000 milisekundi. lcd2.clear(); //Cisti sve sto je napisano na LCD-u na mobitelu. lcd2.print(0,0," Kisa pada "); //Na LCD-u na mobitelu ispisuje Kisa pada " na kordinati 0,0. lcd2.print(0,1,""); //Na LCD-u na mobitelu ispisuje "" na kordinati 0,1. } //Naredba "if( second()==i)" zavrsava. } //Naredba "for(int i=0; i<60;i=i+20)" zavrsava. } //Funkcija "kisa()" zavrsava. void kisa_led(){ //Funkcija "kisa_led()" koja ce se poslije moci pozvati u glavni program. String currentTime = String(hour()) + ":" + minute() + ":" + second()+" "; //Odredivanje vremena (sat,minuta,sekunda). String currentDate = String (day()) + "." + month() + "." + year()+" "; //Odredivanje datuma (dan,mjesec,godina). for (int i=2; i<60;i=i+20){ //Kada su minute if( minute()==i){ //Ako je uvjet "minute()" jednako kao varijabla "i" onda izvrsi sljedece radnje. for(int j=2; j<60;j=j+20){ // if( second()==j){ //Ako je uvjet "second()" jednako kao varijabla "j" onda izvrsi sljedece radnje. digitalWrite(pled,HIGH); //Digitalni izlaz "pled" postavi visoko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. digitalWrite(pled,LOW); //Digitalni izlaz "pled" postavi nisko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. digitalWrite(pled,HIGH); //Digitalni izlaz "pled" postavi visoko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. digitalWrite(pled,LOW); //Digitalni izlaz "pled" postavi nisko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. } //Naredba "if( second()==j)" zavrsava. } //Naredba "for(int j=2; j<60;j=j+20)" zavrsava. } //Naredba "if( minute()==i)" zavrsava. } //Naredba "for(int i=2; i<60;i=i+20)" zavrsava. } //Funkcija "kisa_led()" zavrsava. void clock_Display(){ //Funkcija "clock_Display()" koja ce se poslije moci pozvati u glavni program. String currentTime = String(hour()) + ":" + minute() + ":" + second()+" "; //Odredivanje vremena (sat,minuta,sekunda). String currentDate = String (day()) + "." + month() + "." + year()+" "; //Odredivanje datuma (dan,mjesec,godina). for (int i=0; i<60;i=i+5){ // if( second()==i){ //Ako je uvjet "second()" jednako kao varijabla "i" onda izvrsi sljedece radnje. lcd.setCursor(0,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" "); //Na LCD-u ispisuje " ". lcd.setCursor(3,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(currentDate); //Na LCD-u ispisuje varijablu "currentDate". lcd.setCursor(13,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" "); //Na LCD-u ispisuje " ". lcd.setCursor(0,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" "); //Na LCD-u ispisuje " ". lcd.setCursor(4,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(currentTime); //Na LCD-u ispisuje varijablu "currentTime". lcd.setCursor(12,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" "); //Na LCD-u ispisuje " ". } //Naredba "if( second()==i)" zavrsava. } //Naredba "(int i=0; i<60;i=i+5)" zavrsava. } //Funkcija "clock_Display()" zavrsava.
Arduino program ovoga projekta možete preuzeti ovdje.
#define BLYNK_PRINT /* int ocitanje_kisa=A2; //Analogni pin A2 se sprema u varijablu "ocitanje_kisa". int prozor_1=3; //Pin 3 se sprema u varijablu "prozor_1". int prozor_2=4; //Pin 4 se sprema u varijablu "prozor_2". int VRATA=5; //Pin 5 se sprema u varijablu "VRATA". const byte interruptPin = 7; //--------------------------------------------------------------------- #include // ovaj library radi ako je instaliran adafruit Universal Sensor library!!! //U program se dodaje library "DHT.h". #include //U program se dodaje library "DHT_U.h". #define DHTPIN 1 //Pin 1 se definira kao "DHTPIN". #define DHTTYPE DHT11 //Senzor DHT11 se definira kao "DHTTYPE". DHT dht(DHTPIN,DHTTYPE); //inicijalizacija senzora //---------------------------------------------------------------------// //Ovdje se postavljaju naredbe za mobilnu aplikciju Blynk. #define BLYNK_PRINT Serial //"BLYNK_PRINT" se definira kao Serial. #define BLYNK_READ(V1)//U primjerima fali #define //Virtualni pin V1 se definira. #define BLYNK_READ(V2)//omogućuje čitanje virtualnog pina kojeg koristimo u aplikaciji //Virtualni pin V2 se definira. #define BLYNK_READ(V3) //Virtualni pin V3 se definira. #include //U program se dodaje library "SPI.h". #include //U program se dodaje library "WiFi101.h". #include //U program se dodaje library "BlynkSimpleMKR1000.h". WidgetLCD lcd2(V3); //Virtualni pin V3 se odnosi za mobilnu aplikaciju Blynk i njezin display. //--------------------------------------------------------------------------------------// //Ovdje se dodaje library za brojac koji ce sluziti mobilnoj aplikaciji Blynk i za LCD zaslon. #include //U program se dodaje library "Time.h". #include //U program se dodaje library "TimeLib.h". #include //U program se dodaje library "WidgetRTC.h". WidgetRTC rtc; //Inicijalizacija "rtc-a". BlynkTimer timer; //Inicijalizacija "timer-a". //---------------------------------------------------------------------------------------- #include //U program se dodaje library "Wire.h". #include //U program se dodaje library "LiquidCrystal_I2C.h". LiquidCrystal_I2C lcd(0x27,16,2); //Inicijalizacija "lcd(0x27,16,2)". //Ovaj dio se odnosi na postavke mreže char auth[] = "c59aa3cc257f40afae777705601bb6eb"; //Dobiveni token od aplikacije blynk char ssid[] = "HUAWEI"; //Naziv mreze na koju se Arduino spaja. char pass[] = "1bfec1704636"; //Zaporka od mreze na koju se Arduino spaja. //------------------------------------------------------------------------------------------ volatile int cled=8; //Digitalni pin 8 se sprema u varijablu "cled" koja je odredena kao volatile int zato sto se mora koristiti u integeru. volatile int zled=6; //Digitalni pin 6 se sprema u varijablu "zled" koja je odredena kao volatile int zato sto se mora koristiti u integeru. volatile int pled=10; //Digitalni pin 10 se sprema u varijablu "pled" koja je odredena kao volatile int zato sto se mora koristiti u integeru. int LedState=LOW; //Varijabla "LedState" mora biti nisko. //-------------------------------------------------------------------------------------- BLYNK_CONNECTED() { //Konekcija aplikacije Bkynk na mobilnom uredaju. rtc.begin(); //Sinkronizacija tajmerasa aplikacijom Blynk. } //-- //----------------------------------------------------------------------------------- void setup() //Funkcija koja se izvrsi jedanput. //INPUT_PULLUP je ulaz koji koristi odredeni pullup otpornik. { pinMode (ocitanje_kisa,INPUT_PULLUP); //Varijabla "ocitanje_kisa" se odreduje kao ulazni pullup. pinMode(cled,OUTPUT); //Varijabla "cled" se odreduje kao izlaz. pinMode(pled,OUTPUT); //Varijabla "pled" se odreduje kao izlaz. pinMode(zled,OUTPUT); //Varijabla "zled" se odreduje kao izlaz. pinMode(prozor_1,INPUT_PULLUP); //Varijabla "prozor_1" se odreduje kao ulazni pullup. pinMode(prozor_2,INPUT_PULLUP); //Varijabla "prozor_2" se odreduje kao ulazni pullup. pinMode(VRATA,INPUT_PULLUP); //Varijabla "VRATA" se odreduje kao ulazni pullup. pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), kuckuc,CHANGE); Serial.begin(9600); //Pocetak komunikacije sa serial monitorom. Blynk.begin(auth, ssid, pass); //Pokretanje library-a "Blynk". dht.begin(); //Pokretanje library-a "dht". setSyncInterval(10 * 60); //Odredivanje intervala. timer.setInterval(10000L, clock_Display); //Odredivanje intervala. //-----------------------------------------------------------------------------------// //attachInterrupt(digitalPinToInterrupt(prekid), vrata,HIGH); lcd.init(); //Ispisuje poruku na LCD. lcd.backlight(); //Odreduje pozadinu zaslona. lcd.setCursor(1,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("Tehnicka skola"); //Na LCD-u ispisuje "Tehnicka skola". lcd.setCursor(5,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("RIJEKA"); //Na LCD-u ispisuje "RIJEKA". delay(5000); //Zaustavljaju se radnje na 5 sekundi. lcd.clear(); //Cisti sve sto je napisano na LCD zaslonu. } //Funkcija"void setup()" zavrsava. void loop() //Funkcija koja izvrsi svoju radnju i onda je ponavlja. { if(digitalRead(prozor_1)==HIGH){ //Ako je uvjet: "prozor_1" visoko ;onda izvrsi sljedecu radnje. prozor_p1(); //Radnja "prozor_p1" se izvrsava. }else{} //Ako uvjet nije tocan onda uradi sljedecu radnju(nema sljedece radnje). if(digitalRead(prozor_2)==HIGH){ //Ako je uvjet: "prozor_2" visoko ;onda izvrsi sljedecu radnje. prozor_p2(); //Radnja "prozor_p2" se izvrsava. }else{} //Ako uvjet nije tocan onda uradi sljedecu radnju(nema sljedece radnje). ocitanje_kisa=analogRead(A2); //Ocitanje sa alalognog pina A2 se sprema u varijablu "ocitanje_kisa". if(ocitanje_kisa>400){ //Ako je uvjet: "ocitanje_kisa" manje od 400 ;onda izvrsi sljedece radnje. //-- kisa(); //Radnja "kisa()" se izvrsava. kisa_led(); //Radnja "kisa_led" se izvrsava. } //Naredba "if(ocitanje_kisa>400)" zavrsava. if(ocitanje_kisa>400&&digitalRead(prozor_1)==HIGH){ //Ako je uvjet: "if(ocitanje_kisa>400&&digitalRead(prozor_1)==HIGH)";onda izvrsi sljedecu radnje. digitalWrite(pled, HIGH); //Digitalni izlat "pled" postavi visoko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. digitalWrite(pled,LOW); //Digitalni izlat "pled" postavi nisko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. lcd2.clear(); //Cisti sve sto je napisano na LCD-u na mobitelu. lcd2.print(0,0," Kisa pada "); //Na LCD-u na mobitelu ispisuje Kisa pada " na kordinati 0,0. lcd2.print(0,1," Prozor otvoren "); //Na LCD-u na mobitelu ispisuje " Prozor otvoren " na kordinati 0,1. } //Naredba "if(ocitanje_kisa>400&&digitalRead(prozor_1)==HIGH)" zavrsava. if(ocitanje_kisa>400&&digitalRead(prozor_2)==HIGH){ //Ako je uvjet: "if(ocitanje_kisa>400&&digitalRead(prozor_2)==HIGH)";onda izvrsi sljedecu radnje. digitalWrite(pled, HIGH); //Digitalni izlat "pled" postavi visoko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. digitalWrite(pled,LOW); //Digitalni izlat "pled" postavi nisko. delay(500); //Zaustavljaju se radnje na 500 milisekundi. lcd2.clear(); //Cisti sve sto je napisano na LCD-u na mobitelu. lcd2.print(0,0," Kisa pada "); //Na LCD-u na mobitelu ispisuje Kisa pada " na kordinati 0,0. lcd2.print(0,1," Prozor otvoren "); //Na LCD-u na mobitelu ispisuje " Prozor otvoren " na kordinati 0,1. } //Naredba "if(ocitanje_kisa>400&&digitalRead(prozor_2)==HIGH)" zavrsava. //Naredba "if(ocitanje_kisa>400)" zavrsava. float temp = dht.readTemperature(); //Ocitanje sa senzora za temperaturu se sprema u "temp". int val=temp; //Iznos od varijable "temp" se sprema u varijablu "val". if(temp>27) //Ako je uvjet: "temp" veci od 27 ;onda izvrsi sljedece radnje. { //-- blinkanje(); //Izvrsi radnju "blinkanje()". }else { //Ako uvjet nije tocan onda izvrsi sljedece radnje. LedState = LOW; //Varijabla "LedState" mora biti nisko. digitalWrite(cled, LedState); //Na digitalni izlaz "cled" izvrsi varijablu "LedState". } //Naredba else zavrsava. int V=digitalRead(VRATA); //Ocitanje sa digitalnog pina "VRATA" se sprema u varijablu V. if(V==HIGH) //Ako je uvjet: varijabla "V" visoko;onda izvrsi sljedece radnje. { //-- vrata(); //Radnja "vrata()" se izvrsava. delay(200); //Zaustavljaju se radnje na 200 milisekundi. } else if(V==LOW){ //Ako uvjet nije tocan;i ako je uvjet: varijabla "V" negativna(LOW) onda izvrsi sljedece radnje. digitalWrite(cled,LOW); //Digitalni izlaz "cled" postavi nisko. digitalWrite(zled,LOW); //Digitalni izlaz "zled" postavi nisko. digitalWrite(pled,LOW); //Digitalni izlaz "pled" postavi nisko. } //Naredba "else if(V==LOW)" zavrsava. int tipka=digitalRead(9); //Ocitanje sa digitalnog pina 9 se sprema u varijablu "tipka". if(tipka==HIGH) //Ako je uvjet: variabla "tipka" visoko; onda izvrsi sljedece radnje. { //-- vandt(); //Radnja "vant()" se izvrsava. }else if(tipka==LOW) //Ako uvjet nije tocan onda;i ako je uvjet: varijabla "tipka" nisko onda izvrsi sljedece radnje. { //-- clock_Display(); //Radnja "clock_Display()" se izvrsava. } //Naredba "else if(tipka==LOW)" zavrsava. timer.run(); //Pokreni komandu "timer". Blynk.run(); //Pokreni komandu "Blynk". } void kuckuc() { digitalWrite(cled,HIGH); }
Arduino program ovoga projekta možete preuzeti ovdje.
#define BLYNK_PRINT /* void vrata(){ //Funkcija "vrata()" koja ce se poslije moci pozvati u glavni program. lcd.clear(); //Cisti sve sto je napisano na LCD zaslonu. lcd.setCursor(3,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("Dobar dan"); //Na LCD-u ispisuje "Dobar dan". digitalWrite(zled,HIGH); //Digitalni izlat "zled" postavi visoko. digitalWrite(pled,HIGH); digitalWrite(cled,HIGH); delay(1000); } //Funkcija "vrata()" zavrsava. void prozor_p1(){ //Funkcija "prozor_p1()" koja ce se poslije moci pozvati u glavni program. String currentTime = String(hour()) + ":" + minute() + ":" + second()+" "; //Odredivanje vremena (sat,minuta,sekunda). String currentDate = String (day()) + "." + month() + "." + year()+" "; //Odredivanje datuma (dan,mjesec,godina). for (int i=1; i<60;i=i+5){ if( second()==i){ //Ako je uvjet "second()" jednako kao varijabla "i" onda izvrsi sljedece radnje. lcd.setCursor(0,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("Prozor u kuhinji"); //Na LCD-u ispisuje "Prozor u kuhinji". lcd.setCursor(0,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" je otvoren! "); //Na LCD-u ispisuje " je otvoren! ". } //Naredba "if( second()==i)" zavrsava. } //Naredba "for (int i=1; i<60;i=i+5)" zavrsava. } //Funkcija "prozor_p1()" zavrsava. void prozor_p2(){ //Funkcija "prozor_p2()" koja ce se poslije moci pozvati u glavni program. String currentTime = String(hour()) + ":" + minute() + ":" + second()+" "; //Odredivanje vremena (sat,minuta,sekunda). String currentDate = String (day()) + "." + month() + "." + year()+" "; //Odredivanje datuma (dan,mjesec,godina). for (int i=3; i<60;i=i+5){ // if( second()==i){ //Ako je uvjet "second()" jednako kao varijabla "i" onda izvrsi sljedece radnje. lcd.setCursor(0,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" Prozor u sobi "); //Na LCD-u ispisuje "Prozor u sobi". lcd.setCursor(0,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" je otvoren! "); //Na LCD-u ispisuje " je otvoren! ". } //Naredba "if( second()==i)" zavrsava. } //Naredba "for (int i=3; i<60;i=i+5)" zavrsava. } //Funkcija "prozor_p2()" zavrsava. void vandt(){ //Funkcija "vandt()" koja ce se poslije moci pozvati u glavni program. float vlaga=dht.readHumidity(); float temp= dht.readTemperature(); Serial.print("Vlaznost zraka je: "); //Na serial monitoru ispisuje "Vlaznost zraka je: ". Serial.print(vlaga); //Na serial monitoru ispisuje varijablu "vlaga". Serial.print("%\t "); //Na serial monitoru ispisuje "%\t ". Serial.print("Temperatura je: "); //Na serial monitoru ispisuje "Temperatura je: ". Serial.print(temp); //Na serial monitoru ispisuje varijablu "temp". Serial.println("°C\t"); //Na serial monitoru ispisuje "°C\t". //Uzme vrijednost cijelog broja da ne piše suvišne nule na mobitelu int val=temp; //Iznos od varijable "temp" se sprema u varijablu "val". int hval=vlaga; //Iznos od varijable "vlaga" se sprema u varijablu "hval". Blynk.virtualWrite(V1,val); //Na mobitelu ispisuje vrijednost varijable "val" kao virtualni pin V1. Blynk.virtualWrite(V2,hval); //Na mobitelu ispisuje vrijednost varijable "hval" kao virtualni pin V2. lcd2.clear(); //Cisti sve sto je napisano na LCD-u na mobitelu. lcd2.print(3,0,"Temp. "); //Na LCD-u na mobitelu ispisuje "Temp. " na kordinati 3,0. lcd2.print(9,0,val); //Na LCD-u na mobitelu ispisuje "val " na kordinati 9,0. lcd2.print(11,0,"°C"); //Na LCD-u na mobitelu ispisuje "°C" na kordinati 11,0. lcd2.print(7,1,"bok"); //Na LCD-u na mobitelu ispisuje "bok" na kordinati 7,1. //-------------------------------------- lcd.clear(); //Cisti sve sto je napisano na LCD-u na mobitelu. lcd.setCursor(3,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("Temp. "); //Na LCD-u ispisuje "Temp. ". lcd.setCursor(9,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(val); //Na LCD-u ispisuje "val". lcd.setCursor(11,0); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" C"); //Na LCD-u ispisuje " C". lcd.setCursor(3,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print("Vlaga "); //Na LCD-u ispisuje "Vlaga ". lcd.setCursor(9,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(hval); //Na LCD-u ispisuje varijablu "hval". lcd.setCursor(11,1); //Oznacava poziciju na LCD zaslonu gdje ce se ispisat poruka. lcd.print(" %"); //Na LCD-u ispisuje " %". } //Funkcija "vandt()" zavrsava. void blinkanje(){ //Funkcija "blinkanje()" koja ce se poslije moci pozvati u glavni program. unsigned long preMillis=0; unsigned long sadMillis = millis(); unsigned long interval=10000; if (sadMillis - preMillis >= interval) { //Ako je uvjet "(sadMillis - preMillis >= interval)" onda izvrsi sljedece radnje. LedState = !LedState; //Negira stanje varijable "Ledstate". digitalWrite(8,LedState); //Na digitalni izlaz 8 izvrsi varijablu "LedState". preMillis = sadMillis; //Iznos od varijable "sadMillis" se sprema u varijablu "preMillis". } //Naredba if "(sadMillis - preMillis >= interval) zavrsava". } //Funkcija "blinkanje()" zavrsava.
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt su izradili LFrane Linić i Adrian Zubčević uz mentorstvo Sanjina Gotića iz Tehničke škole, Rijeka, u suradnji s Centrom tehničke kulture Rijeka.
Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.