stm32用HAL库驱动DHT22使用心得

这篇是本人自己总结学习DHT22的笔记,源码在最后。关于DHT22的工作原理有很多博主讲得很好了,本篇主要讲解DHT22的驱动代码(都在代码注释上)。DHT22是单总线通信的,驱动它需三根线:电源线、信号线(接到任意GPIO口就行)和地线,,如下图

查看源图像

 

 

具体的原理解释见该博主:温湿度模块DHT22详解一:基础篇_k1ang的博客-CSDN博客_dht22

以下的工作原理是从DHT22的使用说明中截取的时序图

数据格式: 40bit数据=16bit湿度数据+16bit温度数据+8bit校验和

例子: 接收40bit数据如下:

0000 0010 1000 1100 0000 0001 0101 1111 1110 1110

         湿度数据                     温度数据                校验和

湿度高8位+湿度低8位+温度高8位+温度低8位=的末8位=校验和

例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110

湿度=65.2%RH 温度=35.1℃

当温度低于0℃时温度数据的最高位置1。

例如:-10.1℃表示为1000 0000 0110 0101

用户主机(MCU)发送一次开始信号后,DHT22从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT22发送响应信号,送出40bit的数据,并触发一次信号采集。(注:主机DHT22读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,请连续读两次以获得实时的温湿度值)

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DHT11是一种数字温湿度传感器,可以通过STM32的GPIO口读取其数据。下面是使用HAL库获取DHT11数据的步骤: 1. 配置GPIO口为输出模式,并将输出电平置为高电平,等待至少18ms。 2. 将GPIO口置为输入模式,并等待DHT11的响应信号(低电平持续至少80us,高电平持续至少80us)。 3. 接收40位数据,每一位数据的持续时间为50us,通过判断数据持续时间的长短来判断数据位是0还是1。 以下是示例代码,供参考: ```c #include "stm32f1xx_hal.h" #define DHT11_PIN GPIO_PIN_0 #define DHT11_PORT GPIOA void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = DHT11_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); } void DHT11_ReadData(uint8_t *data) { uint8_t i, j, byteIndex = 0; uint8_t bits[5] = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = DHT11_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); HAL_Delay(18); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); HAL_Delay(40); GPIO_InitStruct.Mode = GPIO_MODE_INPUT; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct); if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) { while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) ; while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET) ; for (i = 0; i < 40; i++) { while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) ; j = 0; while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET) { j++; HAL_Delay(1); } if (j > 25) bits[byteIndex] |= (1 << (7 - i % 8)); if (i % 8 == 7) byteIndex++; } if ((uint8_t)(bits[0] + bits[1] + bits[2] + bits[3]) == bits[4]) { data[0] = bits[0]; data[1] = bits[2]; } } } ``` 在主函数中,可以使用以下代码读取DHT11数据: ```c uint8_t dht11_data[2] = {0}; DHT11_Init(); DHT11_ReadData(dht11_data); ``` 读取到的数据中,dht11_data[0]为湿度值,dht11_data[1]为温度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值