看到最近智能家居的討論挺火,我也來分享下在智能家居這塊的體會。我主要改造了我租的房子的室燈。主要實現功能有:監控室內環境,改裝了室燈,光線暗的時候有人時自動開燈,光線亮自動滅燈,可紅外用遙控器、手機客戶端改變閾值。git
主控板:Arduino UNO/Mega2560(IO口多)程序員
傳感器:光敏電阻、DHT11溫溼度傳感器、串口WIFI模塊、紅外遙控探頭、紅外人體探測器、5V繼電器(220V)網絡
室燈控制仍是很簡單的,控制電源便可。工具
Arduino開發工具官方有提供,代碼相似c語言,有不少第三方庫,開發很是容易。最讓我感到幸福的是VS也有相應的開發環境,有個插件叫作Visual Micro。oop
可使用220v~5v變壓器,這樣就能夠把主體放到燈罩裏了,並且可使用小點的板子。開發工具
Arduino這種相似積木的搭建方法很是適合我們程序員本身DIY,不須要本身製做電路板。在這個室燈控制的基礎上我們在擴展一下思惟:ui
Arduino能夠方便的實現控制電源、控制/監控帶電路控制的電器的電路板。spa
憧憬一下當WP的Cortana成熟的時候,這些設備控制,Cortana都能根據個人習慣自動搞定,並支持語音控制,全時待命,將來生活啊~插件
最後附上個人Arduino代碼:code
#include <EEPROM.h> #include <IRremote.h> #include <dht11.h> //UNO //#define GM_dpin A5 //光敏電阻 //#define dht_dpin 2 //溫溼度傳感器 //#define wifiRx_dpin 5 //WIFI接收Rx //#define wifiTx_dpin 6 //WIFI發送Tx //#define HW_dpin 8 //紅外遙控探頭 //#define RSensor_dpin 10 //紅外探測器人 //#define jdq_dpin 11 //繼電器 //#define light_dpin 13 //指示燈 //2560 #define GM_dpin A15 //光敏電阻 //#define wifiTx_dpin 10 //WIFI發送Rx //#define wifiRx_dpin 11 //WIFI接收Tx #define dht_dpin 21 //溫溼度傳感器 #define HW_dpin 22 //紅外遙控探頭 #define RSensor_dpin 23 //紅外探測器人 #define jdq_dpin 29 //繼電器 #define light_dpin 13 //指示燈 int ADZ = 45; //暗度閥值 int LDZ = 175; //亮度閥值 bool IsJDQOpend = false; bool IsAutoOpen = false; bool IsPause = false; IRrecv irrecv(HW_dpin); decode_results results; dht11 DHT; //SoftwareSerial WiFiPort(wifiRx_dpin, wifiTx_dpin); void InitController(){ pinMode(jdq_dpin, OUTPUT); digitalWrite(jdq_dpin, LOW); pinMode(light_dpin, OUTPUT); digitalWrite(light_dpin, LOW); pinMode(RSensor_dpin, INPUT); pinMode(GM_dpin, INPUT); } void closeLight(){ digitalWrite(light_dpin, LOW); digitalWrite(jdq_dpin, LOW); IsJDQOpend = false; IsAutoOpen = false; delay(2000); } void openLight(){ digitalWrite(light_dpin, HIGH); digitalWrite(jdq_dpin, HIGH); IsJDQOpend = true; delay(2000); } void makePause(){ IsPause = !IsPause; if (IsPause){ for (int i = 0; i < 5; i++) { digitalWrite(light_dpin, HIGH); delay(100); digitalWrite(light_dpin, LOW); delay(100); } } else{ digitalWrite(light_dpin, HIGH); delay(1000); digitalWrite(light_dpin, LOW); } } //室燈控制器 void LightController(){ //接收紅外遙控器信號 if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0xFFA25D){ //關燈 closeLight(); } if (results.value == 0xFFE21D){ //開燈 openLight(); } if (results.value == 0xFFC23D){ //暫停 makePause(); } irrecv.resume(); } if (IsPause)return; //光敏電阻判斷室內亮度 int valx = analogRead(GM_dpin); //Serial.println(valx); if (valx < ADZ){ //繼電器若是是關的 if (!IsJDQOpend){ //紅外人體檢測 int val = digitalRead(RSensor_dpin); if (val == 1) { //開燈 openLight(); IsAutoOpen = true; } else { return; } } } else{ if (valx > LDZ && IsJDQOpend && IsAutoOpen){ valx = analogRead(GM_dpin); if (valx <= LDZ)return; //環境亮,關燈 closeLight(); } } } void setup(){ byte value = EEPROM.read(1); if (value != 255)ADZ = value; value = EEPROM.read(2); if (value != 255)LDZ = value; Serial.begin(115200); Serial3.begin(115200); InitController(); irrecv.enableIRIn(); delay(500); Serial.println(); Serial.println("[---ZZY Hareware Startup---]"); } void loop(){ LightController(); InfoQuery(); GetCommand(); } long timespan; void InfoQuery(){ unsigned long t = (micros() - timespan) / 1000000; if (t < 1)return; timespan = micros(); //信息查詢 //光控信息 int valx = analogRead(GM_dpin); //溫溼度傳感器 DHT.read(dht_dpin); String msg = "VMZClub_Home HTP H"; msg += DHT.humidity; msg += "T"; msg += DHT.temperature; msg += "L"; msg += valx; msg += "S"; msg += IsJDQOpend; msg += "P"; msg += IsPause; msg += "F"; msg += ADZ; msg += "/"; msg += LDZ; Serial3.print(msg); Serial.println(msg); } void GetCommand(){ int cmd[10] = { -1 }; for (int i = 0; i < 10; i++) { cmd[i] = Serial3.read(); if (cmd[i] == -1)break; Serial.println((char) cmd[i]); } if (cmd[0] == -1)return; switch ((char) cmd[0]) { case 'L': switch (cmd[1]) { case '0': closeLight(); break; case '1': openLight(); break; } break; case 'P': switch (cmd[1]) { case '0': IsPause = false; break; case '1': IsPause = true; break; } break; case 'F': switch (cmd[1]) { case'A': if (cmd[2] != -1) { ADZ = cmd[2]; EEPROM.write(1, ADZ); } break; case'L': if (cmd[2] != -1){ LDZ = cmd[2]; EEPROM.write(2, LDZ); } break; } break; } }