DHT11温湿度传感器与STM32连接
时间: 2024-12-12 17:15:36 浏览: 18
DHT11温湿度传感器是一种常见的数字温湿度传感器,广泛应用于各种环境监测项目中。它可以通过单总线协议与微控制器进行通信。STM32是一款性能强大的微控制器系列,常用于嵌入式系统开发。下面是如何将DHT11温湿度传感器与STM32连接的步骤:
### 硬件连接
1. **电源连接**:
- DHT11的VCC引脚连接到STM32的3.3V或5V电源(根据具体型号)。
- DHT11的GND引脚连接到STM32的GND。
2. **数据连接**:
- DHT11的DATA引脚连接到STM32的一个GPIO引脚(例如PA0)。
### 软件配置
1. **GPIO配置**:
- 将连接DHT11数据引脚的GPIO设置为开漏输出模式。
- 初始状态下,GPIO输出高电平。
2. **通信协议**:
- DHT11使用单总线协议进行通信,数据传输包括起始信号、数据位和校验位。
- STM32通过拉低数据线至少18毫秒来发送起始信号,然后释放总线,进入接收模式。
3. **数据读取**:
- DHT11响应起始信号后,会发送40位数据,包括湿度整数部分、湿度小数部分、温度整数部分、温度小数部分和校验和。
- STM32需要读取这些数据并进行校验。
### 示例代码
以下是一个简单的示例代码,用于读取DHT11的数据:
```c
#include "stm32f1xx_hal.h"
#define DHT11_PIN GPIO_PIN_0
#define DHT11_GPIO_PORT GPIOA
void DHT11_Start(void) {
// 拉低数据线至少18ms
HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(18);
// 释放总线
HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_PIN, GPIO_PIN_SET);
// 等待20-40us
HAL_Delay(1);
}
uint8_t DHT11_ReadByte(void) {
uint8_t i, byte = 0;
for (i = 0; i < 8; i++) {
// 等待数据线拉低
while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET);
// 等待数据线拉高
while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_RESET);
// 等待数据线拉低
while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET);
// 读取数据位
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET) {
byte |= (1 << (7 - i));
}
// 等待数据线拉高
while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_RESET);
}
return byte;
}
void DHT11_ReadData(uint8_t *humidity, uint8_t *temperature) {
uint8_t temp_int, temp_dec, hum_int, hum_dec, checksum;
DHT11_Start();
// 等待DHT11响应
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET) {
// 读取数据
hum_int = DHT11_ReadByte();
hum_dec = DHT11_ReadByte();
temp_int = DHT11_ReadByte();
temp_dec = DHT11_ReadByte();
checksum = DHT11_ReadByte();
// 校验数据
if (checksum == (hum_int + hum_dec + temp_int + temp_dec)) {
*humidity = hum_int;
*temperature = temp_int;
}
}
}
int main(void) {
HAL_Init();
// 初始化GPIO
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
uint8_t humidity, temperature;
while (1) {
DHT11_ReadData(&humidity, &temperature);
// 处理数据
HAL_Delay(2000);
}
}
```
###
阅读全文