Model kuće s pametnom rasvjetom
Tehnička škola DaruvarOsim klasične rasvjete u svakoj od prostorija u kući koja se aktivira pritiskom tipkala postavljenog iza prolaza u prostoriju, rasvjeta se jednako tako pali u svakoj od prostorija pomoću mobilne aplikacije. Vanjska rasvjeta na prilazu u kuću se prvenstveno automatski pali s malim intenzitetom kada vanjska svjetlost padne ispod odgovarajuće razine. Nailaskom osobe prilazu kuće aktivira se optički senzor i rasvjeta se pali punim intenzitetom. Dolaskom do ulaznih vrata aktivira se ultrazvučni mjerač udaljenosti te nakon ulaska osobe u kuću vanjska se rasvjeta ponovno prebacuje na slabi intenzitet. Rasvjeta u dnevnom boravku ima mogućnost regulacije intenziteta rasvjete pomoću daljinskog upravljača i pomoću mobilne aplikacije. U projektu je prvenstveno zamišljeno i pasivno osvjetljivanje kućom pomoću automatskog podizanja i spuštanja roleta. No pojavio se problem s mehanikom i prijenosom kružnog gibanja na izrađeni model, tako da taj dio ne radi.
Video snimka
Izrada projekta
Prilaz ka kući, senzor prolaza nije aktiviran led diode gore smanjenim intenzitetom. Aktivacija se vrši optičkim senzorom smještenim u lijevom zidiću. Iznad ulaznih vrata nalazi se ultrazvučni mjerač udaljenosti koji s kašnjenjem vrši gašenje vanjske rasvjete nazad na slabiji intenzitet. Isti senzor vrši uključenje rasvjete punim intenzitetom i gašenje iste aktivacijom optičkog senzora na izlasku iz prilaza.
Tipkala koja predstavljaju sklopke, na ulazu u svaku prostoriju. Pritiskom na njih vrši se paljenje i gašenje rasvjete u prostoriji.
Izgled MKR100 razvojne platforme sa spojenim ulazima i izlazima, izvedbama napajanja svih elemenata. Mosfet tranzistor za aktivaciju prilazne rasvjete na napajanje 12V.
Nadalje primjećuje se i infracrveni senzor koji omogućuje upravljanje intenzitetom rasvjete unutar prostorije gdje je smješten MKR100.
Mobilna aplikacija
Shema projekta
Arduino program
#define BLYNK_PRINT Serial //Ucitavamo biblioteke #include #include #include #include // Autorizacijski kod za aplikaciju Blynk char auth[] = "d84613170f9c40ea8b781fc07b3e2242"; // Podatci za WiFi char ssid[] = "Hotspotzabudale"; char pass[] = "lozinka1234"; // ----- Inicializacija senzora ----- const int senzorUlaz = 1; // ----- Inicializacija IR Senzora int IRpin = 9; // ----- Inicializacija ledica ----- const int ledBorDim = 2; const int ledKuh = 6; const int ledTrp = 7; const int ledKup = 8; const int lediceUlaz = 5; const int ledSpav = 10; // ----- Ultrasonic senzor ----- const int trigPin = 4; const int echoPin = 0; // ----- Foto Otpornik ----- const int fotoOtp = A2; // ----- Inicializacija gumbova ----- const int gumbKuh = 11; const int gumbKup = 12; const int gumbSpav = 13; const int gumbBor = 14; // ----- Kontrolne varijable ----- //Stanje svjetlecih dioda int stanjeLedKuh = 0; int stanjeLedKup = 0; int stanjeLedBor = 0; int jacinaLedBor = 0; int stanjeLedSpav = 0; int stanjeLedUlaz = 0; //Stanje gumbova int gumbStanjeKuh = 0; int gumbStanjeSpav = 0; int gumbStanjeBor = 0; int gumbStanjeKup = 0; //Stanje senzora na ulazu int stanjeSenzorUlaz = 0; //Udaljenost na ultrasonicnom senzoru long trajanje; int udaljenost; //Fotooptornik int fotoVrijednost = 0; //IR kontrola IRrecv irrecv(IRpin); decode_results signals; void setup() { // ----- Inicijalizacija izlaza pinMode(ledBorDim, OUTPUT); pinMode(ledKuh, OUTPUT); pinMode(ledKup, OUTPUT); pinMode(lediceUlaz, OUTPUT); pinMode(ledSpav, OUTPUT); // ----- Inicializacija gumbova pinMode(gumbKuh, INPUT_PULLUP); pinMode(gumbKup, INPUT_PULLUP); pinMode(gumbSpav, INPUT_PULLUP); pinMode(gumbBor, INPUT_PULLUP); // ----- Inicijalizacija ultrazvucnog senzora pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Debug console Serial.begin(9600); //Povezivanje na WiFi i na aplikaciju Blynk Blynk.begin(auth, ssid, pass); irrecv.enableIRIn(); //Omogucavamo IR prijemnik } void loop() { //Pozivamo funkcije koje trebaju u petlji raditi Blynk.run(); gumbKuhinja(); gumbKupaonica(); gumbSpavaca(); gumbBoravak(); ulazKuce(); //U ovome dijelu ocitavamo koji gumb je pritisnut i //zatim odlucujemo sto zelimo napraviti s obzirom na to //koji je gumb pritisnut na daljinskom upravljacu if (irrecv.decode(&signals)) { //Serial.println(signals.value); irrecv.resume(); // Uzmi slijedeci signal } if (signals.value == 16754775) //Usporedujemo vrijednost dobivenog signala i trazenog {//Ako se signal poklapa izvrsavamo sljedeci kod if (jacinaLedBor < 225) //Provjeravamo dali je svjetlost manja od 225 { jacinaLedBor = jacinaLedBor + 25; analogWrite(ledBorDim, jacinaLedBor); //Povecavamo jacinu PWM signala za ledBorDim za 25 } } else if (signals.value == 16769055) //Usporedujemo vrijednost dobivenog i trazenog signala { //Ako vrijednost odgovara izvrsavamo slijedeci kod if (jacinaLedBor > 0) //Provjeravamo dali je svjetlost veca od 0 { jacinaLedBor = jacinaLedBor - 25; analogWrite(ledBorDim, jacinaLedBor); //Smanjujemo jacinu PWM signala za ledBorDim za 25 } } //Serial.print("jacinaLedBor: "); //Serial.println(jacinaLedBor); signals.value = 0; } //Slijedeci kod se ponavlja za svaki gumb koji imamo u aplikaciji BLYNK //BLYNK_WRITE govori da cekamo da se dogodi promjena u aplikaciji na portu V3 //zatim sa paramnasInt() povlacimo vrijednost gumba sa aplikacije i primjenjujemo ga na lokalnu varijablu //posto se prakticni indenticni kod ponavlja za svaki gumb necu svaku ovu funkciju ponovo objasnjavati red za redom //Ledica kuhinja BLYNK_WRITE(V3) { int pinValue = param.asInt(); //Pinvalue postavljamo da bude vrijednost ono sto postavimo na aplikaciji //Serial.print("ledKuh = "); //Ispis na ekran trenutno stanje //Serial.println(pinValue); if (pinValue == 1) //Ako je gumb presao u stanje 1/On { digitalWrite(ledKuh, HIGH); //Ovom funkcijom palimo ledice stanjeLedKuh = 1; //Postavljamo kontrolnu varijablu na 1 kako bi kasnije mogli saznati dali ledice rade } if (pinValue == 0) //Ako je gumb presao u stanje 0/Off { digitalWrite(ledKuh, LOW); //Ovom funkcijom gasimo ledice stanjeLedKuh = 0; //Postavljamo kontrolnu varijablu u stanje 0 kako bi kasnije mogli saznat dali ledice rade } } //Ledica za kupaonicu BLYNK_WRITE(V5) { int pinValue = param.asInt(); //Pinvalue postavljamo da bude vrijednost ono sto postavimo na aplikaciji Serial.print("ledKup = "); //Ispis na ekran trenutno stanje Serial.println(pinValue); if (pinValue == 1) { digitalWrite(ledKup, HIGH); //Promjena stanja na izlazu arduina stanjeLedKup = 1; } if (pinValue == 0) { digitalWrite(ledKup, LOW); //Promjena stanja na izlazu arduina stanjeLedKup = 0; } } //Paralelni spoj ledica na ulazu BLYNK_WRITE(V6) { int pinValue = param.asInt(); //Pinvalue postavljamo da bude vrijednost ono sto postavimo na aplikaciji Serial.print("lediceUlaz = "); //Ispis na ekran trenutno stanje Serial.println(pinValue); if (pinValue == 1) { digitalWrite(lediceUlaz, HIGH); //Promjena stanja na izlazu arduina stanjeLedUlaz = 1; } if (pinValue == 0) { digitalWrite(lediceUlaz, LOW); //Promjena stanja na izlazu arduina stanjeLedUlaz = 0; } } //Dimmer za Boravak BLYNK_WRITE(V1) { int pinValue = param.asInt(); //Ucitamo vrijednost //Serial.print("Dimmer vrijednost: "); //Ispisemo na serial //Serial.println(pinValue); analogWrite(ledBorDim, pinValue); //Na izlaz postavljamo vrijednost if (pinValue == 0) //Ako je vrijednost 0 to znaci da je zaruljica ugasena { Blynk.virtualWrite(V10, 0); //Ovom funkcijom mozemo pisati vrijednosti U aplikaciju umjesto da citamo samo iz aplikacije kako smo do sad radili stanjeLedBor = 0; } else if (pinValue > 0) //Ako je vrijednost makar 1 znaci da zaruljica radi { Blynk.virtualWrite(V10, 1); //Ponovo pisemo vrijednost U aplikaciju kako bi iskljucili gumb stanjeLedBor = 1; } } //Button za boravak BLYNK_WRITE(V10) { int pinValue = param.asInt(); if (pinValue == 1) //Ako je na gumbu vrijednost 1/On znaci da zaruljica radi na najjacem intenzitetu { analogWrite(ledBorDim, 255); Blynk.virtualWrite(V1, 255); stanjeLedBor = 1; } if (pinValue == 0) //Ako je na gumbu vrijednost 0/Off znaci da je zaruljicu gasimo tj. postavljamo na najnizi intenzitet { analogWrite(ledBorDim, 0); Blynk.virtualWrite(V1, 0); stanjeLedBor = 0; } } //Nakon sto se pozove ova funkcija ocitavamo vrijednost sa gumba i ako smo saznali //da je gumb pritisnut zelimo da izmjenimo vrijednost na izlazu. //Ako su svijetla upaljena zelimo ih ugasiti i obrnuto //Takoder na aplikaciji mjenjamo odgovarajuci gumb u odgovarajuce stanje //Npr. Ugasimo li kuhinju, gumb za kuhinju u aplikaciji takoder postavimo u stanje 0 //Jednaki kod se ponavlja za svaki slijedeci gumb pa necu ponovo komentirati svaki red void gumbKuhinja() { gumbStanjeKuh = digitalRead(gumbKuh); //Ocitavamo vrijednost gumba if (gumbStanjeKuh == LOW) //Ako je gumb pritisnut { if(stanjeLedKuh == 1) //Ako su ledice trenutno upaljene { digitalWrite(ledKuh, LOW); //ugasi ledice u kuhinji Blynk.virtualWrite(V3, 0); //Promjeni stanje gumba u aplikaciji za kuhinju u 0/Off //Serial.println("Ledica na V3/D6 je LOW"); //ispisi na Serial Monitor da je promjenjena vrijednost stanjeLedKuh = 0; //Promjeni kontrolnu varijablu za stanje ledica u kuhinju u 0 } else if (stanjeLedKuh == 0) //Ako su ledice trenutno ugasene { digitalWrite(ledKuh, HIGH); //Upali ledicu u kuhinji Blynk.virtualWrite(V3, 1); //Promjeni stanje gumba u aplikaciji za kuhinju u 1/On //Serial.println("Ledica na V3/D6 je HIGH"); //Ispisi na Serial Monitor promjenu stanja stanjeLedKuh = 1; //Promjni kontrolnu varijablu za stanje ledica u kuhinji } delay(100); //Pauziraj program 100ms } } //Gumb za kupaonicu void gumbKupaonica() { gumbStanjeKup = digitalRead(gumbKup); //Ocitavamo vrijednost if (gumbStanjeKup == LOW) { if(stanjeLedKup == 0) { digitalWrite(ledKup, HIGH); Blynk.virtualWrite(V5, 1); //Serial.println("Ledica na V5/D8 je AKTIVNA"); stanjeLedKup = 1; } else if (stanjeLedKup == 1) { digitalWrite(ledKup,LOW ); Blynk.virtualWrite(V5, 0); //Serial.println("Ledica na V5/D8 je UGASENA"); stanjeLedKup = 0; } delay(100); } } //Gumb za spavacu void gumbSpavaca() { gumbStanjeSpav = digitalRead(gumbSpav); //Ocitavamo vrijednost if (gumbStanjeSpav == LOW) { if(stanjeLedSpav == 1) { digitalWrite(ledSpav, LOW); Blynk.virtualWrite(V6, 0); //Serial.println("Ledica na V6/D10 je LOW"); stanjeLedSpav = 0; } else if (stanjeLedSpav == 0) { digitalWrite(ledSpav, HIGH); Blynk.virtualWrite(V6, 1); Serial.println("Ledica na V6/D10 je HIGH"); stanjeLedSpav = 1; } delay(100); } } void gumbBoravak() { gumbStanjeBor = digitalRead(gumbBor); if (gumbStanjeBor == LOW) { if(stanjeLedBor == 1) { analogWrite(ledBorDim, 0); Blynk.virtualWrite(V10, 0); Blynk.virtualWrite(V1, 0); Serial.println("Ledica na V1/D2 je 0"); stanjeLedBor = 0; } else if (stanjeLedBor == 0) { analogWrite(ledBorDim, 255); Blynk.virtualWrite(V10, 1); Blynk.virtualWrite(V1, 255); Serial.println("Ledica na V1/D2 je 255"); stanjeLedBor = 1; } delay(200); } } void ulazKuce() { //ocitavamo vrijednost ultrasonicnog senzora digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); trajanje = pulseIn(echoPin, HIGH); //Racunamo udaljenost u cm po slijedecoj formuli udaljenost = trajanje*0.034/2; //Ocitavamo vrijednost foto otpornika fotoVrijednost = analogRead(fotoOtp); Serial.println(fotoVrijednost); //niz provjera kako bi uvrdili dali korisnik dolazi //kuc i da treba upaliti ledice na ulazu ili dali //korisnik odlazi pa treba upaliti svjetla ako je vani mrak if (fotoVrijednost > 350) //Provjeravamo dali je noc {//Ako je noc... if(stanjeLedUlaz == 0){analogWrite(lediceUlaz, 25);} //Pobrinjavamo se da ledice cijelu noc barem malo svijetle stanjeSenzorUlaz = digitalRead(senzorUlaz); //Ocitavamo Foto senzor na ulazu u kucu //Serial.print("Stanje senzora na ulazu:"); //Serial.println(stanjeSenzorUlaz); if (stanjeSenzorUlaz == LOW) //Ako je senzor na ulazu aktivan { if(stanjeLedUlaz == 0) //Ako su ledice na ulazu ugasene { analogWrite(lediceUlaz, 255); //Palimo ledice na ulazu na najveci intenzitet Serial.println("Vani je noc, sensor je aktivan i ledice su ugasene pa ih palimo"); stanjeLedUlaz = 1; //Mjenjamo kontrolnu varijablu za stanje ledica na ulazu u kucu u 1/On } else if (stanjeLedUlaz == 1) //Ako su ledicu na ulazu upaljene { analogWrite(lediceUlaz, 25); //Upali ledice na najveci intenzitet Serial.println("Vani je noc, sesnor je aktivan i ledice su upaljene pa ih gasimo"); stanjeLedUlaz = 0; //Mjenjamo kontronu varijablu za stanje ledica na ulazu u kucu u 0/Off } delay(750); //Pauziraj 750ms //kraj provjere ako je sensor aktivan }else if (udaljenost < 10) //Ako stojimo ispod ultrasonicnog senzora { if (stanjeLedUlaz == 0) //Ako su ledice na ulazu ugasene { analogWrite(lediceUlaz, 255); //Palimo ledice na najveci intenzitet Serial.println("Vani je noc, udaljenost manja od 8 i ledice ugasene pa ih palimo"); stanjeLedUlaz = 1; //Mjenjamo kontrolnu varijablu za ledice na ulazu u stanje 1/On } else if (stanjeLedUlaz == 1) //Ako su ledice na ulazu upaljene { /* Razlog zasto pauziramo 10s je jer smatramo da korisnik treba vremena dok otkljuca kucu ude u nju i zatvori vrata i za sve to treba vremena pa mislimo da je 10s dovoljno vremena za sve to kad dodemo do vrata */ delay(5000); //Pauziraj 5s analogWrite(lediceUlaz, 25); //Postavi ledice na ulazu na slijedeci intenzitet (25) Serial.println("Vani je noc, udaljenost manja od 8 i ledice rade pa ih gasimo."); stanjeLedUlaz = 0; //mjenjamo kontrolnu varijablu za stanje ledica na ulazu u 0/Off } } // kraj provjere udaljenosti delay(750); //Pauziraj 750ms } else if (fotoVrijednost < 350)// kraj provjere fotoVrijednost { analogWrite(lediceUlaz, 0); //Vani je dan i nema potrebe da rade ledice } } //kraj funkcije ulazKuce()
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt su izradili Bruno Řehak , Luka Vavra i Teo Opić uz mentorstvo Tomislava Krala iz Tehničke škole Daruvar.
Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.