基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示

发布者:Aningmeng最新更新时间:2022-09-20 来源: csdn关键字:51单片机  DHT11  温湿度模块  ESP8266模块  oneNET  LCD1602显示 手机看文章 扫描二维码
随时随地手机看文章

基本介绍

最近做了一个基于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:接线:

image.png

注意模块是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] = {''}; //上传平台的温度值

char H[5] = {''}; //上传平台的湿度值


/*esp8266初始化*/

void initEsp8266()

{

  delayms(300);

    sendString("AT+CWMODE=3rn"); //设置WIFI应用模式

delayms(300); //设置WIFI应用模式

sendString("AT+RSTrn"); //重置WIFI模块

delayms(300);

sendString("AT+CIFSRrn"); //查询本地IP

delayms(1000);

sendString("AT+CWJAP="wifi_name","password"rn");//连接无线路由器

delayms(6000);

}


uart.c

#include

#include "uart.h"


/*单片机发送一个字节函数*/

void sendChar(unsigned char a)

{

SBUF = a;

while(TI==0);

TI=0;

}



/*发送一个字符串函数*/

void sendString(unsigned char *s)

{

while(*s!='')

{

sendChar(*s);

s++;

}

}


/*串口初始化函数*/

void initUart()

{

/*串口中断定时器初始化*/

TMOD=0x20; //定时器1工作在方式2  

TH1=0xfd; //波特率为9600,精振为11.0592MHz

TL1=0xfd;

REN=1; //启动串行口接收数据

SM0=0; //串口工作在方式1

SM1=1; //串行口工作方式选择

EA=1; //打开总中断

ES=0; //关中断

TR1=1; //打开定时器中断


}


dht11.c

#include

#include "dht11.h"

#include "delay.h"

#include "esp8266.h"

#include "lcd1602.h"

#include


unsigned char DHTDATA[5] = {''}; //存放40位 数据

unsigned char code array[] = {"humi:"};  //LCD1602显示 humi: 字符

unsigned char code array1[] = {"temp:"}; //LCD1602显示 temp: 字符



/*DHT11接收数据函数*/

unsigned char DHT_receive_data()

{

unsigned char i;

unsigned char dat=0;  //0000 0000


for(i=0;i<8;i++)

{

while(!DATA); //等待DHT 50us低电平信号过去

delay30us(); //延时大概30us 如何还是高电平 则为1


dat<<=1; //左移一位 因为数据是从高位开始传

if(DATA == 1)

{

dat|=0x01;

}

/* else

{

dat|=0x00;

}  

*/

while(DATA); //等待DHT 拉低 准备下一位开始


}

return dat;

}


/*DHT11读取函数*/

void DHT_receive()

{

unsigned char R_H,R_L,T_H,T_L,CHECK;

//主机发送信号


DATA = 1;

delay30us();

DATA = 0;

delay20ms(); //延时大于18ms

DATA=1;

delay30us(); //延时30us  20-40us 均可


DATA=1;

if(DATA == 0)   //判断DHT是否进入响应

{


while(!DATA);    //等待从机80us低电平响应信号过去

while(DATA); //等待从机80us高电平信号过去


    /*获取温湿度数据*/

R_H = DHT_receive_data(); //湿度高位

R_L = DHT_receive_data();

T_H = DHT_receive_data();

T_L = DHT_receive_data();


CHECK = DHT_receive_data();


DATA=0;

delay55us();

DATA=1;

/*校验*/

if((R_H + R_L + T_H + T_L) == CHECK)

{

DHTDATA[0] = R_H;

DHTDATA[1] = R_L;

DHTDATA[2] = T_H;

DHTDATA[3] = T_L;


DHTDATA[4] = CHECK;

}

}

}


/*显示DHT11数据函数*/

void DHT_LCD1602_display()

{

write_com(0x85);

write_data(DHTDATA[0]/10 + 0x30);

write_com(0x86);

write_data(DHTDATA[0]%10 + 0x30);

write_com(0x87);

write_data('.');


write_com(0x88);

write_data(DHTDATA[1]/10 + 0x30);

write_com(0x89);

write_data('%');


write_com(0xC5);

write_data(DHTDATA[2]/10 + 0x30);

write_com(0xC6);

write_data(DHTDATA[2]%10 + 0x30);

write_com(0xc7);

write_data('.');


write_com(0xC8);

write_data(DHTDATA[3]/10 + 0x30);

write_com(0xC9);

write_data(0xDF); //度


write_com(0xca);

write_data('C');

}


/*显示字符temp: humi:函数*/

void display_str()

{

unsigned char i;

write_com(0x80);  //第一行第一个开始显示 humi:

for(i=0;i<5;i++)

{

write_data(array[i]);

}


write_com(0xc0);  //第二行第一个开始显示 temp:

for(i=0;i<5;i++)

{

write_data(array1[i]);

}

}


项目展示

在这里插入图片描述

总结

单单的温湿度上传oneNET平台APP显示没啥问题,加了一个按键则速度慢了许多,之前就因为加一个按键功能用了挺长时间才做出来了,由于GET方式返回字节太多,需要找到需要的字节,现在按键是能做出来了但是响应速度有点慢,还是挺菜,但是还能用,就是响应速度慢了,还得继续加油,总的来说还行吧哈哈哈自我鼓励一下。

关键字:51单片机  DHT11  温湿度模块  ESP8266模块  oneNET  LCD1602显示 引用地址:基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示

上一篇:基于51单片机+DS1302万年历+LCD1602显示+按键播报时间+温控风扇+按键控灯
下一篇:基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶

推荐阅读最新更新时间:2024-11-17 04:28

51单片机 LED流水灯
使用位定义实现LED流水灯 #include reg52.h #define time 20000 sbit LED1=P2^0; sbit LED2=P2^1; sbit LED3=P2^2; sbit LED4=P2^3; sbit LED5=P2^4; sbit LED6=P2^5; sbit LED7=P2^6; sbit LED8=P2^7; void delay(unsigned int i) { while(i--); } void main() { while(1) { LED8=1; LED1=0; delay(time); LED1=1;
[单片机]
基于51单片机的八路抢答器设计
一.硬件方案 本设计 利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。 主要由51单片机+最小系统+数码管+蜂鸣器+按键模块;如图: 二.设计功能 (1)采用4位数码管设计;下排按键一一对应八位选手。 (2)竖排三个按键,从上到下依次为:开始、暂停、复位。 (3)操作流程:上电后数码管显示“--
[单片机]
基于<font color='red'>51单片机</font>的八路抢答器设计
51单片机内核的中断及中断向量基础知识
51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为: void INT0()interrupt 0 using 1 { …… } 在这里特别做上笔记:其中前面的void INT0() 只是代表一个普通没有形参的函数而已,函数名写成什么都是可以的,这个到不重要。那么后面的就一个一个词的扣把:(2-1-i-c-中国-电子网,防抓取) 其中 interrupt n 组成一组,n用来指明中断号,在函数后使用了interrupt关键字后,就会自动的生成中断向量,51内核中断号如下图,这是
[单片机]
<font color='red'>51单片机</font>内核的中断及中断向量基础知识
51单片机串口、定时器、中断
1、串口编程思路: 2、中断
[单片机]
<font color='red'>51单片机</font>串口、定时器、中断
51单片机DS18B20温度传感四位数码管显示报警
仿真原理图如下 全部资料分享,可设置温度报警的上下限,5641四位共阳数码管显示温度,自己曾经做的设计,实测可行,提供给有需要的人 单片机源程序如下: #include AT89X52.h #define uint unsigned int #define uchar unsigned char //宏定义 #define SET P3_1 //定义调整键 #define DEC P3_2 //定义减少键 #define ADD P3_3 //定义增加键 #define BEEP P3_6 //定义蜂
[单片机]
<font color='red'>51单片机</font>DS18B20温度传感四位数码管<font color='red'>显示</font>报警
51单片机入门 - 点阵显示程序设计实验
一、LED点阵发光原理 8*8单色单片机结构图如下: https://blog.csdn.net/weixin_42625444/article/details/90897605 从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯。只要使得那个灯所在的行输出高电平,所在列输出低电平就好。 二、点阵扫描实验 /*********************************************** 实验名称: 点阵扫描 实验说明: 扫描每个LED灯,检查点阵是否完好 实验时间: ***********************************************/ #inc
[单片机]
51单片机ADC0809电压表(12864显示,程序 + 仿真)
51单片机ADC0809电压表(12864显示,程序 + 仿真)并口;0~5V先上图正常工作图 上图:最大电压值 上图渐变电压值(最大到最小) 这是仿真图,可以进行仿真 #include reg51.h #include LCD12864.h sbit OE=P3^6; sbit EOC=P3^7; sbit CLOCK=P3^0; sbit ST=P3^3; void Lcd12864_Display(); unsigned char dat = 0.000V ; unsigned int tmp; unsigned char adc; void main() { EA=1; ET0=1; T
[单片机]
<font color='red'>51单片机</font>ADC0809电压表(12864<font color='red'>显示</font>,程序 + 仿真)
51单片机的外部中断触发方式
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved