在本文中,我们将介绍如何使用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型号和开发环境进行适配。此外,也可以根据需求进行扩展,比如添加其他传感器或实现数据的远程传输。
?作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
代码获取、问题探讨及文章转载可私信。
???愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇