基本介绍
最近做了一个基于51单片机(STC89C52)+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示。51单片机采集DHT11模块的温度和湿度,通过ESP8266模块上传温湿度到oneNET平台,然后通过APP查看温湿度模块,同时LCD1602也同样显示温度和湿度。还可以设定按键控制但单片机外设,比如APP按键按下让单片机点亮一个灯等等。。。。。
器件
51单片机
ESP8266
我用的是 01s
DHT11温湿度
usb-ttl模块
实现思路
get方式 是获取平台上面的数据,正常我们单单做温湿度显示 不需要用到,如果需要用到按键等则需要。
实现步骤
1:注册oneNET平台
进入中国移动oneNETo平台:oneNET 先注册平台
2:测试ESP8266是否正常
这里就需要ESP8266 和 USB-TTL接好线了
2.1:接线:
注意模块是3.3V
2.2:打开电脑串口小助手发送指令:
指令: AT
esp8266波特率默认是115200 我们51单片机晶振11.0592或者12 太低上不去,所以先把esp8266波特率改成9600 记得你得是跟esp8266模块波特率同样你才发送哦 不一样发送了也没用。
指令: AT+UART=9600,8,1,0,0
指令: AT+CWMODE=3 //设置WIFI应用模式 (成功返回会有OK)
指令: AT+RST //重置WIFI模块 (成功返回会有OK)
3:连接网络
指令: AT+CWJAP=“wifiNane”,“password” //连接无线路由器(手机热点啥的)
Wifiname: 就是你的热点名字 或者WiFi的名字
Password: 你的热点密码 或者WiFi密码
4:上传数据
指令:
AT+CIPSTART=“TCP”,“183.230.40.33”,80 //和服务器建立TCP连接
AT+CIPMODE=1 //进入透明传输模式
AT+CIPSEND //开始传输
POST /devices/XXXXXXXXX/datapoints?type=5 HTTP/1.1
api-key:??????????????????
Host:api.heclouds.com
Content-Length:10
,;temp,27
XXXXXXXXX:设备ID
??????????????????:api-key值
5:设置APP应用
获取平台上的数据呢?(想点击按键 让单片机点灯?播放音乐?等等)
6:代码编写呈现(部分)
mian.c
#include #include "stdlib.h" #include "lcd1602.h" #include "delay.h" #include "uart.h" #include "dht11.h" #include "esp8266.h" /*主程序入口*/ void main() { BEEP = 0; initEsp8266(); //初始化ESP8266 initUart(); //初始化串口 init_lcd(); //初始化LCD1602 display_str(); //LCD1602 显示 temp: humi: BEEP = 1; while(1) { delay1s(); DHT_receive(); //DHT11读取函数 DHT_LCD1602_display(); //1602显示温湿度 temp_upload(); //上传温度数据 humi_upload(); //上传湿度数据 LED1 = ~LED1; } } lcd1602.c #include #include "lcd1602.h" #define LCD P0 sbit E = P2^7; sbit RS = P2^6; sbit RW = P2^5; /******延迟5毫秒函数********/ void delay5ms() //误差 -0.000000000001us { unsigned char a,b; for(b=15;b>0;b--) for(a=152;a>0;a--); } /******LCD1602写命令函数********/ void write_com(unsigned char command) { RS = 0; RW = 0; //高读低写 LCD = command; delay5ms(); //这里延时最低要30纳秒 我们直接给5ms E = 1; //使能拉高 delay5ms(); //最低要求延迟150纳秒 我们直接给5ms E = 0; } /******LCD1602写数据函数********/ void write_data(unsigned char dat) { RS = 1; RW = 0; LCD = dat; delay5ms(); //这里延时最低要30纳秒 我们直接给5ms E = 1; //使能拉高 delay5ms(); //最低要求延迟150纳秒 我们直接给5ms E = 0; } /******初始化LCD1602********/ void init_lcd() { write_com(0x06); //写入数据后光标自动右移 整屏不移动。 0x40(光标左移 整屏不移动)0x05(左移 整屏右移)0x07(右移 整屏右移) write_com(0x0c); //开显示功能 无光标 不闪烁 write_com(0x38); //数据总线8位 16X2显示 5*7点阵 write_com(0x01); //清屏 0000 0001 } esp8266.c #include #include "esp8266.h" #include "delay.h" #include "uart.h" #include #define time 100 //宏定义 延时的时间 char T[5] = {'