Pametna kuća s Arduinom
Tehnička škola, BjelovarIzrada projekta
Prikazuje svjetla u kupaonici, hodniku i kuhinji. Cijeli uradak je spojen na eksperimentalnoj pločici.
Mobilna aplikacija
Prikazuje 6 gumbova za upravljanje rasvjetom. Aplikacija je razvijena u MIT-ovom App Inventoru. Pritiskom na gumbe Boravak, Soba1 i Soba2, otvara se poseban izbornik koji omogućuje promjenu boje svjetla u odabranoj prostoriji. Pritiskom na gumbe Hodnik, Kupaonica i Kuhinja samo se pale i gase svijetla u odabranoj prostoriji. Pri vrhu se nalazi mali text box u koji se upisuje IP adresa Arduina. U našem slučaju je to 192.168.43.150 (kod različitih Arduina različita je adresa). Ispred IP adrese potrebno je napisati http:// .
Shema projekta
Sve komponente smo spojili prema gornjoj shemi. Koristili smo tranzistore jer smo koristili shemu sličnu multipleksiranju i kako bi se ostvarilo strujno pojačanje(max. struja Arduina je 7mA). Na ovaj način se mijenjaju boje u prostorijama uz minimalan broj pinova.
Prilikom spajanja potrebno je paziti na polaritete LED dioda i na izvode tranzistora kako bi sklop ispravno radio.
Arduino program
#include //uključivanje potrebnih arduino library-a kako bismo imali željene funkcije #include //za kompajlanje ovog programa potrebno je preuzeti WiFi101 library koja je dostupna na internetu #include #include #include #include #define r 3 //definicija konstante r koja je kratica od red(crvena) #define g 4 //definicija konstante g koja je kratica od green(zelena) #define b 5 //definicija konstante b koja je kratica od blue(plava) #define boravak 6 //definicija konstante boravak #define soba1 7 //definicija konstante soba1 #define soba2 8 //definicija konstante soba2 char ssid[] = "chamil"; //spremanje imena wifi mreže u varijablu ssid(promijeniti u ime Vaše mreže) char pass[] = "startrek"; //spremanje lozinke wifi mreže u varijablu pass(promijeniti u lozinku Vaše mreže) //definiranje globalnih varijabli koje se koriste u programu bool toggle_b = false; bool toggle_c = false; bool toggle_f = false; int control; int status = WL_IDLE_STATUS; WiFiServer server(80); void setup() { Serial.begin(9600); //definiranje brzine komunikacije serijskog porta pinMode(0, OUTPUT); //postavljanje pina 0 kao izlaz(kuhinja) pinMode(1, OUTPUT); //postavljanje pina 1 kao izlaz(kupaonica) pinMode(2, OUTPUT); //postavljanje pina 2 kao izlaz(hodnik) pinMode(r, OUTPUT); //postavljanje pina r kao izlaz(crvena boja rgb ledica) pinMode(g, OUTPUT); //postavljanje pina g kao izlaz(zelena boja rgb ledica) pinMode(b, OUTPUT); //postavljanje pina b kao izlaz(plava boja rgb ledica) pinMode(boravak, OUTPUT); //postavljanje pina boravak kao izlaz(soba boravak) pinMode(soba1, OUTPUT); //postavljanje pina soba1 kao izlaz(soba soba1) pinMode(soba2, OUTPUT); //postavljanje pina soba2 kao izlaz(soba soba2) while ( status != WL_CONNECTED) { //dok varijabla status ne postane jednaka "spojeno" status = WiFi.begin(ssid, pass); //pokušavaj se spojiti na zadanu wifi mrežu delay(10000); //pričekaj 10 sekundi } server.begin(); //kada se spojiš pokreni server printWifiStatus(); //idi na funkciju printWifiStatus() } void loop() { WiFiClient client = server.available(); //definiraj lokalnu varijablu client kao WiFiClient i pridruži ju dostupnosti servera if (client) { //ako je klijent dostupan Serial.println("new client"); //ispiši "new client" String currentLine = ""; //postavi lokalnu varijablu currentLune da bude tipa string i pridruži joj vrijednost "" while (client.connected()) { //ako je klijent spojen if (client.available()) { //i ako je dostupan char c = client.read(); //definiraj lokalnu varijablu c kao char i isčitavaj što je došlo s klijenta Serial.write(c); //ispiši vrijednost varijable c if (c == '\n') { //ako je c jednako \n if (currentLine.length() == 0) { //ako je duljina varijable currentLine jednaka 0 client.println("HTTP/1.1 200 OK"); //klijentu pošalji "HTTP/1.1 200 OK" client.println("Content-type:text/html");//klijentu pošalji "Content-type:text/html" client.println(); //ovo je potrebno ako se arduino upravlja iz web preglednika break; //iziđi iz if } else { //inače currentLine = "" currentLine = ""; } } else if (c != '\r') { //ako je c različito od \r currentLine += c; //currentLine = currentLine + c } receive(currentLine); //idi na funkciju receive sa parametrom currentLine } } client.stop(); Serial.println("client disonnected"); } } void printWifiStatus() { //definiranje funkcije printWifiStatus() //ispiši na serial monitoru ime mreže na koju si spojen Serial.print("SSID: "); Serial.println(WiFi.SSID()); //ispiši na serial monitoru IP adresu wifi modula IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); //ispiši jakost signala mreže long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); Serial.print("To see this program in action, type in Arduino Controller: http://"); Serial.println(ip); } void receive(String inLine){ //definiraj funkciju receive i uvedi varijablu inLine kao string if (inLine.endsWith("GET /A")) { //ako inLine završava na GET /A control = 1; //postavi varijablu control u 1 } if (inLine.endsWith("GET /B")) { //ako inLine završava na GET /B toggle_b = !toggle_b; //invertiraj stanje varijable toggle_b digitalWrite(0, toggle_b); //postavi pin 0 u stanje varijable toggle_b } if (inLine.endsWith("GET /C")) { //ako inLine završava na GET /C toggle_c = !toggle_c; //invertiraj stanje varijable toggle_c digitalWrite(1, toggle_c); //postavi pin 1 u stanje varijable toggle_c } if (inLine.endsWith("GET /D")) { //ako inLine završava na GET /D control = 2; //postavi varijablu control u 2 } if (inLine.endsWith("GET /E")) { //ako inLine završava na GET /E control = 3; //postavi varijablu control u 3 } if (inLine.endsWith("GET /F")) { //ako inLine završava na GET /F toggle_f = !toggle_f; //invertiraj stanje varijable toggle_f digitalWrite(2, toggle_f); //postavi pin 2 u stanje varijable toggle_f } switch(control){ case 1:{ //u slučaju da je control 1 digitalWrite(boravak, HIGH); //uključi boravak digitalWrite(soba1, LOW); //isključi sobu 1 digitalWrite(soba2, LOW); //isključi sobu 2 if(inLine.endsWith("GET /G")){ //ako inLine završava na GET /G digitalWrite(r, HIGH); //uključi crvenu led digitalWrite(g, LOW); //isključi zelenu i plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /H")){ //ako inLine završava na GET /H digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, HIGH); //uključi zelenu digitalWrite(b, LOW); } if(inLine.endsWith("GET /I")){ //ako inLine završava na GET /I digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, LOW); digitalWrite(b, HIGH); //uključi plavu } if(inLine.endsWith("GET /J")){ //ako inLine završava na GET /J digitalWrite(r, HIGH); //uključi crvenu i zelenu (žuta) digitalWrite(g, HIGH); //isključi plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /K")){ //ako inLine završava na GET /K digitalWrite(r, LOW); //isključi crvenu digitalWrite(g, HIGH); //uključi zelenu i plavu (cijan) digitalWrite(b, HIGH); } if(inLine.endsWith("GET /L")){ //ako inLine završava na GET /L digitalWrite(r, HIGH); //uključi crvenu i plavu (magenta) digitalWrite(g, LOW); //isključi zelenu digitalWrite(b, HIGH); } if(inLine.endsWith("GET /M")){ //ako inLine završava na GET /M digitalWrite(r, HIGH); //uključi sve ledice (bijela) digitalWrite(g, HIGH); digitalWrite(b, HIGH); } if(inLine.endsWith("GET /N")){ //ako inLine završava na GET /N digitalWrite(r, LOW); //isključi svjetlo digitalWrite(g, LOW); digitalWrite(b, LOW); } break; //iziđi iz case } case 2:{ //u slučaju da je 2 digitalWrite(boravak, LOW); //isključi boravak digitalWrite(soba1, HIGH); //uključi sobu 1 digitalWrite(soba2, LOW); //isključi sobu 2 if(inLine.endsWith("GET /G")){ //ako inLine završava na GET /G digitalWrite(r, HIGH); //uključi crvenu led digitalWrite(g, LOW); //isključi zelenu i plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /H")){ //ako inLine završava na GET /H digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, HIGH); //uključi zelenu digitalWrite(b, LOW); } if(inLine.endsWith("GET /I")){ //ako inLine završava na GET /I digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, LOW); digitalWrite(b, HIGH); //uključi plavu } if(inLine.endsWith("GET /J")){ //ako inLine završava na GET /J digitalWrite(r, HIGH); //uključi crvenu i zelenu (žuta) digitalWrite(g, HIGH); //isključi plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /K")){ //ako inLine završava na GET /K digitalWrite(r, LOW); //isključi crvenu digitalWrite(g, HIGH); //uključi zelenu i plavu (cijan) digitalWrite(b, HIGH); } if(inLine.endsWith("GET /L")){ //ako inLine završava na GET /L digitalWrite(r, HIGH); //uključi crvenu i plavu (magenta) digitalWrite(g, LOW); //isključi zelenu digitalWrite(b, HIGH); } if(inLine.endsWith("GET /M")){ //ako inLine završava na GET /M digitalWrite(r, HIGH); //uključi sve ledice (bijela) digitalWrite(g, HIGH); digitalWrite(b, HIGH); } if(inLine.endsWith("GET /N")){ //ako inLine završava na GET /N digitalWrite(r, LOW); //isključi svjetlo digitalWrite(g, LOW); digitalWrite(b, LOW); } break; //iziđi iz case } case 3:{ //u slučaju da je 3 digitalWrite(boravak, LOW); //isključi boravak digitalWrite(soba1, LOW); //isključi sobu 1 digitalWrite(soba2, HIGH); //uključi sobu 2 if(inLine.endsWith("GET /G")){ //ako inLine završava na GET /G digitalWrite(r, HIGH); //uključi crvenu led digitalWrite(g, LOW); //isključi zelenu i plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /H")){ //ako inLine završava na GET /H digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, HIGH); //uključi zelenu digitalWrite(b, LOW); } if(inLine.endsWith("GET /I")){ //ako inLine završava na GET /I digitalWrite(r, LOW); //isključi crvenu i plavu digitalWrite(g, LOW); digitalWrite(b, HIGH); //uključi plavu } if(inLine.endsWith("GET /J")){ //ako inLine završava na GET /J digitalWrite(r, HIGH); //uključi crvenu i zelenu (žuta) digitalWrite(g, HIGH); //isključi plavu digitalWrite(b, LOW); } if(inLine.endsWith("GET /K")){ //ako inLine završava na GET /K digitalWrite(r, LOW); //isključi crvenu digitalWrite(g, HIGH); //uključi zelenu i plavu (cijan) digitalWrite(b, HIGH); } if(inLine.endsWith("GET /L")){ //ako inLine završava na GET /L digitalWrite(r, HIGH); //uključi crvenu i plavu (magenta) digitalWrite(g, LOW); //isključi zelenu digitalWrite(b, HIGH); } if(inLine.endsWith("GET /M")){ //ako inLine završava na GET /M digitalWrite(r, HIGH); //uključi sve ledice (bijela) digitalWrite(g, HIGH); digitalWrite(b, HIGH); } if(inLine.endsWith("GET /N")){ //ako inLine završava na GET /N digitalWrite(r, LOW); //isključi svjetlo digitalWrite(g, LOW); digitalWrite(b, LOW); } break; //iziđi iz case } } }
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt je izradio Josip Matić uz mentorstvo Ljudevita Sakala iz Tehničke škole u Bjelovaru.
Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.