大家好,欢迎来到IT知识分享网。
摘要
关键字:智能家居、51单片机、温度传感器、LED模块、串口显示、AT指令
智能家居是以住宅为平台,利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。作为家庭信息化的实现方式,智能家居已成为社会信息化发展的重要组成部分,物联网因其巨大的应用前景,将是智能家居产业发展过程中一个比较现实的突破口,对智能家居产业的发展具有重大意义。
家居智能化技术最早在美国开始发展,在智能家居系统中每个设备都能够实现资源共享,它布线简、功能多样灵活,能够帮助主人有效的利用时间、减少浪费,因此深受人们的喜爱。智能家居可以被人们理解成一个过程,或者说是一种系统。通过计算机科技、网络连接技术、简易布线装置,把和家庭有关的一切生活类系统组合在一起,让家庭变得安全、舒适,令人放心。在智能家居网中,智能家居不单拥有传统的家具功能,为人类提供舒适的居住环境还能够使房屋有“思想”,变得智能化。
一、系统设计要求及总体设计方案
1.1 设计要求
- 51单片机(终端结点)能实现温度的测量,并能将温度在LCD显示器上显示
- 51单片机(终端结点)能检测有无火灾发生,并将火警送LCD显示器上显示
- 51单片机(终端结点)能实现对D1、D2、D3三盏LED灯的开关的控制,并将灯的工作状态送LCD显示器显示
- 51单片机通过串口WIFI模块连接,把WIFI模块设置成透传工作模式,WIFI模块通过路由器连接上所在的网络
- 通过网络调试助手将计算机设置成TCP SERVER,并通过网络调试助手实现温度的采集与显示、火警状态显示、LED灯工作状态的显示,并能通过网络调试助手控制LED灯的工作
- 用有人手机网络调试助手将手机设置成TCP SERVER,实现用手机显示温度、火警状态、LED灯的工作状态,并能通过手机网络调试助手控制LED灯的工作。
1.2 总体设计方案
二、终端结点的设计及实现
2.1单片机最小系统
2.2 LED灯的控制与工作状态的显示
要求:用独立按键开关三盏LED灯,并将LED灯的工作状态在LCD1602上显示。
实验思路:要实现独立按按键控制LED灯的工作,首先要分别用单片机开发板上的K1、K2、K3这三个按键模拟开关,用开发板上的D5、D6、D7三个LED模拟三盏灯,通过程序代码的编写与运行实现软件部分的功能,通过烧录文件,将程序下载到51单片机开发板上。
2.2.1 硬件设计
2.2.2 软件设计
2.3 温度的测量与显示
1.LCD1602显示器可调用的函数及功能:
void Lcd1602_Delay1ms(uint c); //误差 0us void Read_Busy(); //忙检测函数,判断bit7是0,允许执行;1禁止 void Lcd1602_Write_Cmd(unsigned char cmd); //写命令 void Lcd1602_Write_Data(unsigned char dat); //写数据 void LcdSetCursor(unsigned char x,unsigned char y); //坐标显示 void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); //显示字符串 void InitLcd1602(); //1602初始化
- 温度传感器DS18B20
(1)DS18B20是单线数字温度传感器,即“一线器件”,其采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络。 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
(2)DS18B20进行一次温度的转换,需要主机先作个复位操作,主机再写跳过ROM的操作(CCH)命令,然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。
(3)读取DS18B20的温度,即读取RAM内的温度数据,需要主机发出复位操作并接收DS18B20的应答(存在)脉冲,然后主机发出跳过对ROM操作的命令(CCH),最后主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。(如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可)
(4)DS18B20的驱动程序:
void Delay_OneWire(unsigned int t); //单总线延时函数 void Write_DS18B20(unsigned char dat); //通过单总线向DS18B20写一个字节 unsigned char Read_DS18B20(void); //从DS18B20读取一个字节 bit init_ds18b20(void); //DS18B20设备初始化
2.4 火灾的监测与报警
void init_into(void) {
EX0=1; EA=1; IT0=0; } void into(void) interrupt 0 {
LcdShowStr(8,0,"fire!!!"); sound=1; delay1ms(); sound=0; delay1ms(); } if(fire==0) {
uart_sendstring("fire!!!\r\n"); } else {
uart_sendstring("no fire!\r\n"); }
2.5 串口的显示与控制
三、网络传输与控制
3.1 ESP8266WiFi模块介绍
3.2 透传工作模式计算机作为TCP SERVER的监控
3.3 透传工作模式手机作为服务器的监控
3.4 数据上传到ONENET云平台
{“datastreams”:[{“id”:“ip”,“datapoints”:[{“value”:“192.168.5.88”}]}]}
四、系统测试
4.1 本地的控制与工作状态的显示
4.2远程的控制与工作状态的显示
4.2.1 透传工作模式计算机作为TCP SERVER的监控测
4.2.2 透传工作模式手机作为服务器的监控
五、体会与总结
在这次的课程实验过程中,前面的基础实验操作,比如开发板上按键对应LED灯的控制,温度传感器对温度的监控与测量,以及蜂鸣器工作室的火警报警功能等,这些都是为后来大的系统功能打基础,由小的功能模块组成大的系统功能实现,这些都是我们小组跟着老师的步伐与思路进行的相对顺利的,也得到了预期的结果。实验过程中,问题主要出现在无线通信的部分,在进行PC机发送指令语句控制单片机功能模块和WIFI模块与手机互连进行数据传输通信时,我们常常出现连接不成功或是操作不当导致乱码的情况,然而在百度查阅资料和询问同学的帮助下,我们一次次攻克了难题,最终通过网络路由互联实现了由手机(客户端)发送命令语句控制单片机开发板上LED灯(家居)亮灭的功能,即模拟智能家居系统中用户直接通过客户端对家具进行控制的智能操作。
程序代码
#include"reg51.h" #include"lcd.h" #include"ds18b20.h" #include"string.h" #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit k1=P1^4; sbit k2=P1^5; sbit k3=P1^6; sbit d1=P2^2; sbit d2=P2^3; sbit d3=P2^4; sbit fire=P3^2; sbit sound=P2^1; uchar count,i=0; uchar tempdata[7]={
0,0,0,'.',0,0,'\0'} ; uchar recedata[8]=" "; void delay5ms(void) {
uchar i,j; for(i=10;i>0;i--) for(j=200;j>0;j--) ; } void delay1ms(void) {
uchar i,j; for(i=2;i>0;i--) for(j=200;j>0;j--) ; } void delay500ms(void) {
uchar i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=100;k>0;k--) ; } void delay20ms() //@11.0592MHz {
unsigned char i, j, k; _nop_(); _nop_(); i = 1; j = 216; k = 35; do {
do {
while (--k); } while (--j); } while (--i); } void delay(uchar x) {
uchar i,j; while(x--) {
for(j=200;j>0;j--) for(i=248;i>0;i--) ; } } void k1scan(void) {
if(k1==0) {
delay5ms(); if(k1==0) {
d1=~d1;} do {
delay5ms();} while(k1==0); } } void k2scan(void) {
if(k2==0) {
delay5ms(); if(k2==0) {
d2=~d2;} do {
delay5ms();} while(k2==0); } } void k3scan(void) {
if(k3==0) {
delay5ms(); if(k3==0) {
d3=~d3;} do {
delay5ms();} while(k3==0); } } void startuptemp(void) {
init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); delay500ms(); } int readtemp(void) {
uchar temph,templ; int temp; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); templ=Read_DS18B20(); temph=Read_DS18B20(); temp=temph; temp=temp<<8; temp=temp|templ; return temp; } void tempdealdisp(int temp) {
float tp; if(temp<0) {
temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; LcdShowStr(0,0,"-"); } else {
tp=temp; temp=tp*0.0625*100+0.5; LcdShowStr(0,0,"+"); } tempdata[0]=temp/10000+0x30; tempdata[1]=temp%10000/1000+0x30; tempdata[2]=temp%1000/100+0x30; tempdata[3]='.'; tempdata[4]=temp%100/10+0x30; tempdata[5]=temp%10+0x30; tempdata[6]='\0'; LcdShowStr(1,0,tempdata); LcdShowStr(7,0," "); } void init_it0(void) {
EX0=1; EA=1; IT0=0; } void it0(void) interrupt 0 {
LcdShowStr(8,0,"fire!!!"); sound=1; delay1ms(); sound=0; delay1ms(); } void lampworking(void) {
if(d1==0) {
LcdShowStr(0,1,"1:on "); } else {
LcdShowStr(0,1,"1:off"); } if(d2==0) {
LcdShowStr(5,1,"2:on "); } else {
LcdShowStr(5,1,"2:off"); } if(d3==0) {
LcdShowStr(10,1,"3:on "); } else {
LcdShowStr(10,1,"3:off"); } } void uart_init(void) {
SCON=0X50; TMOD=0X20; PCON=0X00; IP=0x02; TH1=0xF3; //波特率2400 TL1=0xF3; ES=1; EA=1; TR1=1; } void t0_init(void) {
TMOD=TMOD&0XF0; TMOD=TMOD|0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; } void uart_sendstring(uchar *str) {
TR0=0; while(*str!='\0') {
SBUF=*str; while(TI==0); TI=0; str++; } TR0=1; } void senddata(void) {
uart_sendstring("POST /devices//datapoints?type=3 HTTP/1.1\r\n"); uart_sendstring("api-key:YH4jdhz=mvLEuhwOSDRXTqHUwFs=\r\n"); uart_sendstring("Host:api.heclouds.com\r\n"); uart_sendstring("Content-Length:19\r\n"); uart_sendstring("\r\n"); uart_sendstring("{\"wendu\":"); uart_sendstring(tempdata);//12.6 uart_sendstring("}\r\n"); uart_sendstring("\r\n"); delay(100); } void t0(void ) interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==100) {
count=0; senddata(); count=0; } } void uart_rec(void) interrupt 4 {
if(RI==1) {
recedata[i]=SBUF; RI=0; i++; if(recedata[i-1]=='9') {
recedata[i-1]='\0'; i=0; } if(strcmp(recedata,"d1on")==0) {
d1=0; } if(strcmp(recedata,"d1off")==0) {
d1=1; } if(strcmp(recedata,"d2on")==0) {
d2=0; } if(strcmp(recedata,"d2off")==0) {
d2=1; } if(strcmp(recedata,"d3on")==0) {
d3=0; } if(strcmp(recedata,"d3off")==0) {
d3=1; } } } void tcpserverlogin(void) {
uart_sendstring("AT+RST\r\n"); delay(50); uart_sendstring("AT+CWMODE=3\r\n"); delay(20); uart_sendstring("AT+CWJAP=\"45626\",\"\"\r\n"); delay(100); // uart_sendstring("AT+CIPSTART=\"TCP\",\"56.69.11.54\",8234\r\n");//设备作为 TCP client 连接 TCP server: // uart_sendstring("AT+CIPSTART=\"TCP\",\"192.168.1.101\",8080\r\n"); uart_sendstring("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"); delay(100); uart_sendstring("AT+CIPMODE=1\r\n");//使能透传模式 delay(20); uart_sendstring("AT+CIPSEND\r\n");//透传发送数据 delay(20); } main() {
d1=1; d2=1; d3=1; init_it0(); InitLcd1602(); uart_init(); tcpserverlogin(); t0_init(); while(1) {
k1scan(); k2scan(); k3scan(); startuptemp(); tempdealdisp(readtemp()); lampworking(); if(fire==1) {
LcdShowStr(8,0,"no fire");} } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119951.html






