简易智能家居系统 一、任务和要求 1、任务 设计并制作一套简易智能家居系统。系统结构如下图所示。 2、要求 1)51单片机(终端结点)能实现温度的测量,并能将温度在LCD显示器上显示; 2)51单片机(终端结点)能检测有无火灾发生,并将火警送LCD显示器上显示; 3)51单片机(终端结点)能实现对D1、D2、D3三盏LED灯的开关的控制,并将灯的工作状态送LCD显示器显示; 4)51单片机通过串口WIFI模块连接,把WIFI模块设置成透传工作模式,WIFI模块通过路由器连接上所在的网络; 5)通过网络调试助手将计算机设置成TCP SERVER,并通过网络调试助手实现温度的采集与显示、火警状态显示、LED灯工作状态的显示,并能通过网络调试助手控制LED灯的工作; 6)用有人手机网络调试助手将手机设置成TCP SERVER,实现用手机显示温度、火警状态、LED灯的工作状态,并能通过手机网络调试助手控制LED灯的工作。 7)将终端结点的工作状态上传到ONENET物联网云平台。 二、温度的采集、火警检测与LED灯的控制 功能要求:本模块以51单片机为核心,用温度传感器DS18B20测量温度,通过火灾传感器检测有无火灾发生,用独立按键开关三盏LED灯,并将温度和LED灯的工作状态在LCD1602上显示。 1)独立按键 2)1602LCD显示器接口 3)LED模块 分别用单片机开发板上的K1、K2、K3这三个按键模拟开关,用开发板上的D5、D6、D7三个LED模拟三盏灯。其程序流程图如下: 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式 LCD,目前常用 16*1, 16*2,20*2 和 40*2 行等的模块。本设计中用的显示器为LCD1602 字符型液晶显示器,是一种16*2的显示器。为例,其实物如下图;1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。其详细资料请看“LCD1602中文资料”。 
在本设计中,为同学们提供了LCD1602的驱动文件lcd.c和lcd.h,可调用的函数及功能如下: 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初始化 1)DS18B20概述 DS18B20是单线数字温度传感器,即“一线器件”,其采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。 其主要特点、内部结构和工作时序请详见“数字温度传感器DS18B20的应用”PPT。 2)DS18B20进行一次温度的转换 (1)主机先作个复位操作, (2)主机再写跳过ROM的操作(CCH)命令, (3)然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总线状态如下图。 3)读取DS18B20的温度 读取RAM内的温度数据。同样,这个操作也要接照三个步骤。 (1)主机发出复位操作并接收DS18B20的应答(存在)脉冲。 (2)主机发出跳过对ROM操作的命令(CCH)。 (3)主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同样读取数据也是低位在前的。整个操作的总线状态如下图: 4)18B20的驱动程序 本设计中使用DS18B20的驱动程序ds18b20.c和ds18b20.h,文件中提供了如下的函数。 void Delay_OneWire(unsigned int t);//单总线延时函数 void Write_DS18B20(unsigned char dat);//通过单总线向DS18B20写一个字节 unsigned char Read_DS18B20(void);//从DS18B20读取一个字节 bit init_ds18b20(void);//DS18B20设备初始化 5)18B20测温流程图 要点: 1、在读取温度数据时,是低8位在前,高8位在后,需要将这两个数据合并为一个数据; 2、读取的温度是补码形式表示的,需将转换成原码; 3、求实际温度公式:temp=tp*0.0625*100+0.5(tp为浮点开数据,temp为无符号整形数据,此数据为实际温度的100倍),乘上100是为温度小数后保留2位,加上0.5起校正数据的作用。 4、将温度数据存入数组时,需将各位数据分离开来,再存入数组,例: datatemp[0] = temp / 10000+0x30; datatemp[1] = temp % 10000 / 1000+0x30; 功能说明: 编程时,用变量receivedata接收串口助手发送过来的单个字符数据,分别用字符a、c和e打开D1、D2和D3灯,分别用字符b、d和f关闭D1、D2和D3灯,其程序流程图如下: 功能说明: 编程时,用字符数组receivedata接收串口助手发送过来的字符串数据,分别用字符串d1on、d2on和d3on打开D1、D2和D3灯,分别用字符串在d1off、d2off和d3off关闭D1、D2和D3灯,其程序流程图参考用单个字符控制LED灯工作的流程图。 1、ESP8266WIFI模块简介 ESP8266是一个完整且成体系的WIFI网络解决方案,能够搭载软件应用,或通过另一个应用处理器卸载所有WIFI网络功能。本设计中我们使用的ESP8266是串口型WIFI,速度比较低,不能用来传输图像或者视频这些大容量的数据,主要应用于数据量传输比较少的场合,比如温度信息,一些传感器的开关量等。虽然传输的数据量比较少,但也能一次传输几千字节的数据,而且通信非常稳定,可以满足大多数应用。 ESP8266-WIFI模块支持STA/AP/STA+AP三种工作模式。 STA模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。 AP模式:默认模式,ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。 STA+AP模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。 ESP8266-WIFI模块仅在单连接状态,支持透传模式(TCP CLIENT透传和UDP透传)。 3、引脚排列 3、模块和单片机开发板的连接 GND:接地 GPIO16:其实是RST,低电平复位,所以为了正常工作,连接开发板3.3V电源 VCC:接单片机开发板VCC UTXD、URXD:前者接单片机或USB转串口模块的RXD,后者接TXD。单片机P3.0为RX,P3.1为TX。特别注意当用单片机开发板串口测试WIFI模块时,模块的UTXD、URXD要分别和单片机串口的TX和RX连接。 GPIO2、GPIO0:悬空 CH_PD:连接开发板3.3V电源 三、WIFI模块AT指令的测试 1、WIFI模块的AT指令测试 特别提示:通过串口用AT指令测试WIFI模块时,模块的UTXD、URXD要分别和单片机串口的TX和RX连接。 测试AT指令时,首先打开串口助手,如下图: 设置串口号和波特率,波特率一般为115200或9600,本次实验所用模块已统一设置成为2400,在串口助手勾发送新行(如下图所示),然后发送AT,如果先出现OK则说明该模块能正常工作。 关于AT指令的测试,请同学参考文档“AT指令集018.pdf”对AT指令进行测试。 2、WIFI模块通过网络和计算机通信的AT指令 1)重启wifi模块 指令:AT+RST 返回:OK 2)设置WIFI模块的工作模式 指令:AT+CWMODE=3//设置模块为透传工作模式 返回:OK 3)登录路由器 指令:AT+CWJAP="TP-LINK_ym2","12345678"//登录路由器,路由wifi用户名和密码 返回:WIFI CONNECTED WIFI GOT IP 4)连接TCP服务器(wifi模块作为客户端,计算机作为服务器,要先打开监听) 首先要打开软件网络调试助手,协议类型为TCP Server,点击开始监听。 
指令: AT+CIPSTART="TCP","192.168.0.100",8080 返回:Connect OK 执行以上指令后,wifi模块就会连接到计算机的TCP Server,在网络调试助手上的连接对象栏就会出现WIFI模块的IP地址及端口号,如下图所示: 
5)使能透传模式 指令:AT+CIPMODE=1 返回:OK 6)透传发送数据 指令:AT+CIPSEND 返回:>(在此提示下可以发送数据) 7)退出透传数据发送 指令:+++(去掉串口助手中发送新行选项) 返回:返回到AT指令模式 执行了以上的AT指令以后,用串口调试助手和网络调试助手就可以实现WIFI模块通过路由器和计算机进行数据通信了。 3、WIFI模块和手机进行通信(WIFI模块作为客户端,手机作为服务器) 4)连接TCP服务器(wifi模块作为客户端,手机作为服务器,要先打开监听) 首先在手机上安装有人网络调试助手的APP,打开APP如下图所示: 
选择tcp server,点击配置,设置手机的端口号,再点击激活后,会在手机屏幕上显示手机的IP和端口号,请一定记住IP和端口号,输入以下指令。 指令: AT+CIPSTART="TCP","192.168.1.122",5000//手机的IP和端口号 返回:CONNECT OK 执行以上指令后,网络助手上会显示wifi模块的IP和端口号,如下图: 
5)使能透传模式 指令:AT+CIPMODE=1 返回:OK 6)透传发送数据 指令:AT+CIPSEND 返回:>(在此提示下可以发送数据) 7)退出透传数据发送 指令:+++(去掉串口助手中发送新行选项) 返回:返回到AT指令模式 4、多连接 server 目前 AT Demo ESP8266作为服务器, 需建立多连接作为服务器, 需建立多连接即可以连接多个client。 以下为 ESP 8266 作为 softAP建立 TCP 服务器的举例 服务器的举例 : 1) 设置 wifi 模式: AT+CWMODE=3// 设置为 AP+station共存模式 响应: OK 2) 重启生效 AT+RST 响应: OK 3) 启动多连接 AT+CIPMUX=1 响应: OK 4) 建立 server AT+CIPSERVER=1 //默认端口 333 333 响应 :OK 5) PC 连入设备 softAP ,PC作client 连接设备。 连接设备。 注意, ESP8266 作为 server 有超时机制, 如果连接建立后超时机制, 如果连接建立后一段 时间内无数据来往, server 会将 client 踢掉。请在 PC 工具连上 ESP8266 后建立一个 2s 的循环数据发送,用于保持连接。 6) 发送数据 AT+CIPSEND=0,4 // 0是设备的通信号,4表示四个字节 响应: SEND OK 7) 接收数据 +IPD,n:xxxxxxxxxx // n表示通信号 ,xxxxx 为数据
四、WIFI模块通过网络和计算机通信的编程实现 特别提示:单片机开发板通过串口发送AT指令测试WIFI模块时,模块的UTXD、URXD要分别和单片机串口的RX和TX连接。 用单片机发送相应的AT指令程序语句如下: uart_sendstring("AT+RST\r\n"); delay(50); uart_sendstring("AT+CWMODE=3\r\n"); delay(20); uart_sendstring("AT+CWJAP=\"TP-LINK_ym2\",\"12345678\"\r\n"); delay(50); uart_sendstring("AT+CIPSTART=\"TCP\",\"192.168.0.110\",8080\r\n"); delay(20); uart_sendstring("AT+CIPMODE=1\r\n");//使能透传模式 delay(20); uart_sendstring("AT+CIPSEND\r\n");//透传发送数据 delay(20)注意:如用定时器0定时发送数据时,串口中断优先级一定要高于定时器0中断。 五、WIFI模块和手机进行通信的编程实现 用单片机发送相应的AT指令程序语句如下: uart_sendstring("AT+RST\r\n"); delay(50); uart_sendstring("AT+CWMODE=3\r\n"); delay(20); uart_sendstring("AT+CWJAP=\"手机热点名\",\"密码\"\r\n"); delay(50); uart_sendstring("AT+CIPSTART=\"TCP\",\"192.168.1.122\",5000\r\n");//wifi作为 TCP client,手机作为TCP服务器, 连接 TCP server: delay(50); uart_sendstring("AT+CIPMODE=1\r\n");//使能透传模式 delay(20); uart_sendstring("AT+CIPSEND\r\n");//透传发送数据 delay(20); 六、基于ONENET的简易智能家居系统 OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署。OneNET物联网专网已经应用于环境监控、远程抄表、智慧农业、智能家电、智能硬件、节能减排、车联网、工业控制、物流跟踪等多种商业领域。 到目前为止平台支持的公开接入协议主要包括HTTP、EDP、MQTT,、MODBUS、JT/T808五种,本设计采用HTTP接入ONENET。 1、用网络助手连接ONENET,上传数据到ONENET 1)注册ONENET用户 进入ONENET主页( https://open.iot.10086.cn/),如下图,注册帐号。 
2)进入开发者中心,创建产品 
3)创建设备 请记住设备的ID号和产品的APIKEY 
4)计算作为TCP客户端,上传数据到ONENET ONENET云平台HTTP接入协议服务器IP:183.230.40.33,端口号:80 
发送数据的格式指令如下,指令格式不能有错,否则云平台接收不到数据。 POST /devices/32161187/datapoints?type=3 HTTP/1.1(红色的为设备的ID号) api-key: 87fKUPvenMiyB8lXgng=u0OY5eU= (产品的唯一APIKEY ) Host: api.heclouds.com Content-Length: 15(回车换行) (回车换行) {wendu":23}(回车换行) 数据发送成功以后,可以在ONENET平台观察到上传的数据,如下图: 
如果想通过网页来浏览上传的数据,可以通过应用管理,创建应用的方式创建应用,并通过网址来访问。 
2、把wifi模块作为TCP客户端,通过串口助手把数据上传到ONENET 1)wifi模块登录路由器,登录ONENET 此步骤和前面所学的wifi模块登录计算机作为TCP服务器完全相同,这里不再赘述。 2)通过串口助手把数据上传到ONENET 因为要一次发多条指令,所以使用一次发送多条指令的XCOM串口助手。如下图 
ONENET平台一样可以接收到上传的数据。 3)通过编程实现数据的上传 (1)登录ONENET函数 - void tcpserverlogin(void)
- {
- uart_sendstring("AT+RST\r\n");
- delay(50);
- uart_sendstring("AT+CWMODE=3\r\n");
- delay(50);
- uart_sendstring("AT+CWJAP=\"TP-LINK_ym2\",\"12345678\"\r\n");
- delay(100);
- uart_sendstring("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n");
- delay(50);
- uart_sendstring("AT+CIPMODE=1\r\n");//使能透传模式
- delay(20);
- uart_sendstring("AT+CIPSEND\r\n");//透传发送数据
- delay(20);
- }
- (2)上传数据函数
- void senddata(void)
- {
- uart_sendstring("POST /devices/32161187/datapoints?type=3 HTTP/1.1\r\n");
- delay20ms();
- uart_sendstring("api-key:87fKUPvenMiyB8lXgng=u0OY5eU=\r\n");
- delay20ms();
- uart_sendstring("Host:api.heclouds.com\r\n");
- delay20ms();
- uart_sendstring("Content-Length:15\r\n");
- delay20ms();
- uart_sendstring("\r\n");
- delay20ms();
- uart_sendstring("{\"wendu\":");
- delay20ms();
- uart_sendstring(wd);//12.6
- uart_sendstring("}\r\n");
- delay20ms();
- uart_sendstring("\r\n");
- delay(100);
- }
复制代码
完整的Word格式文档51黑下载地址:
物联网综合设计实验指导.docx
(1.18 MB, 下载次数: 68)
|