dht11温湿度传感器HAL
时间: 2025-05-15 18:31:55 浏览: 25
### DHT11温湿度传感器 HAL 实现代码及驱动
#### 1. DHT11简介
DHT11是一种数字温湿度传感器,能够提供已校准的数字信号输出。其内部集成了温度和湿度传感元件,并通过专用的数字模块采集技术实现了高可靠性和长期稳定性[^2]。
#### 2. STM32 HAL库中的DHT11驱动实现
为了在STM32微控制器上使用HAL库来操作DHT11传感器,通常需要完成以下几个部分的工作:
- **GPIO初始化**:配置用于通信的GPIO引脚。
- **延时函数**:由于DHT11的数据传输依赖于精确的时间间隔,因此需要实现稳定的延时功能。
- **数据解析**:接收来自DHT11的40位数据并将其转换为实际的温度和湿度值。
以下是一个基于HAL库的DHT11驱动程序示例:
```c
#include "stm32f1xx_hal.h"
#define DHT11_PIN GPIO_PIN_0
#define DHT11_PORT GPIOA
void DHT11_Init(void);
uint8_t DHT11_ReadData(uint8_t *humidity, uint8_t *temperature);
// 初始化DHT11所用的GPIO
void DHT11_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置DHT11连接的GPIO引脚为推挽输出模式
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); // 设置初始状态为高电平
}
// 读取DHT11数据
uint8_t DHT11_ReadData(uint8_t *humidity, uint8_t *temperature) {
uint8_t data[5];
uint8_t i, j;
// 将引脚设置为输出并拉低至少18ms
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(20);
// 拉高引脚等待DHT11响应
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET);
HAL_Delay(1);
// 切换到输入模式以检测DHT11的响应
GPIO_InitTypeDef GPIO_InitStruct_Input = {0};
GPIO_InitStruct_Input.Pin = DHT11_PIN;
GPIO_InitStruct_Input.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct_Input.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct_Input);
// 等待DHT11将引脚拉低作为响应
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待下降沿
while (!(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN))); // 等待上升沿
// 接收40位数据
for (i = 0; i < 5; i++) {
data[i] = 0;
for (j = 0; j < 8; j++) {
while (!(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN))); // 等待上升沿
delay_us(30); // 延迟一段时间判断高低电平持续时间
if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)) {
data[i] |= (1 << (7 - j));
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待下降沿
} else {
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待下降沿
}
}
}
// 校验接收到的数据
if ((data[0] + data[1] + data[2] + data[3]) == data[4]) {
*humidity = data[0]; // 整数部分湿度
*temperature = data[2]; // 整数部分温度
return 1; // 成功返回1
} else {
return 0; // 失败返回0
}
}
```
上述代码展示了如何利用STM32 HAL库与DHT11交互的过程[^4]。其中`delay_us()`函数可以根据具体需求自行定义或调用HAL库的相关API。
#### 3. 数据处理与显示
一旦成功获取了湿度和温度数据,可以进一步将这些数据显示在OLED屏幕上或者通过串口发送给调试助手。例如,可以通过UART接口将数据打印出来:
```c
char buffer[50];
sprintf(buffer, "Humidity: %d%%\r\nTemperature: %dC\r\n", humidity, temperature);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
```
此段代码会将当前环境下的湿度和温度信息通过串口发送出去[^1]。
---
####
阅读全文
相关推荐


















