首页 > 其他分享 >STM32之DHT11温湿度传感器

STM32之DHT11温湿度传感器

时间:2024-11-07 22:19:29浏览次数:3  
标签:HAL PIN 温湿度 STM32 GPIO DATA buf DHT11

DHT11是一款常用的单总线数字温湿度传感器,它能够提供相对湿度和温度的测量值。本文将详细介绍如何使用STM32微控制器读取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(); // 拉低至少18ms
    delay_ms(20);
    DHT11_DATA_HIGH(); // 拉高20~40us
    delay_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~80us
    while (!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视而不见

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

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

标签:HAL,PIN,温湿度,STM32,GPIO,DATA,buf,DHT11
From: https://blog.csdn.net/weixin_66608063/article/details/143609059

相关文章

  • 基于STM32单片机的汽车胎压车速检测
    基于STM32单片机的汽车胎压车速检测毕业论文摘要随着汽车电子技术的快速发展,汽车监控系统已成为现代智能汽车的重要组成部分。本文设计了一种基于STM32单片机和蓝牙技术的汽车监控系统,该系统能够实时监控汽车驻车时的落锁状态、胎压、车窗状态,以及行车时的速度和时间等关键......
  • STM32学习之SPI的简介与使用
    SPI(SerialPeripheralInterface)是一种常用的同步串行通信协议,它被广泛应用于多种电子设备和组件之间的通信。以下是一些SPI常用于连接的设备类型:存储设备:NORFlash:用于存储固件或数据的非易失性存储器。NANDFlash:用于大容量数据存储的非易失性存储器。传感器:加速度......
  • 【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
     本篇文章分享关于如何使用STM32单片机对彩色摄像头(OV7725/OV2604)采集的图像数据进行分析处理,最后实现颜色的识别和检测。目录一、什么是颜色识别1、图像采集识别的一些基本概念1. 像素(Pixel)2. 分辨率(Resolution)3. 帧率(FrameRate)4. 颜色深度(ColorDepth)5. ......
  • 基于STM32的智能停车场管理系统设计
    引言本项目旨在基于STM32微控制器设计一个智能停车场管理系统。该系统集成了多种传感器和控制模块,以实现停车位实时检测、车辆识别、自动控制栏杆、车位信息显示和云端数据管理等功能。智能停车场管理系统可以有效提升停车场的运转效率,改善车主的停车体验,减少人工管理成本,并且......
  • 基于STM32的智能晾衣架系统设计
    引言本项目基于STM32微控制器设计了一个智能晾衣架系统,通过集成多个传感器模块和电机控制系统,实现自动化的晾晒和收衣功能。该系统能够根据天气状况自动调节晾衣架的伸展与收缩,以确保衣物在最佳条件下进行晾晒。项目涉及硬件设计、传感器数据处理和电机控制算法的实现,适用于家......
  • 使用c语言,用keil5进行stm32F103c8点灯实验
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言学习stm32首先要学会最基础的电灯实验。进行电灯实验需要进行一些前提工作,需要建立启动文件start和标准外设驱动文件library文件和uesr文件这三个工程文件。具体文件可在网站上进行搜素拷贝......
  • 【实测】使用STM32H7板子FatFS文件系统每秒读写2MB文件,实时写入7450个文件不出错,写满1
    【测试平台】STM32-V7开发板 【测试例子】https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980V7-025_FatFS文件系统例子(SD卡V1.2)【测试条件和校验】运行例子里面的命令6,命令6是个测速函数,每次写入2MB文件,同时读取出来校验,保证写入的没问题。/************......
  • STM32H563核心板调试笔记(一)
    前言这是组里师兄负责的项目,以FPGA为数据采集核心,但还需要执行一些流程性的指令,因此还需要一个CPU。我们不用Zynq是因为它里面的CPU性能比较强,功耗比较高(其实我们没有人很懂Zynq,可以说这是我们选型的假设,现在选都选好了,你就承认吧)。而MCU部分组里也就我比较懂,于是我经过一番比较......
  • STM32G4 双ADC模式之交替触发方式
    目录概述1认识双ADC模式2功能实现2.1原理介绍2.2实现方法 2.3应用范例概述本文主要介绍STM32G4双ADC模式之交替触发方式,包括ADC模块的功能介绍,实现框架结构,以及交替触发方式ADC的转换的实现原理。1认识双ADC模式双ADC模式可用于具有两个或更多ADC的器件。......
  • 基于STM32的远距离遥控自动避障小车设计
    引言本项目基于STM32微控制器设计一个远距离遥控自动避障小车系统。该系统通过蓝牙或Wi-Fi模块实现远程控制,同时结合超声波传感器和红外传感器,实现自主避障功能。小车支持多种操作模式,包括手动遥控、自动避障和路径跟踪,适用于家庭娱乐、智能小车开发和机器人教育等场景。项目......