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.







