当前位置: 首页 > 科技观察

面向程序员的智能家居

时间:2023-03-20 00:33:51 科技观察

前言看到最近关于智能家居的讨论很火,我也分享一下自己在智能家居方面的心得。我主要是改造我租来的房子里的房间灯。主要功能有:监控室内环境,改装房间灯光,暗处有人自动开灯,光线明亮时自动关灯,红外遥控和手机改变阈值客户。材料主控板:ArduinoUNO/Mega2560(多IO口)传感器:光敏电阻、DHT11温湿度传感器、串口WIFI模块、红外遥控探头、红外人体探测器、5V继电器(220V)布线室灯光控制还是很简单,控制电源。首先使用继电器接管室内灯的电线。然后放上红外线人体探测器,我把它对着房间的门口。温湿度传感器、光敏电阻、wifi模块、红外遥控探头可选性比较强,合理放置即可。程序开发官方提供Arduino开发工具,代码类似C语言,有很多第三方库,开发非常容易。最让我开心的是VS也有相应的开发环境,还有一个叫做VisualMicro的插件。控制电路无非就是将数字IO口设置为高电平或低电平。光敏电阻测光很简单,用模拟口测量电阻值,如果需要更高精度更专业,可以购买专用的测光模块。通讯方式有红外遥控、射频、蓝牙、wifi等多种。作弊wp不支持蓝牙串口,所以我选择串口wifi,好用。模块有自己的配置页面,我配置它连接家里的wifi。网络+模块自建AP,采用UDP方式发送广播。下面附上具体代码。样机可以使用220v~5v的变压器,这样主体就可以放在灯罩里,而且可以使用更小的板子。扩展Arduino的积木式搭建方式,非常适合我们程序员自己DIY,不用自己动手制作电路板。在这个房间灯光控制的基础上,我们再扩展一下思路:加一个红外发射器来控制相应的红外遥控设备,一接收器一发射器组合就是终极遥控,多发射器可以防止死角,常用的2.4G或低频无线模块,可以实现无线设备之间的通讯(模块很便宜,有兴趣的可以试试鼠标,键盘,遥控车,航模通讯)加一个舵机拉动窗帘。大胆点,拆开电器找到电路板,接好线,用Arduino的数字IO直接监测/控制电路板。加上语音识别模块(目前的好像不太理想,比Arduino重了点,这个工作还是交给家庭网关或者手机比较好)语音控制电器。Arduino可以轻松实现控制电源的电路板,通过电路控制控制/监控电器。期待WP的Cortana成熟后,Cortana可以根据我的习惯自动处理这些设备控制,支持语音控制??,全时待机,未来生活~***附上我的Arduino代码:#include#include#include//UNO//#defineGM_dpinA5//光敏电阻//#definedht_dpin2//温湿度传感器//#definewifiRx_dpin5//WIFI接收Rx//#definewifiTx_dpin6//WIFI发送Tx//#defineHW_dpin8//红外遥控探头//#defineRSensor_dpin10//红外探测器//#definejdq_dpin11//继电器//#definelight_dpin13//指示灯//2560#defineGM_dpinA15//光敏电阻//#definewifiTx_dpin10//WIFI发送Rx//#definewifiRx_dpin11//WIFI接收Tx#definedht_dpin21//温湿度传感器#defineHW_dpin22//红外遥控探头#defineRSensor_dpin23//红外探测器#definejdq_dpin29//继电器#definelight_dpin13//指示灯intADZ=45;//暗阈值intLDZ=175;//亮度ness阈值boolIsJDQOpend=false;boolIsAutoOpen=假;boolIsPause=假;IRrecvirrecv(HW_dpin);解码结果;dht11DHT;(){pinMode(jdq_dpin,OUTPUT);数字写入(jdq_dpin,低);pinMode(light_dpin,输出);数字写入(light_dpin,低的);pinMode(RSensor_dpin,输入);引脚模式(GM_dpin,输入);}voidcloseLight(){digitalWrite(light_dpin,LOW);数字写入(jdq_dpin,低);IsJDQOpend=false;是自动打开=假;延迟(2000);voidopenLight(){digitalWrite(light_dpin,HIGH);数字写入(jdq_dpin,高);IsJDQOpend=true;延迟(2000);}voidmakePause(){IsPause=!IsPause;if(IsPause){for(inti=0;i<5;i++){digitalWrite(light_dpin,HIGH);延迟(100);数字写入(light_dpin,LOW);延迟(100);}}else{digitalWrite(light_dpin,HIGH);延迟(1000);digitalWrite(light_dpin,LOW);}}//室内灯控制器voidLightController(){//接收红外遥控信号if(irrecv.decode(&results)){Serial.println(results.value,HEX);if(results.value==0xFFA25D){//关灯closeLight();}if(results.value==0xFFE21D){//开灯openLight();}if(results.value==0xFFC23D){//暂停makePause();}不接收。恢复();}如果(IsPause)返回;//光敏电阻判断室内亮度intvalx=analogRead(GM_dpin);//序列号.println(valx);if(valxLDZ&&IsJDQOpend&&IsAutoOpen){v??alx=analogRead(GM_dpin);如果(valx<=LDZ)返回;//环境明亮,关灯closeLight();}}}voidsetup(){bytevalue=EEPROM.read(1);如果(值!=255)ADZ=值;值=EEPROM.读取(2);如果(值!=255)LDZ=值;序列号.begin(115200);Serial3.begin(115200);初始化控制器();irrecv.enableIRIn();延迟(500);序列号.println();Serial.println("[---ZZYHarewareStartup---]");}voidloop(){LightController();信息查询();获取命令();}长时间跨度;voidInfoQuery(){unsignedlongt=(micros()-timespan)/1000000;如果(t<1)返回;时间跨度=微秒();//信息查询//灯控信息intvalx=analogRead(GM_dpin);//温湿度传感器DHT.read(dht_dpin)msg??+=DHT.temperature;味精+=“大号”;味精+=瓦尔克斯;消息+="S";msg+=IsJDQOpend;消息+="P";msg+=IsPause;msg+="F";msg+=ADZ;msg+="/";msg+=LDZ;Serial3.print(msg);Serial.println(msg);}voidGetCommand(){intcmd[10]={-1};for(inti=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;}}本文来自:http://www.cnblogs.com/zhang740/p/3785600.html