基于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-09 11:17

51单片机--外部中断1控制led亮灭
#include reg51.h typedef unsigned int u16; typedef unsigned char u8; sbit k4=P3^3;//P33是外部中断1的引脚,按键的一个引脚和中断引脚相连 sbit led1=P2^1; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us ***************************************************
[单片机]
absacc.h keil软件里怎么找不到 ,如何找?
把下面的内容保存成absacc.h即可:原因是高版本的KEIL进行了优化,将以前很多库文件去除了,需要用户手动添加 #ifndef __ABSACC_H__ #define __ABSACC_H__ #define CBYTE ((unsigned char volatile code *) 0) #define DBYTE ((unsigned char volatile data *) 0) #define PBYTE ((unsigned char volatile pdata *) 0) #define XBYTE ((unsigned char volatile xdata *) 0) #define CWORD ((u
[单片机]
51单片机学习笔记(一):LED
第一次接触51单片机,就直接按照附赠的学习手册自己学一学,做个笔记。 一、点亮LED LED即发光二极管,具有单向导电性,通过一定电流时就能发光。单片机开发板上的LED采用共阳接法,即所有LED阳极管脚接电源VCC,阴极管脚通过470欧限流电阻接到P2口上。使LED发光的方法是让对应阴极管脚变成低电平,熄灭则为高电平。 用51单片机控制LED的方法就是让单片机设定管脚在P2口上输出低电平。 在main.c内先包含51单片机头文件,使用sbit关键字定义P2.0管脚叫做LED1,再让LED1=0,最后进入while死循环。 #include reg52.h sbit LED1=P2^0;void main(){ LED
[单片机]
51单片机的ISP下载电路设计
51单片机可以通过ISP下载方式烧写程序,常用的工具为USB/TTL,常用的芯片有MAX232、CH340G等。下面介绍以CH340G芯片设计的ISP下载电路。 1.51单片机程序下载原理 51单片机程序烧写接口为RXD和TXD,即UART口,这两个接口是通信口,配合不同的芯片可以实现不同的通讯方式。如果连接MAX232即可实现232通信,如果连接MAX3082即可实现RS485通讯。下载程序正是通过这两个接口来实现的。下载方式如下图所示。单片机的RXD和TXD要与USB/TTL设备的TXD和RXD交叉连接才能实现下载。 2.CH340G芯片介绍 CH340是一个USB总线的转接芯片,实现USB转串口、USB转IrDA红外
[单片机]
<font color='red'>51单片机</font>的ISP下载电路设计
51单片机——数码管静态显示
1、由原理图找到对应控制端口 这次是想要在数码管上显示出数值。同样的,先在开发板原理图中找到数码管对应的控制端口 发现要让数码管起作用的话,LEDS0要为低电平,则在74LS138译码器中,输入A2A1A0的值分别为000。而P0口可以控制数码管的显示。 2、程序部分 需要用到的对应控制端口找完,开始写程序。先写个简单一点数码管静态显示。 程序如下: #include reg52.h sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit ADDR3=P1^3; sbit ENLED=P1^4; void delay(
[单片机]
<font color='red'>51单片机</font>——数码管静态<font color='red'>显示</font>
8051单片机-校验和
【例子】通过校验和的方式实现数据传输与控制,例如控制LED灯、蜂鸣器、发送数据到上位机。 由于是数据传输与控制,需要定制一个结构体、共用体方便数据识别,同时增强可读性。从数据帧格式定义中可以定义为“PKT_SUM_EX”类型。 识别数据请求什么操作可以通过以下手段来识别:识别数据头部1、数据头部2,操作码。当完全接收数据完毕后通过校验该数据得出的校验值与该数据的尾部的校验值是否匹配。 若匹配,则根据操作码的请求进行操作;若不匹配则丢弃当前数据帧,等待下一个数据帧的到来。 结构体定义: /*使用结构体对数据包进行封装 *方便操作数据 */ typedef struct _PKT_SUM { U
[单片机]
8051单片机-模拟串口
传统的8051系列单片机一般都配备一个串口,而STC89C52RC增强型单片机也不例外,只有一个串口可供使用,这样就出问题了,假如当前单片机系统要求二个串口或多个串口进行同时通信,8051系列单片机只有一个串口可供通信就显得十分尴尬,但是在实际的应用中,有两种方法可以选择。 方法1:使用能够支持多串口通信的单片机,不过通过更换其他单片机来代替8051系列单片机,这样就会直接导致成本的增加,优点就是编程简单,而且通信稳定可靠。 方法2:在IO资源比较充足的情况下,可以通过IO来模拟串口的通信,虽然这样会增加编程的难度,模拟串口的波特率会比真正的串口通信低一个层次,但是唯一优点就是成本上得到控制,而且通过不同的IO组合可以实现
[单片机]
80<font color='red'>51单片机</font>-模拟串口
基于AT89C51单片机的恒温控制系统设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示+DS18B20测温+蜂鸣器报警+按键+风扇降温+小灯。 系统内使用AT89C51单片机作为主控,使用LCD1602显示采集到的温度数据和温度阈值,通过按键可以设定阈值,当检测到环境温度大于设定阈值时蜂鸣器就会进行报警,并且会通过风扇进行降温,当检测到环境温度低于设定阈值时加热小灯就会亮起。 二.仿真概述 1.LCD1602显示检测到的温度和温度阈值。 2.通过DS18B20温度传感器检测环境温度。 3.当温度低于阈值则通过加热小灯进行加热。 4.当温度高于阈值则通过蜂鸣器报警,并利用风扇进行降温。 三.程序设计 使用Keil 51进行
[单片机]
基于AT89C<font color='red'>51单片机</font>的恒温控制系统设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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