Pametna kuća
Elektrostrojarska školaOsmislili smo upravljanje kućnom rasvjetom pomoću aplikacije i raznim senzorima. Na ulaz smo postavili senzor pokreta koji uključuje svijetlo ispred ulaza i tipkalo koje uključuje zvono. Jednostavniji način otključavanja vrata osmislili smo pomoću servo motora i aplikacije. U hodnik smo postavili dvije led diode koje se uključuju kad se vanjska svjetlost smanji ispod određene razine. Kao indikator svjetlosti koristili smo fotootpornik koji smo postavili na vanjski zid makete. U dnevnoj sobi svijetlo se uključuje pomoću pljeska. Kamin koji se nalazi u dnevnoj sobi mijenja svoju jačinu isijavanja ovisno o vanjskoj temperaturi. Temperaturu i vlagu prikazuje nam display postavljen na zid dnevne sobe. U spavaćoj sobi svijetlom se upravlja pomoću touch senzora. Aplikacijom se može upravljati sa svim rasvjetnim tijelima.
Izrada projekta
Mobilna aplikacija
U mobilnoj aplikaciji su dostupne kontrole za upravljane senzorima koji služe za automatsko uključivanje I isključivanje svjetla (Crvene tipke) pomoću kojih se svaki od senzora može odvojeno isključiti ili uključiti prema potrebi korisnika. Desno od tih tipki nalazi se zelena tipka, ona služi za zaključavanje/otključavanje ulaznih vrata. Na posljetku, tipke u donjem redu (žute) služe za upravljanje svjetlima u svakoj prostoriji.
Shema projekta
Spojeno prema shemi.
Arduino program
#define BLYNK_PRINT /* /* IoT Source Softver za automatizirano upravljanje pametnom kucom putem senzora ili direktno pomocu mobilne aplikacije. Kao "mozak" sustava koristi se Arduino MKR1000, svi digitalni ulazi (tipkala, enkoder, senzor zvuka, senzor dodira...) funkcioniraju na bazi interrupt-ova, LDR senzor i DHT11 senzor temperature i vlage osvjezavaju se u realnim intervalima (LDR 5 sekundi, DHT 1 minuta). Povezivanje na internet je moguce i bez uporabe racunala (pod uvjetom da SSID i lozinka nisu dulji od 16 znakova, te da sadrze samo znakove A-Z, a-z, 0-9, "-" i "_"), a o komunikaciji sa mobilnom aplikacijom se brine Blynk library. NAPOMENA: RGB dioda ovdje glumi plamen u kaminu pa bi realno bila zamijenjena sustavom grijanja. Napisano 26.2.2018. Tomislav Kerezi */ //////////KNJIZNICE//////////// #include // #include // KNJIZNICE KORISTENE #include // U OVOME KODU #include // #include // #include // #include // #include // ////////////DEFINICIJE PINOVA////////////// #define ENC_CLK 0 // #define ENC_DT 14 // Definirani pinovi enkodera #define ENC_SW 1 // (koristi se odvojeno tipkalo) #define DHT_BUS A6 //Definiran pin za podatkovnu vezu sa senzorom DHT11 #define DHTTYPE DHT11 //Definiran tip DHT senzora #define SW_1 6 // #define SOUND_1 7 //Definirani pinovi za ostale ulazne senzore #define TOUCH_1 4 // #define PIR_1 5 // #define LCD_SDA 11 //Definirani pinovi za komunikaciju (I2C protokol) #define LCD_SCL 12 //sa LCD displayem #define LDR_IN A1 //Definiran analogni ulaz za senzor svjetlosti #define BUZZ_OUT 9 //Definiran izlazni pin za "zvono" (buzzer) #define LOCK_OUT 2 //Definiran izlazni pin za upravljanje servom za zakljucavanje #define RGB_R 3 // #define RGB_G 10 //Definirani izlazi za RGB diodu #define RGB_B 13 // #define LED_1 A2 // #define LED_2 A3 //Definirani ostali izlazi za rasvjetu #define LED_3 A4 // #define LED_4 A5 // /////////INICIJALIZACIJA VARIJABLI///////////////// long int loopTime = 0; //Vremenska varijabla int LDRVar; // Vrijednost LDR senzora int lastR = 0; // int lastG = 0; // RGB Vrijednosti na RGB diodi int lastB = 0; // float temp; //Temperatura (DHT11) float hum; //Vlaga u zraku (DHT11); bool LDR_Enable = true; // Aktivnost LDR senzota char auth[] = "0ab9821f9bc5448a9fdebfc679f3ace1"; // AUTENTIFIKACIJSKI TOKEN ZA APLIKACIJU volatile int selVar; // Pozicija enkodera volatile bool ESWVar = false; // Pozicija tipkala pri enkoderu volatile bool soundVar = true; // Pomocne varijable za kontrolu nad volatile bool touchVar = true; // senzorima pomocu mobilne aplikacije volatile bool pirVar = true; // ////////////INICIJALIZACIJA LCD-A I DHT11 SENZORA////////////// LiquidCrystal_I2C lcd(0x27, 16 ,2); // Inicijalizacija LCD-a DHT dht(DHT_BUS, DHTTYPE); // Inicijalizacija DHT11 senzora /*byte LCDAddress; byte scanI2C(){ byte error, address; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { return address; Serial.println(address, HEX); } delay(100); } }*/ /////////////ZVUK ZVONA///////////////// void bell(){ } //////////////FUNKCIJA ZA PROMJENU BOJE NA RGB DIODI//////////// void RGB(int r, int g, int b){ if(r > lastR){ while(r > lastR){ lastR--; analogWrite(RGB_R, lastR); delay(5); } } else if(r < lastR){ while(r < lastR){ lastR++; analogWrite(RGB_R, lastR); delay(5); } } if(g > lastG){ while(g > lastG){ lastG--; analogWrite(RGB_G, lastG); delay(5); } } else if(g < lastG){ while(g < lastG){ lastG++; analogWrite(RGB_G, lastG); delay(5); } } if(b > lastB){ while(b > lastB){ lastB--; analogWrite(RGB_B, lastB); delay(5); } } else if(b < lastB){ while(b < lastB){ lastB++; analogWrite(RGB_B, lastB); delay(5); } } } /////////////////////////////////////////////////////////////// // SETUP // /////////////////////////////////////////////////////////////// void setup() { ///////////POSTAVLJANJE ULAZA I IZLAZA PRIPADAJUCIM PINOVIMA///////// pinMode(ENC_CLK, INPUT); pinMode(ENC_DT, INPUT); pinMode(ENC_SW, INPUT); pinMode(DHT_BUS, INPUT); pinMode(SW_1, INPUT); pinMode(SOUND_1, INPUT); pinMode(TOUCH_1, INPUT); pinMode(LDR_IN, INPUT); pinMode(LCD_SDA, OUTPUT); pinMode(LCD_SCL, OUTPUT); pinMode(BUZZ_OUT, OUTPUT); pinMode(LOCK_OUT, OUTPUT); analogWrite(LOCK_OUT, 254); pinMode(RGB_R, OUTPUT); pinMode(RGB_G, OUTPUT); pinMode(RGB_B, OUTPUT); pinMode(LED_1, OUTPUT); pinMode(LED_2, OUTPUT); pinMode(LED_3, OUTPUT); pinMode(LED_4, OUTPUT); // DEBUGGING SETUP// Serial.begin(115200); //////////POSTAVLJANJE INTERRUPT-OVA///////////// attachInterrupt(ENC_CLK,ISR_ENC, FALLING); attachInterrupt(ENC_SW, ISR_ESW, FALLING); attachInterrupt(SW_1, ISR_SW, FALLING); attachInterrupt(SOUND_1, ISR_SOUND, RISING); attachInterrupt(TOUCH_1, ISR_TOUCH, RISING); attachInterrupt(PIR_1, ISR_PIR, CHANGE); interrupts(); // ukljucivanje interrupt-ova ////////////POVEZIVANJE S LCD-EM I DHT SENZOROM/////////// Wire.begin(); // Inicijalizacija I2C protokola //LCDAddress = scanI2C(); lcd.init(); // Inicijalizacija LCD-a lcd.backlight(); // Ukljucivanje pozadinskog osvjetljenja dht.begin(); // Inicijalizacijja DHT senzora /////////VARIJABLE ZA POVEZIVANJE S MREZOM I INTERNETOM///////// char SSIDArr[16]; //SSID Mreze char PASSArr[16]; //WPA2-PSK Lozinka //////////SKUP DOSTUPNIH ZNAKOVA ZA UNOS///////// char selArr[67] = {NULL, ' ', 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '_', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; //////////UNOS SSID-a MREZE////////// labelWIFI_SSID: lcd.clear(); lcd.print("SSID: "); for(int i=0; i<16; i++){ while(!ESWVar){ if(selVar > sizeof(selArr)){ selVar = 0; } SSIDArr[i] = selArr[selVar]; lcd.setCursor(i,1); lcd.write(SSIDArr[i]); delay(50); } while(ESWVar){ ESWVar = !ESWVar; } } ////////////UNOS LOZINKE MREZE////////// labelWIFI_PASS: lcd.clear(); lcd.print("PASSWORD: "); for(int k=0; k<16; k++){ while(!ESWVar){ if(selVar > sizeof(selArr)){ } PASSArr[k] = selArr[selVar]; lcd.setCursor(k,1); lcd.write(PASSArr[k]); delay(50); } while(ESWVar){ ESWVar = !ESWVar; } } ///////////////POVEZIVANJE NA MREZU///////// lcd.clear(); lcd.print("CONNECTING.."); WiFi.begin(SSIDArr, PASSArr); delay(10000); // Pricekaj da se WiFi modul poveze /////////////IZJAVA STANJA VEZE NAKON POKUSAJA POVEZIVANJA NA MREZU///////// if(WiFi.status() == WL_CONNECTED){ Blynk.begin(auth, SSIDArr, PASSArr); ///POVEZIVANJE NA INTERNET/// lcd.clear(); lcd.print("Connected."); delay(1000); lcd.clear(); } else if(WiFi.status() == WL_NO_SSID_AVAIL){ lcd.clear(); lcd.print("SSID not found."); delay(1000); lcd.clear(); lcd.print("Retype Info."); delay(1000); for(int k=0; k<16; k++){ PASSArr[k] = 0; } goto labelWIFI_SSID; } else if(WiFi.status() == WL_CONNECT_FAILED){ lcd.clear(); lcd.print("Failed."); delay(1000); lcd.clear(); lcd.print("Retype password."); delay(1000); for(int j=0; j<16; j++){ PASSArr[j] = 0; } goto labelWIFI_PASS; } else { lcd.clear(); lcd.print("Unknown Error,"); lcd.setCursor(0,1); lcd.print("Please reset."); delay(2000); lcd.clear(); } } ////////////////////////////////////////// // LOOP // ////////////////////////////////////////// void loop() { ///////OCITAVANJE VRIJEDNOSTI LDR SENZORA ////////// if(LDR_Enable == true){ // Je li senzor aktivan? if((loopTime % 500) == 0){ //Interval osvjezavanja LDRVar = analogRead(LDR_IN); if(LDRVar < 600) { // Razina svjetlosti ispod koje se pali rasvjeta digitalWrite(LED_4, HIGH); } else { digitalWrite(LED_4, LOW); } } } ///////////////OCITAVANJE VRIJEDNOSTI DHT SENZORA I ISPISIVANJE NA LCD/////////// if((loopTime % 6000) == 0){ temp = dht.readTemperature(); hum = dht.readHumidity(); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Temp: "); lcd.print((float)temp); lcd.print((char)223); lcd.print("C"); lcd.setCursor(1, 1); lcd.print("Hum: "); lcd.print((float)hum); lcd.print(" %"); ///////////POSTAVLJANJE BOJE RGB DIODE///////// if(temp < 10){ RGB(248,85,7); } else if(temp < 15){ RGB(198,138,15); } else if(temp < 20){ RGB(109,77,10); } else { RGB(30,21,2); } } Blynk.run(); //Pokretanje veze sa aplikacijom ///////////////POSTAVLJANJE OSNOVNOG VREMENSKOG INTERVALA///////// loopTime++; if(loopTime == 1000000){ //Overflow reset loopTime = 0; } delay(10); //OSNOVNI INTERVAL } ////////////////////////////////////// // ISR FUNKCIJE // ////////////////////////////////////// void ISR_ENC(){ //Enkoder if(!digitalRead(ENC_DT)){ selVar++; } else { selVar--; } delayMicroseconds(35000); } void ISR_ESW(){ //Tipkalo pri enkoderu ESWVar = !ESWVar; delayMicroseconds(150000); } void ISR_SW(){ //Tipkalo za zvono bell(); delayMicroseconds(150000); } void ISR_SOUND(){ // Zvucni senzor digitalWrite(LED_2, soundVar); soundVar = !soundVar; delayMicroseconds(150000); } void ISR_TOUCH(){ // Senzor dodira digitalWrite(LED_1, touchVar); touchVar = !touchVar; delayMicroseconds(150000); } void ISR_PIR(){ // IR senzor prisutnosti digitalWrite(LED_3, pirVar); pirVar = !pirVar; delayMicroseconds(25000); } ///// UPRAVLJANJE SENZORIMA (IZ APLIKACIJE) //////// BLYNK_WRITE(V0){ if (param.asInt()){ detachInterrupt(SOUND_1); } else { attachInterrupt(SOUND_1, ISR_SOUND, RISING); } } BLYNK_WRITE(V1){ if (param.asInt()){ detachInterrupt(PIR_1); } else { attachInterrupt(PIR_1, ISR_PIR, CHANGE); } } BLYNK_WRITE(V2){ if (param.asInt()){ LDR_Enable = false; } else { LDR_Enable = true; } } BLYNK_WRITE(V3){ if (param.asInt()){ analogWrite(LOCK_OUT, 254); } else { analogWrite(LOCK_OUT, 128); } }
Arduino program ovoga projekta možete preuzeti ovdje.
Autori
Projekt su izradili Tomislav Kereži i Mihael Loborec uz mentorstvo Krunoslava Grudičeka iz Elektrostrojarska škola.
Projekt je prijavljen na temu: Internet of Things: Pametna rasvjeta.