• 售前

  • 售后

热门帖子
入门百科

ESP32驱动DHT11检测温湿度(ESP IDF情况)

[复制链接]
付佳琦 显示全部楼层 发表于 2022-1-8 17:28:59 |阅读模式 打印 上一主题 下一主题


DHT11驱动原理

1.1接线:我利用的是ESP32 Wrover,DHT11接线也不复杂,统共三根线,供电电压为3.3V-5V,DATA端就任意接一个IO口即可。

官方利用说明上写着data端上拉5K电阻,而我没有上拉,也能实现数据读取。下面先容该模块的时序逻辑。
1.2时序图

        用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主 机开始信号竣事后,DHT11发送相应信号,送出40bit的数据,并触发一次信号收罗。这个过程紧张分为三大步,分别是①单片机开始信号的发送,②检测DHT11的相应信号,③读取温湿度数据。
        那要怎样发送开始信号才能让DHT11模块知道该把数据送到单片机呢?紧张分下面几步即可完成开始信号的发送:
(1)将data毗连的IO口设置为拉低输出状态,这个过程要大于18ms,那么直接接纳延时函数延时个二十多秒即可。
(2)在完成第一步之后紧接着把IO口配置为高电平输出,这一步不需要延时处置惩罚
(3)完成上面两步后将IO口配置为输入状态,仅仅只是输入,电平状态可以不管,此过程一连20us-40us,我选择延时30us。示例代码如下:                                                                                  
  1. <code>    OutputLow();//低电平输出
  2.     Delay_ms(25);  //>18MS
  3.     OutputHigh();//高电平输出
  4.     InputInitial(); //输入
  5.     ets_delay_us(30);
复制代码

         下面先容如何检测DHT11的相应信号,在我们向DHT11发送开始信号后,DHT11就开始回应一个相应信号,这个信号由80us的低电平和80us的高电平构成,相应信号竣事就开始发送温湿度数据。那么我们如何让单片机知道什么时间去读数据呢?

 
        (1)那我们就去检测IO口的电平值,相应信号不是先低后高吗,我就先判断DHT11是否拉低了IO口电平,假如我读到的IO口电平为高,那说明DHT11根本就没相应,要么传感器坏了,要么开始信号没发送乐成。
        (2)在上一步检测到IO口的低电平之后,我们需要等待相应信号的低电平竣事,那么直接用一个while循环,循环中我们不停检测端口电平,一旦端口电平变高就跳出循环。
        (3)低电平竣事之后迎来高电平信号,用同样的方法等待80us的高电平已往,高电平竣事再等待个20—40us即可检测温湿度数据
  1. <code>if(!getData())//表示传感器拉低总线
  2.     {
  3.         ucharFLAG=2;
  4.         //等待低电平结束
  5.         while((!getData())&&ucharFLAG++)
  6.           ets_delay_us(10);
  7.         //等待高电平结束
  8.         while((getData())&&ucharFLAG++)
  9.          ets_delay_us(40);
  10.     }
  11.     else //没用成功读取,返回0
  12.     {
  13.             Humi=0,
  14.             Temp=0;
  15.         printf("ReadError");
  16.     }
复制代码
        总算来到第三步,开始读数据了,由于DHT11会发送40位的数据。
数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和
这40位的数据每一位的0/1状态又是怎么确定的呢?下图就是数字0和1的信号表示方法

         由于温湿度数据由四个8bit的数据构成,那我们就读每8位读一次,统共读5次,末了一次获取的是校验和。从上图我们可以看出不管是0信号还是1信号都有低电平+高电平表示,而且低电平一连时间类似,都是50us,那么就要求我们从高电平一连的时间来判断0/1信号。
        具体做法是(1)利用for循环,循环8次,每次读1位数据,每一位数据都由低电平开始,高电平竣事。以是我们要等,等这一位数据的低电平部门已往,还是用while循环嵌套电平检测去做,检测到高电平就跳出循环。
        (2)当检测到这一位数据的高电平后,我们要看这段高电平毕竟会一连多长时间,0信号的高电平一连26-28us,1信号则一连70us。以是在上一步检测到高电平之后我们不妨等一等,等个30us看看高电平是不是还是存在,若还是高电平,那这一位信号就是1信号,若已经变低了,就是0信号,将这个1或0赋值给一个变量。
        (3)上面读到了一位数据,我们要读8次才行,那要怎样存放变量呢,答案是左移一位再或上你刚读到的这一位数据,这样举行8次就能把一个温湿度部门读完。
[code]static void COM(void)    // 温湿写入{    uchar i=0;    for(i=0;i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作