使用ESP8266_NON-OS_SDK开发——读取DHT11温湿度传感器
本文的目的在于实现在以ESP8266_NON-OS_SDK为基础的ESP8266开发中快速读取DHT11温湿度传感器的功能:
原理说明
DHT11 传感器采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口(单片机 IO 口) 连至该数据线,以允许设备在不发送数据时能够释放总线(由上拉电阻控制,把总线上拉成高电平),而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平(模块中已经集成 4.7k 上拉电阻)。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。
也就是说我们需要控制IO的高低电平来与DHT11进行数据交互
程序逻辑大致如下::
-
主机发送起始信号并检测 DHT11 的响应信号。 主机会发送一个时间 T(18ms < T < 30ms)的低电平作为起始信号(拉低后要释放总线),DHT11 检测到起始信号后会把信号总线拉低83us作为响应信号,然后拉高 87us 通知主机准备接收数据。
-
主机接收 DHT11 发送的数据(高位先出)。 在 DHT11 发送 87us 高电平的通知信号后紧接着发送40Bit 数据。 数据 0 由 54us 的低电平与 23~27us 的高电平构成;数据 1 由 54us 的低电平与 68~74us构成
-
主机读取 DHT11 发送的 40Bit 数据并检测 DHT11 的结束信号。 DHT11 发送完 40Bit 数据后会继续输出54us的低电平作为结束信号,然后转为输入状态。 这时主机在检测到 DHT11 的结束电平结束后应该配置为输出模式并输出高电平。
代码下载
下载地址(如果有帮到你顺手帮我点个星星谢谢)
使用方法:
- 建立工程;
- 将dht11.h文件复制到 工程目录\app\include\driver
- 将dht11.c文件复制到 工程目录\app\driver
- 在项目文件中应用dht11.h
主要函数:
DHT11_Read_Data
函数原型:
ICACHE_FLASH_ATTR uchar DHT11_Read_Data(DHT11_Data *Data,int PIN_NAME,int PIN);
简介:读取DHT11的数据,改变传入指针指向的Data结构体中的Humi与Temp
参数1 Data: 储存数据的结构体
参数2 PIN_NAME: 引脚地址 如:PERIPHS_IO_MUX_GPIO5_U
参数3 PIN: 引脚号
返回值: uchar(unsigned char)返回读取是否成功
0:成功
1:失败