欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > STM32+DHT11温湿度传感器(含完整代码)

STM32+DHT11温湿度传感器(含完整代码)

2024/10/23 15:21:55 来源:https://blog.csdn.net/weixin_66608063/article/details/143102033  浏览:    关键词:STM32+DHT11温湿度传感器(含完整代码)

DHT11是一款常用的数字温湿度传感器,它通过单总线与微控制器通信,输出数字信号,使得数据采集和处理变得简单。本文将详细介绍如何使用STM32微控制器驱动DHT11传感器,并提供完整的代码实现。

DHT11传感器简介

DHT11传感器包含一个已校准的数字信号输出,能够测量环境的温度和湿度。它具有以下特点:

  • 湿度测量范围:20%~90%RH
  • 温度测量范围:0~50℃
  • 单总线数字输出
  • 低功耗
  • 易于安装和使用

硬件连接

DHT11传感器通常有三个引脚,分别是VCC、DATA和GND。连接方式如下:

  • VCC:连接到STM32的3.3V或5V电源
  • DATA:连接到STM32的一个GPIO引脚(例如PA0)
  • GND:连接到STM32的地

软件编程

1. 初始化GPIO

首先,需要初始化与DHT11通信的GPIO引脚。

#include "stm32f1xx_hal.h"#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_PIN_0
#define DHT11_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()void DHT11_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};DHT11_GPIO_CLK_ENABLE();GPIO_InitStruct.Pin = DHT11_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
2. DHT11通信协议

DHT11的通信协议包括发送起始信号、等待响应信号、接收数据和校验数据。以下是实现这些步骤的代码。

#include "delay.h"#define DHT11_DATA_HIGH() HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET)
#define DHT11_DATA_LOW() HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET)
#define DHT11_DATA_READ() HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)void DHT11_Start(void) {DHT11_DATA_LOW(); // 拉低至少18msdelay_ms(20);DHT11_DATA_HIGH(); // 拉高20~40usdelay_us(30);HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); // 设置为输入模式
}uint8_t DHT11_CheckResponse(void) {uint8_t retry = 0;// 等待DHT11响应,响应信号为80us低电平while (DHT11_DATA_READ() && retry < 100) {delay_us(1);retry++;}// 检查是否收到响应if (retry >= 100) return 1;retry = 0;// 等待DHT11拉高40~80uswhile (!DHT11_DATA_READ() && retry < 100) {delay_us(1);retry++;}if (retry >= 100) return 1;return 0;
}uint8_t DHT11_ReadByte(void) {uint8_t i, byte = 0;for (i = 0; i < 8; i++) {// 等待50us低电平while (!DHT11_DATA_READ());delay_us(40);if (DHT11_DATA_READ()) {byte |= (1 << (7 - i)); // 数据1} else {// 数据0}// 等待高电平结束while (DHT11_DATA_READ());}return byte;
}void DHT11_ReadData(uint8_t *humidity, uint8_t *temperature) {uint8_t buf[5];DHT11_Start();if (!DHT11_CheckResponse()) {buf[0] = DHT11_ReadByte(); // 湿度整数buf[1] = DHT11_ReadByte(); // 湿度小数buf[2] = DHT11_ReadByte(); // 温度整数buf[3] = DHT11_ReadByte(); // 温度小数buf[4] = DHT11_ReadByte(); // 校验和if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) {*humidity = buf[0];*temperature = buf[2];}}
}
3. 主函数

在主函数中,初始化DHT11传感器,并定期读取温湿度数据。

#include "usart.h"int main(void) {HAL_Init();SystemClock_Config();DHT11_GPIO_Init();MX_USART2_UART_Init();uint8_t humidity, temperature;char buffer[64];while (1) {DHT11_ReadData(&humidity, &temperature);sprintf(buffer, "Humidity: %d%%\tTemperature: %dC\r\n", humidity, temperature);HAL_UART_Transmit(&huart2, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);HAL_Delay(1000);}
}

注意事项

  1. 时序要求:DHT11对通信时序有严格的要求,确保按照协议发送起始信号和读取数据。
  2. 电源稳定性:确保DHT11的电源稳定,避免电压波动影响测量结果。
  3. 数据校验:每次读取数据后,进行数据校验以确保数据的准确性。

通过上述步骤,我们可以在STM32上成功驱动DHT11温湿度传感器,并实现温湿度数据的实时读取。这为开发需要环境监测的嵌入式系统提供了基础。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com