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.






