STM32
登录
直播中
刘玉兰
8年用户
1096经验值
私信
关注
[问答]
如何去实现一个基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示呢
开启该帖子的消息推送
LCD1602
ESP8266
DHT11
如何去实现一个基于51
单片机
+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示呢?其实现步骤有哪些呢?
回帖
(1)
王云玲
2021-12-17 11:59:12
基本介绍
最近做了一个基于51单片机(STC89C52)+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示。51单片机采集DHT11模块的温度和湿度,通过ESP8266模块上传温湿度到oneNET平台,然后通过APP查看温湿度模块,同时LCD1602也同样显示温度和湿度。还可以设定按键控制但单片机外设,比如APP按键按下让单片机点亮一个灯等等。。。。。
器件
51单片机
ESP8266
我用的是 01s
DHT11温湿度
u***-ttl模块
实现思路
get方式 是获取平台上面的数据,正常我们单单做温湿度显示 不需要用到,如果需要用到按键等则需要。
实现步骤
1:注册oneNET平台
进入中国移动oneNETo平台:
oneNET
先注册平台
2:测试ESP8266是否正常
这里就需要ESP8266 和 USB-TTL接好线了
2.1:接线:
[tr]ESP8266USB-TTL[/tr]
3.3V
3.3V
TX
RX
RX
TX
注意模块是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
***it E = P2^7;
***it RS = P2^6;
***it 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] = {'