在本文中,我们将介绍如何使用STM32微控制器读取和显示DHT11温湿度传感器的数据。我们将使用C语言和STM32的库函数来实现这个功能。本文包含硬件连接和软件编程两个方面的内容。
硬件连接
首先,我们需要将DHT11温湿度传感器连接到STM32微控制器上。DHT11传感器有4个引脚:VCC(电源)、DATA(数据)、NC(未连接引脚)和GND(地)。下面是一个示例连接图:
```
DHT11 STM32
VCC -------------- 3.3V
DATA -------------- GPIO引脚
NC -------------- 未连接
GND -------------- GND
```
请注意,VCC引脚连接到STM32的3.3V电源引脚,而非5V引脚。DHT11是一个3.3V电平设备,直接连接到5V可能导致损坏。
软件编程
接下来,我们将使用C语言和STM32的库函数来实现读取和显示DHT11温湿度传感器数据的功能。
1. 配置GPIO引脚
首先,我们需要配置STM32的GPIO引脚,使其能够与DHT11传感器通信。
```c
#include "stm32fxxx.h" // 包含适用于您的STM32系列的头文件
#define DHT11_DATA_PIN GPIO_PIN_0
#define DHT11_GPIO_PORT GPIOA
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 配置GPIO为输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}
```
2. 读取DHT11传感器数据
接下来,我们将编写函数来读取DHT11传感器的温湿度数据。
```c
uint8_t DHT11_Read(uint8_t* temperature, uint8_t* humidity) {
uint8_t data[5] = { 0 };
uint8_t bit_count = 0;
uint8_t byte_count = 0;
uint8_t checksum = 0;
// 拉低总线
GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_DATA_PIN);
Delay_us(18000); // 延时18ms
// 拉高总线
GPIO_SetBits(DHT11_GPIO_PORT, DHT11_DATA_PIN);
Delay_us(40); // 延时40us
// 配置总线为输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
// 等待DHT11响应
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET);
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
// 读取数据
for (bit_count = 0; bit_count < 40; bit_count++) {
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
Delay_us(60); // 延时60us
if (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET) {
data[byte_count] |= (1 << (7 - bit_count % 8));
}
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET);
if (bit_count % 8 == 7) {
byte_count++;
}
}
// 恢复总线为输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
// 计算校验和
checksum = data[0] + data[1] + data[2] + data[3];
// 检查校验和是否正确
if (checksum != data[4]) {
return 0;
}
// 提取温湿度数据
*humidity = data[0];
*temperature = data[2];
return 1;
}
```
3. 显示数据
最后,我们将使用LCD显示屏来显示DHT11传感器的温湿度数据。
```c
#include "lcd.h" // 包含LCD显示屏的库函数
void DisplayData(uint8_t temperature, uint8_t humidity) {
char temp_str[10];
char humid_str[10];
sprintf(temp_str, "Temperature: %d C", temperature);
LCD_Print(0, 0, temp_str);
sprintf(humid_str, "Humidity: %d %%", humidity);
LCD_Print(1, 0, humid_str);
}
```
4. 主函数
最后,我们在主函数中调用上述函数,并添加一个延时来控制数据的刷新频率。
```c
int main(void) {
uint8_t temperature, humidity;
// 初始化系统和外设
System_Init();
GPIO_Configuration();
LCD_Init();
while(1) {
if (DHT11_Read(&temperature, &humidity)) {
DisplayData(temperature, humidity);
}
Delay_ms(2000); // 每两秒更新数据
}
}
```
结论
通过上述步骤,我们成功地实现了使用STM32微控制器读取和显示DHT11温湿度传感器数据。通过配置GPIO引脚、读取传感器数据和显示数据,我们能够实时获取温湿度信息并在LCD显示屏上显示。
请注意,以上代码是一个示例,实际项目中需要根据具体的STM32型号和开发环境进行适配。此外,也可以根据需求进行扩展,比如添加其他传感器或实现数据的远程传输。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料