基于单片机智能家居系统-中控面板设计
设计思路:
单片机是现如今运用最为广泛的电子器件,不论是在我们日常生活的哪方面,都有着单片机的身影。不论是小区内的电梯,还是超市的感应门,单片机给人们带来了极大的便利。本次基于单片机的智能家居的设计主要是以STC89C52RC为核心的控制系统,分为从主机两个系统,其中从机负责采集各种信息,主机负责接受从机的信息并进行显示
从机中,DHT11作为温湿度传感器采集房间内的温度,同时还可以通过按键设置温度上下限的阈值,将存储的温度值保存在iic总线的AT24C02放掉电模块中,HC-SR04超声波模块负责检测安全距离,还加入了蜂鸣器和小灯作为声光报警系统,用直流电机和继电器控制大功率灯暖来降低或者升高房间内的温度,MQ2用来检测屋内的有害气体和烟雾浓度、如果遭遇火灾可使用水泵进行及时处理。通过NRF2401L无线模块将数据传输给主机进行通信。
主机中,将从机的所有信息使用无线模块进行远距离的传递,将主机放在显眼的位置,如客厅,主卧等,做一个中控面板不仅可以随时监控房间内的情况,还可以使用手机进行WLAN对房间的控制硬件进行操作。在此基础上还加入了密码锁的功能,进一步提高了安全保证。
实验操作:
主从机通信
从机接收:
主机发送:
主从机密码解锁
主机待解锁界面:
解锁后语音提示且进入接收界面
从机采集类型
主界面与副界面:
主界面-1
采集模式,显示温湿度,光照,空气浓度等信息
主界面-2
采集模式,显示当前安全状态和安全距离
副界面-1
设置模式,设置当前温度的上下限阈值
副界面-2
设置模式,设置当前光照浓度和空气质量上下限阈值
副界面-3
设置模式,设置当前安全距离的范围
具体细节操作就不丢图片里边了,后续直接放视频吧。
系统运用的模块:
单片机:STC89C58
C58和C54\C52其实没有太大区别,唯一不同的就是内存大小,C52\C54\C58内存分别为4k、8k、16k、因为编译后的hex文件达到了11000+code,差不多是11k大小的样子,所以必须得换上大容量的单片机,可能有些人会问我为什么不换STC15或者是STM32之类的单片机,因为当时板子没想到后续程序会用到这么多,且32和15的板子价格稍微贵一点为了省钱就选了C51类型的单片机,还有一个原因是32的单片机配置和创建工程较为繁琐,一般的项目C51即可完成,不过后来我却十分后悔,垃圾C51系列浪费了我更多的金钱和调试时间。
安防模块:HC-SR04超声波模块
可以设置距离阈值,在从机检测模式中如果距离减小至安全距离时,当前状态则为NO且主机会出现语音提示。
void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=400)||flag==1) //超出测量范围显示“-”{ flag=0;OLED_ShowString(0,6,"Warning Error",16);}else{OLED_ShowChinese2(0,6,0,16);//检测距离OLED_ShowChinese2(16,6,1,16);//OLED_ShowChinese2(32,6,2,16);//OLED_ShowChinese2(48,6,3,16);//OLED_ShowString(64,6,":",16);disbuff1[0]=S/10/10+'0';disbuff1[1]=S/10%10+'0';disbuff1[2]=S%10+'0';OLED_ShowChar(72,6, disbuff1[0],16);OLED_ShowChar(80,6, disbuff1[1],16);OLED_ShowChar(88,6, disbuff1[2],16);OLED_ShowChar(96,6, ' ',16);}}void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}void StartModule() //启动模块{Trig=1; //启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();Trig=0;}void T0_Init()
{TMOD=0x01; //设T0为方式1,GATE=1;TH0=0;TL0=0; ET0=1; //允许T0中断EA=1;
}void get_ult()
{StartModule();while(!Echo); //当RX为零时等待TR0=1; //开启计数while(Echo); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delayms(80);if(mode==1){if(S<set_juli) {OLED_ShowString(72,4,"NO",16);allbuf[12]='0';delayms(10);nRF24L01_TxPacket(allbuf); SPI_RW_Reg(WRITE_REG+STATUS,0XFF); led1=0;delayms(200);sound(); } else{OLED_ShowString(72,4,"OK",16);allbuf[12]='1';delayms(10);nRF24L01_TxPacket(allbuf); SPI_RW_Reg(WRITE_REG+STATUS,0XFF); led1=1;beep=1;}}}
WLAN控制模块:ESP8266
模块使用串口和单片机连接,通过TCP(APP的名字)设置好IP地址和端口号进行连接,在发送端发送代码即可正常控制。
void ESP8266_SendCmd(u8 *pbuf)
{while(*pbuf!='\0') //遇到空格跳出循环 {UART_SendData(*pbuf);delay_10us(5);pbuf++; }delay_10us(5);UART_SendData('\r');//回车delay_10us(5);UART_SendData('\n');//换行delay_ms(10);
}//ESP8266 WIFI发送数据到APP
//pbuf:数据
void ESP8266_SendData(u8 *pbuf)
{ESP8266_SendCmd("AT+CIPSEND=0,7");delay_ms(10);while(*pbuf!='\0') //遇到空格跳出循环 {UART_SendData(*pbuf);delay_10us(5);pbuf++; }UART_SendData('\n');//换行
// delay_ms(10);
}//ESP8266-WIFI模块工作模式初始化
void ESP8266_ModeInit(void)
{ESP8266_SendCmd("AT+CWMODE=2");//设置路由器模式 1 staTIon模式 2 AP点 路由器模式 3 station+AP混合模式ESP8266_SendCmd("AT+CWSAP=\"ESP8266\",\"123456\",11,0"); //设置WIFI热点名及密码ESP8266_SendCmd("AT+CIPAP=\"192.168.4.1\"");ESP8266_SendCmd("AT+RST");//重新启动wifi模块delay_ms(1000);ESP8266_SendCmd("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入ESP8266_SendCmd("AT+CIPSERVER=1,8080"); //启动TCP/IP 端口为8080 实现基于网络控制
} //WIFI控制初始化
void wifi_control_init(void)
{UART_Init();DHT11_start();//初始化DS18B20ESP8266_ModeInit();ES=1;//允许串口中断
}//WIFI控制
void wifi_control(void)
{u8 i=0;u8 xdata temp_value1;delayms(10);i++;if(i==10)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间temp_value1=get_temp();//保留温度值小数后一位if(i==20)//间隔一段时间将读取的温度发送到APP{wifi_send_buf[1]=temp_value1/10+'0';wifi_send_buf[2]=temp_value1%10+'0';ESP8266_SendData(wifi_send_buf);//通过串口发送温度数据到APPi=0;} } //串口中断服务函数
//接收手机APP发送的信号后控制板载资源
void UART_IRQn() interrupt 4
{static u8 i=0;if(RI){RI=0;UART_RX_BUF[i]=SBUF;//读取接收到的数据if(UART_RX_BUF[0]=='+')i++;else i=0;if(i==10){
// ESP8266_SendData(wifi_send_buf);//WIFI控制if(UART_RX_BUF[9]==WLAN_MODE) //先开启wlan模式{wlan_mode=~wlan_mode;led0 =0;led1=0;delayms(500);led0 =1;led1=1;}if(UART_RX_BUF[9]==LED1_ON_CMD) //1 开启2灯{led0 =0;led1=0;}else if(UART_RX_BUF[9]==LED1_OFF_CMD) //2 关闭所有{led0 =1;led1=1;beep=1;MA=0; }else if(UART_RX_BUF[9]== LED1_RELAY) //3 开启继电器{led0 =1;led1=1;MA=0; }else if(UART_RX_BUF[9]==LED1_COLD) //C 制冷吹风{MA=1;led0 =1;led1=1;}else if(UART_RX_BUF[9]==LED1_HOT) //H 继电器加热 chuifeng{ MA=1; led0 =1;led1=1; } else if(UART_RX_BUF[9]==LED1_alarm) //H 继电器加热 chuifeng{ beep=0;led0 =1;led1=1;} i=0;} }
}
温湿度模块:DHT11
测量房间内温湿度并采用PID算法来控制继电器对加热设备的控制,由于继电器本身由延迟,所以导致稳定性不是很好,由于PCB板以及成型,应该使用MOS管来控制电阻来进行PID加热调节。
void DHT11_start()
{Data=1;DHT11_delay_us(2);Data=0;DHT11_delay_ms(30); Data=1;DHT11_delay_us(30);
}uchar DHT11_rec_byte()
{uchar i,dat=0;for(i=0;i<8;i++) { while(!Data); DHT11_delay_us(8); dat<<=1; if(Data==1) dat+=1;while(Data); } return dat;
}
void DHT11_receive()
{uchar rec_dat[9]; DHT11_start();if(Data==0){while(Data==0); DHT11_delay_us(40); R_H=DHT11_rec_byte(); R_L=DHT11_rec_byte(); T_H=DHT11_rec_byte(); T_L=DHT11_rec_byte(); revise=DHT11_rec_byte(); DHT11_delay_us(25); if((R_H+R_L+T_H+T_L)==revise) {RH=R_H;RL=R_L;TH=T_H;TL=T_L;} rec_dat[0]='0'+RH/10;rec_dat[1]='0'+RH%10;rec_dat[2]=' ';rec_dat[3]=' ';//温度rec_dat[4]='0'+TH/10;rec_dat[5]='0'+TH%10; rec_dat[6]=' ';}
}void dht11_show()
{u8 tpbuf[2];u8 damp_buf[2];DHT11_receive();
/*********************************************************************************************************/ temp_val=get_temp();//温度tpbuf[0]=temp_val/10+'0'; tpbuf[1]=temp_val%10+'0';OLED_ShowChar(56,0,tpbuf[0],16);//温度1OLED_ShowChar(64,0,tpbuf[1],16);//温度2OLED_ShowString(80,0,"C",16);
/*********************************************************************************************************/ damp_val=get_damp();//温度damp_buf[0]=damp_val/10+'0';damp_buf[1]=damp_val%10+'0';OLED_ShowChar(56,2,damp_buf[0],16);//湿度1OLED_ShowChar(64,2,damp_buf[1],16);//湿度2 OLED_ShowString(80,2,"%",16);
/*********************************************************************************************************/ OLED_ShowChinese1(0,0,0,16);//温OLED_ShowChinese1(16,0,1,16);//度OLED_ShowChinese1(32,0,5,16);//值OLED_ShowString(48,0,":",16);OLED_ShowChinese1(0,2,2,16);//湿OLED_ShowChinese1(16,2,1,16);//度OLED_ShowChinese1(32,2,5,16);//值OLED_ShowString(48,2,":",16);allbuf[0]=damp_buf[0];allbuf[1]=damp_buf[1];allbuf[2]=tpbuf[0];allbuf[3]=tpbuf[1];delayms(10);nRF24L01_TxPacket(allbuf); SPI_RW_Reg(WRITE_REG+STATUS,0XFF); }unsigned char get_temp() //单独获取温度
{unsigned char temp=0;DHT11_receive();temp=TH;if(temp)return temp;elsereturn -temp;}unsigned char get_damp() //单独获取湿度
{unsigned char damp=0;DHT11_receive();damp=RH;if(damp)return damp;elsereturn -damp;}
后续从主机代码过多就不一一放下了,可以看视频演示
视频演示:
从主机演示——主机密码解锁
主机密码锁
从主机演示——从主机交互
智能家居中控
视频中语音模块通知不完整已经解决,原因为延时太短导致语音还未完全合成就执行下一次语句。
PCB和AD图
从机
主机
基于单片机智能家居系统-中控面板设计相关推荐
- 基于Domoticz智能家居系统(十四)用ESP8266做MQTT客户端实验
基于Domoticz智能家居系统(十四)用ESP8266做MQTT客户端实验 用ESP8266做MQTT客户端 一些前期的准备 第一步 设置ESP8266开发板的BSP的搜索引擎链接 第二步 下载安装 ...
- android 智能家居开发,基于Android智能家居系统的设计与实现
摘要: 近年来,移动互联网技术的进步和智能终端设备的普及促进了智能家居产业的发展.同时,伴随着Android系统在手机.平板中广泛应用,人们通过一个Android设备远程控制家电设备,将与生活密切相关 ...
- 机智云AIoT+arduino单片机+智能家居系统及安防控制
摘要:提出了一种基于机智云物联网云平台和Arduino单片机控制的智能家居安防系统设计模式,主要研究智能家居系统在无线组网技术和下位机子系统的软硬件功能,经过理论验证.仿真实验.电路搭建到智能家居模型 ...
- 基于Domoticz智能家居系统(十三)Domoticz-3.8153在Tiny6410开发板上的移植
Domoticz-3.8153在Tiny6410开发板上的移植 本文将在友善之臂Tiny6410开发板上移植Domoticz-3.8153,起因是去年在mini2440上移植的3.5877版本编译出来 ...
- 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验 一个简单MySensors客户端的验证实验 一. ...
- 基于Domoticz智能家居系统(十六)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(二)正式DIY
DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(二)正式DIY 正式DIY 一.本文参考的国外DIY项目 二.本文采用的模块和连接线路 1.ES ...
- 基于单片机的蓝牙智能家居系统
设计简介: 本设计是基于单片机的蓝牙智能家居系统,主要实现以下功能: 可通过蓝牙连接手机并进行控制: 可通过按键控制各个模块: 可通过四相步进电机模拟窗帘的开关: 标签:51单片机.四相步进电机.蓝牙 ...
- 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)
前言 该智能家居系统以 STC89C52单片机为控制核心,结合 LCD1602 液晶显示屏.L298N电机驱动模块.光敏电阻,ESP8266WiFi模块,DS18B20温度计设计并实现了自动感光窗帘与 ...
- 【毕业设计】基于zigbee的智能家居系统 - 单片机 物联网 stm32
文章目录 1 简介 2前言 2.1 系统目标 3 系统架构 3.1 网关板设计: 3.2 ZigBee网络感知层 3.3 显示控制平台及数据保存 3.4 NB-IOT模块实现 实现效果 4 最后 1 ...
最新文章
- 绝地求生 android版支持蓝牙吗,绝地求生怎么蓝牙耳机设置听脚步 | 手游网游页游攻略大全...
- BASIC-23_蓝桥杯_芯片测试
- html一个层下面两个小层并奇,我是一个奇数是一个两位数,十位数字与个位数字的积是2,猜猜看我是几?——青夏教育精英家教网——...
- WPF基础到企业应用系列7——深入剖析依赖属性(三)
- 基于Echarts+HTML5可视化数据大屏展示—Echart图例使用
- 【SQL Sever】将SQL Sever中的一个数据表的数据导出为insert语句
- JavaScript前端俄罗斯方块小游戏
- 如何有效使用Project
- Letters[Codeforces-43B]
- 互动快报读报软件绿色版 v5.061
- numpy npy,npz,csv文件存取
- 基于HPC场景的集群管理系统(slurm系统初相识)
- android qq音乐无法连接网络连接,qq音乐不能播放_qq音乐为什么老是提示说歌曲无效或网络连接失败呢?...
- 技术使用总结-旷视人脸识别-(APP中H5接入)
- 固态硬盘坏了怎么恢复数据恢复
- [工具]Snipaste 屏幕截图软件超级利器 - 花3年精心打造的极致截图贴图/编辑/标注工具
- RFC2617- HTTP Authentication自译本-(3) (转)
- 【java有限状态机选型】
- Android之单元测试
- 大工17秋计算机英语,大工17秋《大学英语1(远程英语1)》在线测试31