完整源码下载地址:https://download.csdn.net/download/tongxin082/21440602

温湿度检测设计。基于51单片机、ESP8266WiFi模块、温湿度DHT11传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。

1、系统方案

DHT11温湿度传感器采集数据传送给单片机,单片机将数据处理之后通过ESP8266WiFi模块将数据发送给手机App。WiFi模块有两个作用:一是串口转WiFi,单片机通过串口将数据发送给Wifi模块,对于单片机编程而言,与Wifi模块通信就相当于与串口通信,不必知道WiFi协议;二是WiFi模块当做WiFi 热点AP,手机搜索8266建立的WiFi名称就能与其连接。显然这种方式只是局域网通信,不能进行远程连接,远程连接需要服务器端的支持,现在常采用的方法是通过阿里云、机智云等,远程连接比较复杂,我们以后再研究。

2、硬件设计

整个设计电路图如下所示:

ESP8266WiFi模块我们采用的是ESP-01S模组,安信可公司出品的,注意ESP-01S的电源是3.3V,而单片机电源是5V,所以需要一个5V转3.3V的模块,我们选用的是LM1117T-3.3V这个器件, LM1117这个器件管脚一定不要接错,否则会发热非常严重然后烧毁。我第一次焊接的时候把LM1117管脚焊错了,上电后用手触碰了一下差点把手烫伤,赶紧把电源拔掉。LM1117的接线如下所示:

ESP8266的接线如下图所示:

RX:模块串口通信的接收引脚,接到单片机的TX引脚。
GND:接地
TX:模块的发射端,接单片机的RX接口。
CH_PD / EN:接3.3v高电平。
VCC:接3.3V的高电平。

DHT11温湿度传感器负责采集环境中的温湿度数据,在单片机软件设计部分会详细的介绍该传感器的使用步骤。

引脚说明:
VDD 供电3.3~5.5V DC
DATA 串行数据,单总线
NC 空脚
GND 接地,电源负极

3.单片机软件设计

单片机程序主要是两个点,一是读取DHT11传感器的温湿度数据,二是串口通信。DHT11的官方文档写的很规范,有关于读取数据的详细步骤,文档更新也比较及时,最新的更新日期是2017年3月31号,官网的下载地址:http://www.aosong.com/products-21.html

DHT11采用单总线通信,单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。

  • 传送数据位定义

DATA 管脚用于DHT11与单片机之间的通讯和同步,采用单总线数据格式,一次传送40 位数据,高位先出。
数据格式:
8bit 湿度整数数据+ 8bit 湿度小数数据+ 8bit 温度整数数据+ 8bit 温度小数数据+ 8bit 校验位。
注:其中湿度小数部分为0。

  • 校验位数据定义

8bit 湿度整数数据 +  8bit 湿度小数数据 +  8bit 温度整数数据 +  8bit 温度小数数据 = 8bit 校验位
如果以上等式成立,则本次传感器采集的数据有效,否则无效。

先看采集数据有效的示例,接收到的40 位数据为:
0011 0101     0000 0000     0001 1000     0000 0100      0101 0001
湿度高8 位     湿度低8 位     温度高8 位     温度低8 位    校验位
计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,接收数据正确。
湿度:0011 0101(整数)=35H=53%RH 0000 0000(小数)=00H=0.0%RH =>53%RH + 0.0%RH = 53.0%RH
温度:0001 1000(整数)=18H=24℃ 0000 0100(小数)=04H=0.4℃ =>24℃ + 0.4℃ = 24.4℃

采集数据无效的示例,接收到的40 位数据为:
0011 0101     0000 0000     0001 1000    0000 0100     0100 1001
湿度高8 位    湿度低8 位     温度高8 位    温度低8 位    校验位
计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 不等于0100 1001,本次接收的数据不正确,放弃,重新接收数据。

通过以上两个示例可以清楚DHT11数据格式以及数据如何去校验有效性。

  • 数据时序图

用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出40bit 的数据,并触发一次信采集。信号发送如图所示。这里的主机是指单片机,从机是指DHT11传感器。

下面这个图表罗列了时序图相关的参考时间,在读取数据的详细步骤中会用到这些数值。

根据时序图和表中的参考时间,我们可以得出读取传感器数据的步骤。

step1:单片机输出低电平保持20ms

step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号

step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。

step4:通过while语句等待83us的低电平响应时间结束

step5:通过while语句等待87us的高电平响应时间结束

step6:计算温湿度数据

step7:单片机输出高电平结束一次数据采集的读取

step8:校验数据

在时序图中可以看到,数据读取是每次一位进行的,数据0位和数据1位的低电平时间是相同的,即54us。数据0位的高电平时间是24us,而数据1为的高电平时间是71us,通过高电平时间的差异我们就可以判断出是数据0还是数据1。所以单独写了一个函数用来计算数据0位和1位,由于温湿度的整数和小数部分分别是由8位表示的,我们定义该函数得到8位数据之后给出返回值。步骤6对应的函数computeData() 用来完成上述工作。我们对步骤6进行详细的描述:

step 6.1:等待54us低电平结束

step 6.2:延时30us判断高电平是否结束,因为数据0位的电平最大时长是27us,如果超过27us之后高电平结束,则为数据0位,否则为数据1位。

step 6.3:通过while语句等待高电平结束

step 6.4:通过移位和或与的方式保存一个数据位

step 6.5:循环6.1到6.4步骤8次,得到一个字节的数据

//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== temperature_H------
//----温度低8位== temperature_L------
//----湿度高8位== humidity_H-----
//----湿度低8位== humidity_L-----
//----校验 8位 == checkdata-----
//--------------------------------
void readData()
{U8  humidity_H_temp,humidity_L_temp,temperature_H_temp,temperature_L_temp,checkdata_temp;//step1:单片机输出低电平保持20msP2_0=0;delayms(20);//step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号P2_0=1;delay13us();//step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。if(P2_0==0){//step4:通过while语句等待83us的低电平响应时间结束while(P2_0==0);    //step5:通过while语句等待87us的高电平响应时间结束            while(P2_0==1);               //step6:计算温湿度数据humidity_H_temp = computeData();humidity_L_temp = computeData();temperature_H_temp = computeData();temperature_L_temp = computeData();checkdata_temp = computeData();//step7:单片机输出高电平结束一次数据采集的读取P2_0 = 1;        //step8:校验数据if(checkdata_temp == humidity_H_temp + humidity_L_temp + temperature_H_temp + temperature_L_temp){humidity_H = humidity_H_temp;humidity_L = humidity_L_temp;temperature_H = temperature_H_temp;temperature_L = temperature_L_temp;checkdata = checkdata_temp;}}}/**
*根据时序计算温湿度值
*/
U8 computeData()
{U8 i,U8comdata;for(i=0; i<8; i++){//step 6.1:等待54us低电平结束while(P2_0==0);//step 6.2:延时30us判断高电平是否结束    Delay_10us();                   Delay_10us();Delay_10us();U8temp=0;if(P2_0==1)                       {                                           U8temp=1;}//step 6.3:通过while语句等待高电平结束while(P2_0==1);//step 6.4:通过移位和或与的方式保存一个数据位           U8comdata<<=1;U8comdata|=U8temp;}return U8comdata;
}

温湿度数据读取完毕,接下来就是通过串口发送出去,串口发送数据的代码相对简单了,我们在主函数中对串口通信进行初始化,然后在一个while语句中每隔2s读取数据然后发送。

//----------------------------------------------
//main()功能描述:  STC89C52RC  11.0592MHz   串口发送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{U8  i;TMOD=0x20;      //定时器1工作在方式2TH1 = 0xfd;        //波特率9600TL1 = 0xfd;SM0=0;                //串口工作在方式1SM1=1;EA = 1;               //开总中断REN = 1;         //使能串口TR1 = 1;         //定时器1开始计时delayms(1000);sendString("AT+CWMODE=2\r\n");      //ap模式delayms(1000);    sendString("AT+CIPMUX=1\r\n");      //允许多连接delayms(1000);   sendString("AT+CIPSERVER=1\r\n");   //建立TCP Serverdelayms(1000);ES = 1;                //开串口中断while(1){//调用温湿度读取子程序readData();str[0]=humidity_H;str[1]=humidity_L;str[2]=temperature_H;str[3]=temperature_L;str[4]=checkdata;//发送到串口delayms(2);                   //发送温度数据sendString( "AT+CIPSTART=1,\"TCP\",\"192.168.4.2\",5000\r\n");delayms(2);sendString("AT+CIPSEND=1,5\r\n");delayms(2);for(i=0; i<5; i++){sendOneChar(str[i]);}//读取模块数据周期不易小于 2Sdelayms(2000);}
}

至此,单片机端的主要代码就讲解完了,可以看到核心代码是如何读取DHT11的数据。

4.手机APP软件设计

APP是用Android Studio(AS)开发的,不建议初学者学习Eclipse结合ADT(Android Eclipse Tools)插件的方式开发Android APP,这种方式已经过时并且以后会被淘汰,Google在2016年底已经停止了对ADT的更新,我之前所在的公司已经将Eclispe的代码全部迁移到AS平台了,推荐使用Google自家的AS集成开发环境。AS有很多优点,但是在使用时也有问题,AS借助gradle进行项目构建,至于为什么Google利用gradle进行Android app项目构建,读者可以自行上网搜索。gradle插件版本要和AS版本相对应,不同的开发者的gradle版本可能不同,所以当你拿到另外一个开发者的代码在自己的AS运行时时有可能会构建失败。这个现象对于国外开发者而言不是一个问题,AS可以自动去下载所需要的gradle插件版本,但是在国内,由于众所周知的原因,如果不会科学上网那么AS直接尝试下载gradle插件时会失败,会令很多初学者不知所措。在以后有时间我会单独写一篇blog来讲解如何去解决这个问题。最近听到Google要重返中国市场,如果能回归成功,对于国内的很多开发者和学术研究者而言是个好消息。

言归正传,本设计APP的代码主要分成两个部分,一是WiFi数据的接收,二是图表显示。

在OnCreate()方法中进行控件的初始化,并开启一个温度数据接收线程来接收数据。

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//实例化控件mTemperatureTv = findViewById(R.id.tv_temperature);mHumidityTv = findViewById(R.id.tv_humidity);mTemperatureAlert = findViewById(R.id.tv_temperature_alert);mHumidityAlert = findViewById(R.id.tv_humidity_alert);mTemperatureRangeTv = findViewById(R.id.tv_temperature_range);mHumidityRangeTv = findViewById(R.id.tv_humidity_range);mTemperatureRangeTv.setText("(" + mTempLow + " - " + mTempHigh + "℃)");mHumidityRangeTv.setText("(" + mHumidityLow + " - " + mHumidityHigh + "%)");mLineChart = findViewById(R.id.chart);//初始化图表属性initChart();//开启温度显示线程new ReceiveDataThread().start();}

单独开辟一个线程用来循环读取WiFi模块传输过来的数据,对于App而言单片机通过Wifi模块传输的数据相当与网络数据,用网络编程相关的就可以,线程的相关定义如下所示:

/*** 温湿度数据接收线程*/private class ReceiveDataThread extends Thread {private DataInputStream in;private byte[] receive;@Overridepublic void run() {try {//在手机端建立一个ServerSocket,负责接收ESP8266发送的数据,端口为5000serverSocket = new ServerSocket(5000);client = serverSocket.accept();while (true) {//循环读取数据in = new DataInputStream(client.getInputStream());receive = new byte[5];in.read(receive);String data = new String(receive);//刷新UIdoUIRrefresh(data);}} catch (IOException e) {e.printStackTrace();}}}

完整源码下载地址:​​​​​​​https://download.csdn.net/download/tongxin082/21440602

51单片机DHT11温湿度ESP8266WiFi手机APP显示设计相关推荐

  1. 51单片机DHT11温湿度检测手机蓝牙APP显示设计

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440739 今天给大家介绍的是一个温湿度检测设计,基于51单片机.蓝牙模块.温湿度传 ...

  2. 4. 51 测量空气的温度和湿度(51单片机 + DHT11温湿度 + LCD1602显示)

    51单片机 + DHT11温湿度 + LCD1602显示 DHT11温湿度相关介绍 DHT11产品概述 测量范围 接口说明 电源引脚 串行接口 (单线双向) 相关时序及代码 用代码实现上述时序图(起始 ...

  3. 51单片机 DHT11温湿度传感器LCD显示+串口打印显示

    第一部分:DHT11详解: DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃. **一.电路连接分析 1.引脚图** ...

  4. 基于51单片机+DHT11温湿度+LCD1602显示

    DHT温湿度1602显示 DHT11温湿度相关介绍 DHT11产品概述 1.测量范围 2.接口说明 3.电源引脚 4.串行接口 (单线双向) 5.相关时序及代码 6. DHT11引脚说明 程序代码 m ...

  5. 51单片机 DHT11温湿度传感器 MQ2传感器

    目录 前言 程序思路 DHT11 一.DHT11基础储备 二.接口说明 三.协议及数据格式 ​编辑 四.DHT11代码 MQ-2烟雾传感器 一.MQ-2烟雾传感器介绍 二.工作原理 三.时序配置 四. ...

  6. 实物设计|基于51单片机的温湿度检测报警系统

    目录 具体实现功能: 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能: 由STC89 ...

  7. 51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真

    51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真 采用的接线方式是IIC接口,在Proteus里面仿真太慢了,不知道是电脑古老问题还是怎么,看图像就知道了,有多卡,感觉电脑运 ...

  8. 51单片机 DHT11+LCD1602温湿度显示 + Proteus仿真

    51单片机 DHT11+LCD1602温湿度显示+ Proteus仿真 主程序代码 #include <reg52.h> #include <LCD1602.h> #inclu ...

  9. 【Proteus仿真】51单片机+SHT11温湿度传感器+LCD1602显示

    [Proteus仿真]51单片机+SHT11温湿度传感器+LCD1602显示 Proteus仿真 主程序代码 /*-------------------------------SHT11湿度测量 -- ...

  10. 基于51单片机的智能停车场管理车位引导系统红外检测无线蓝牙/WiFi手机APP控制设计

    本系统由STC89C52单片机.(无线蓝牙/WIFI模块-可选).红外对管传感器.LCD1602液晶显示.LED指示灯及电源组成. 通过红外对管模块实时检测车位是否占用,车位分为1车位.2车位.3车位 ...

最新文章

  1. 如何查询高考成绩2021年的成绩排位,2021年四川高考个人排名怎么查询,四川高考成绩排名查询方法...
  2. Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
  3. 如何求解问题--数据结构与算法入门
  4. std::function和std::bind
  5. iPhone8 和 X 买哪个?听我的
  6. python 生成器对象_Python 生成器, 迭代器, 可迭代对象的区别
  7. 【docker】kubernetes集群一键部署包
  8. 图像处理——alpha融合
  9. 火山PC表格及Excel的导入导出案例
  10. 2016 博客导读总结 个人感悟
  11. jav常用类-时间处理相关类
  12. mysql先过滤后分组_MySQL分组过滤
  13. 食品加工企业自营商城小程序开发,帮助企业增加销售渠道,提高销量
  14. 移动宽带frp内网穿透访问家中网络(by quqi99)
  15. windows10系统装cad2007提示缺少NET组件
  16. [QT_040]Qt学习之通用对话框:QColorDialog、QFontDialog、QInputDialog
  17. 如何选择直流微电机1
  18. 梅西百货将VR技术更融入生活 加入App功能中提升用户体验
  19. Windows XP 修复DirectPlay8 错误
  20. IOS证书制作,最简单的在线制作流程

热门文章

  1. 《数字孪生》(Yanlz+VR元宇宙+Unity+SteamVR+云技术+5G+AI+虚拟现实+数字映射+仿真+物理模型+传感器更新+运动历史+多学科+多物理量+多尺度+多概率+立钻哥哥++==)
  2. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析...
  3. php readystate,ajax+php打造进度条 readyState各状态的简单示例
  4. 统信UOS_arm64开发环境配置
  5. iOS TouchID指纹验证
  6. CFD-Post批处理(在一系列算例同一位置截取速度云图)
  7. V2X协议栈介绍及说明(含框图)
  8. 抗光幕布哪个牌子好?
  9. FCPX插件:PremiumVFX Ink Title(墨水标题字幕条动画插件)
  10. github提交时报错:remote: Support for password authentication was removed on August 13, 2021问题解决方案