0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DHT11驱动的编写

9GxC_IoTMaker 来源:机智云开发者 作者:机智云开发者 2022-04-25 14:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

本项目主要通过使用STM32F103C8T6作为主控MCUESP8266作为数据透传模块,接入机智云AIoT云平台,通过在线智能产品,实现了远程联网、温湿度监测、APP控制等功能。

在上文中,主要介绍了“创建云端产品,烧录Gagent”,以便让设备能够联网,当然其中也备注了ESP8266烧写Gagent固件时的注意事项,说明定义数据点的作用。

在本文中,从原理开始讲解,阐述DHT11驱动的编写。

进入正文

1、DHT11 简要介绍

DHT11 器件采用简化的单总线通信,DATA 引脚用于微处理器与 DHT11 之间的通讯和同步,一次传送 40 位数据,高位先出。

833bcd1a-c44c-11ec-bce3-dac502259ad0.png

举例:

8357a026-c44c-11ec-bce3-dac502259ad0.png

2、时序分析(附代码)

用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,信号发送如图所示。

836d13ca-c44c-11ec-bce3-dac502259ad0.png

注意:主机(MCU)从 DHT11 读取的温湿度数据总是前一次的测量值。

总线空闲:

DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平,此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。

MCU 发出请求信号:

MCU I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后MCU I/O设置为输入状态。由于上拉电阻,MCU I/O 即 DHT11 的 DATA 数据线也随之变高,之后等待 DHT11 作出回答信号。

DHT11 发出应答信号:

当 DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80us的低电平作为应答信号,紧接着输出 80us 的高电平通知 MCU 准备接收数据,MCU I/O 此时处于输入状态,检测到 DHT11 回应信号后,等待 80us 的高电平后的数据接收。

838da5ea-c44c-11ec-bce3-dac502259ad0.png

MCU 接收 40 位数据

由 DHT11 的 DATA 引脚输出 40 位数据,MCU 根据 I/O 电平的变化来判断是 “0” 还是 “1” 。

位数据 “0” 的格式为:

50us 的低电平和 26-28us的高电平。

83c1a412-c44c-11ec-bce3-dac502259ad0.png

位数据 “1” 的格式为:

50us 的低电平加 70us 的高电平。

83df9896-c44c-11ec-bce3-dac502259ad0.png

DHT11 发出结束信号

DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50us 后转为输入状态,由于上拉电阻存在,变为高电平。

// 本驱动采用 HAL 库,us 级延时使用通用定时器实现,对 IO 引脚的状态的改变采用位操作以及直接寄存器操作

// 复位DHT11void DHT11_Rst(void){

                     
DHT11_IO_OUT();   

//设置为输出  DHT11_DQ_OUT = 0;   

//拉低  HAL_Delay_ms(20);   

//拉低至少18ms  DHT11_DQ_OUT = 1;   

//拉高   HAL_Delay_us(30);  

 //主机拉高20~40us}

//等待DHT11的回应//返回1:未检测到DHT11的存在//返回0:存在uint8_t DHT11_Check(void)      

{   

uint8_t retry = 0;  DHT11_IO_IN();      

//设置为输入   

while(DHT11_DQ_IN && retry < 100)  

//DHT11会拉低40~80us  

{    

retry++;   

 HAL_Delay_us(1);  

}   

if(retry >= 100)return 1;else    

retry = 0;

while(!DHT11_DQ_IN && retry < 100)  

//DHT11拉低后会再次拉高40~80us  

{    

retry++;    

HAL_Delay_us(1);  

}if(retry >= 100)return 1;      

return 0;}

//从DHT11读取一个位//返回值:1/0uint8_t DHT11_Read_Bit(void)        

{uint8_t retry = 0;while(DHT11_DQ_IN && retry < 100)//等待变为低电平  

{    

retry++;    

HAL_Delay_us(1);  

}  

retry = 0;while(!DHT11_DQ_IN && retry < 100)//等待变高电平  

{    

retry++;    

HAL_Delay_us(1);  

}  

delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;elsereturn 0;       

}


//从DHT11读取一个字节//返回值:读到的数据uint8_t DHT11_Read_Byte(void)    

{        

uint8_t i,dat;  dat = 0;for (i=0;i<8;i++)   

{      

dat <<= 1;       

dat |= DHT11_Read_Bit();  

}                

return dat;}


//从DHT11读取一次数据//temp:温度值(范围:0~50°)//humi:湿度值(范围:20%~90%)//返回值:0,正常;1,读取失败;2,校验和错误uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)    

{        

uint8_t buf[5];uint8_t i;  

DHT11_Rst();if(DHT11_Check() == 0)  

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

//读取40位数据    

{      

buf[i] = DHT11_Read_Byte();    }if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])    

{      

*humi = buf[0];        

*temp = buf[2];    

}elsereturn 2;  

// 校验和错误  

}elsereturn 1;return 0;      

}
//初始化DHT11的 IO口, 同时检测DHT11的存在//返回1:不存在//返回0:存在        

uint8_t DHT11_Init(void){  DHT11_GPIO_Init();


  DHT11_Rst();return DHT11_Check();}

3、使用串口观察数据

将 printf 函数重定向至与 PC 相连的串口上。由于重定向相关函数已经包含在机智云生成的代码中(gizwits_product.c),我们直接使用 printf 进行数据打印即可。

#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     

set to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ *//**  

* @brief  

Retargets the C library printf function to the USART.  

* @param  None  

* @retval None  

*/PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART1 and Loop until the end of transmission */  

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);


return ch;}

以下为相关测试代码:

state = DHT11_Read_Data(&temperature, &humidity);if(state == 2){printf("the checksum is error


");}else if(!state){printf("temp = %d , humi = %d


", temperature, humidity);}else{printf("DHT11 is not answer


");}


若采集到的数据没有问题,即可将机智云协议相关代码移植进工程中。

本文结束。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18605

    浏览量

    387043
  • 微处理器
    +关注

    关注

    11

    文章

    2416

    浏览量

    85344
  • DHT11
    +关注

    关注

    19

    文章

    277

    浏览量

    59350

原文标题:基于物联网的远程温湿度监测系统(2)编写 DHT11 驱动

文章出处:【微信号:IoTMaker,微信公众号:机智云开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【瑞萨RA6E2地奇星开发板试用】串口打印DHT11温湿度数据

    【瑞萨RA6E2地奇星开发板试用】串口打印DHT11温湿度数据 本文介绍了 RA6E2 地奇星开发板驱动 DHT11 传感器实现串口打印环境温湿度数据的项目设计。 项目介绍 RA6E2 地奇星是一款
    发表于 12-07 16:20

    【RA4E2开发板评测】OLED显示DHT11温度测评

    , BSP_IO_DIRECTION_INPUT); 编写DHT11读取程序如下: typedef struct { uint8_t humi_high8bit; uint8_t humi_low8bit; uint8_t
    发表于 09-21 21:28

    RA-Eco-RA6M4部分功能测评2

    初始化等基础配置,核心步骤如下: 1. 项目结构规划 在原有“串口+OLED”项目基础上,新增DHT11相关驱动文件,形成模块化结构,便于维护: DHT11_demo/ ├─ src/ │├─
    发表于 09-05 20:42

    【RA-Eco-RA6M4开发板评测】DHT11温湿度传感器获取+OLED 屏幕显示

    图形引擎。RA6T1 系列器件带有用于电机控制的增强型外 设,如高分辨率 PWM 定时器或高级模拟模块。 RA8 系列 – 更高性能、人机界面、物联网和边缘计算 【温湿度模块】 DHT11是一款有已
    发表于 08-26 00:10

    【RA-Eco-RA6M4开发板评测】uart+OLED+DHT11

    继上一篇调通串口和OLED后,这次我们开始加传感器,这次的传感器是温湿度传感器DHT11DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备
    发表于 07-27 17:21

    【RA4L1-SENSOR】DHT11测温湿度OLED显示

    为I2C接口,开漏输出 P107 设置为 DHT11 单总线接口 OLED 驱动代码如下: void OLED_SSD1306_Init(void) { u8 i
    发表于 06-12 11:02

    STM32项目分享:智能鞋柜

    01—项目简介1.功能详解STM32智能鞋柜功能如下:DHT11检测鞋柜温湿度,温度低于阈值开启加热,湿度高于阈值开启加热和通风;P
    的头像 发表于 05-27 18:04 701次阅读
    STM32项目分享:智能鞋柜

    用树莓派RP2350 DIY 桌面动态温湿度计

    桌面动态温湿度计本文介绍了DFrobotBeetleRP2350开发板结合DHT11模块、锂电池模块、随机眨眼动画,实现OLED显示的桌面动态温湿度计的项目设计。一、项目介绍本项目包括工作原理:ADC电压采集与电量转换工程调试:电量获取
    的头像 发表于 05-27 08:05 672次阅读
    用树莓派RP2350 DIY 桌面动态温湿度计

    【RA-Eco-RA4M2开发板评测】DHT11测温湿度OLED显示

    DHT11 单总线接口 OLED 驱动代码如下: void OLED_SSD1306_Init(void) { u8 i; OLED_SSD1306_IIC_Init(); for (i=0
    发表于 05-11 13:53

    急急急在线等

    求一张stm32物联网智能家居环境监测系统总电路图,含DHT11,BH1750,MQ-2烟雾传感器,OLED显示屏,声光报警器,ESP8266等
    发表于 04-28 23:20

    毕业设计实物章节补充!有偿!

    本人的毕业设计是STM32智能风扇系统,运用到的模块有DHT11、L298N和HC-05,我没有做实物,导致仿真以及实物测试章节没办法写,初稿就要交了,想找个大佬提供资料,有偿感谢。
    发表于 02-27 21:05

    迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数

    迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数
    的头像 发表于 01-20 14:43 1502次阅读
    迅为RK3568开发板SPI<b class='flag-5'>驱动</b>指南-mcp2515<b class='flag-5'>驱动</b><b class='flag-5'>编写</b>:读寄存器函数

    【正点原子STM32H7R3开发套件试用体验】DS18B20、DHT11温湿度采集

    【正点原子STM32H7R3开发套件试用体验】DS18B20、DHT11温湿度采集 本文主要分为两部分,分别介绍了使用正点原子STM32H7R3开发套件,通过 DS18B20、DHT11 传感器采集
    发表于 01-01 11:16

    《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器

    函数。因此,有关GPIO的API函数介绍,请读者回顾此前的第十章的内容。接下来,笔者将直接介绍DHT11驱动代码。30.3.3 DHT11驱动解析在IDF版20_
    发表于 12-26 09:26

    STM32项目分享:机智云智慧农业系统

    01—项目简介1.功能详解基于STM32的机智云智慧农业系统。功能如下:温湿度采集:使用DHT11温湿度传感器采集环境温湿度土壤湿度
    的头像 发表于 12-19 18:40 1901次阅读
    STM32项目分享:机智云智慧农业系统