使用STM32微控制器读取和显示DHT11温湿度传感器数据

在本文中,我们将介绍如何使用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型号和开发环境进行适配。此外,也可以根据需求进行扩展,比如添加其他传感器或实现数据的远程传输。

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

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

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

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

点击领取更多详细资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259886.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ASF-YOLO融合空间特征和尺度特征的新型注意力尺度序列融合模型开发构建涵洞隧道场景下墙壁建筑缺陷分割检测系统

在ASF-YOLO提出之初&#xff0c;我们就进行了相应的实践开发&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《基于ASF-YOLO融合空间特征和尺度特征的新型注意力尺度序列融合模型开发构建医学场景下细胞分割检测识别系统&#xff0c;以【BCC、DSB2018数据集为基准】》 …

性能压力测试--确保企业数字化业务稳健运行

随着企业的数字化转型和依赖云计算的普及&#xff0c;软件系统的性能已经成为企业成功运营的关键因素之一。性能压力测试作为确保系统在各种条件下都能高效运行的关键步骤&#xff0c;对企业的重要性不可忽视。以下是性能压力测试对企业的几个重要方面的影响和作用&#xff1a;…

行为型设计模式(二)责任链模式 策略模式

责任链模式 Chain of Responsibility 1、什么是责任链模式 责任链模式为请求创建一个接收者对象的链&#xff0c;每个接收者都包含对另一个接收者的引用。如果一个对象不能处理请求&#xff0c;它会将请求传递给链中的下一个接收者&#xff0c;如此模式下&#xff0c;请求沿着…

机器视觉工程师,我存多少钱可以躺平

钱钱钱&#xff01;还是钱&#xff01;除了钱还能聊点别的吗&#xff1f;钱可以让你生活的更好&#xff0c;也可以让你​在生活中的选择很无奈。 如果想要知道拥有多少存款才能躺平不上班&#xff0c;那么首先要明确躺平的定义。所谓的躺平&#xff0c;其实并不代表不能工作&a…

ASP.NET Core面试题之Redis高频问题

&#x1f388;&#x1f388;在.NET后端开发岗位中&#xff0c;如今也少不了、微服务、分布式、高并发高可用相关的面试题&#x1f388;&#x1f388; &#x1f44d;&#x1f44d;本文分享一些整理的Redis高频面试题&#x1f389; &#x1f44d;&#x1f44d;机会都是给有准备…

WPF——样式和控件模板、数据绑定与校验转换

样式和控件模板 合并资源字典 Style简单样式的定义和使用 ControlTemplate控件模板的定义和使用 定义 使用 Trigger触发器 数据绑定与校验转换 数据绑定的设置 代码层实现绑定 数据模板DataTemplate xml文件的读取与显示 方法的返回值作为源绑定到控件中ObjectDataProvider L…

Axure之中继器的使用(交互动作reperter属性Item属性)

目录 一.中继器的基本使用 二.中继器的动作&#xff08;增删改查&#xff09; 2.1 新增 2.2 删除 2.3 更新行 2.4 效果展示 2.5 模糊查询 三.reperter属性 在Axure中&#xff0c;中继器&#xff08;Repeater&#xff09;是一种功能强大的组件&#xff0c;用于创建重复…

ES集群G1回收器,堆空间无法被回收问题

ES堆空间不足的问题&#xff0c;困扰了我有两年的时间。dump堆去分析&#xff0c;也未能分析出来&#xff0c;堆到底是被什么占用了。 我把堆空间给了31.9G&#xff0c;这是指针压缩生效的临界值&#xff0c;如果再大就指针压缩失效了。 痛苦的是&#xff0c;随着时间的增长。堆…

【HarmonyOS开发】ArkTs关系型和非关系型数据库的存储封装

前面使用了首选项的存储方式&#xff0c;因此将其他的两种存储方式&#xff08;键值型数据库和关系型数据库&#xff09;也学习一下&#xff0c;简单记录一下&#xff0c;并进行封装&#xff0c;方便后续使用。 1、效果预览 2、使用条件 2.1 键值型数据库 键值型数据库实现数据…

linux 应用开发笔记---【线程】

1.概念&#xff1a; 线程是参与系统调度的最小单位&#xff0c;它被包含在进程中&#xff0c;是进程的实际运行单位 一个进程可以创建多个线程&#xff0c;多个线程并发运行&#xff0c;每个线程执行不同的任务 2.如何创建线程 当一个程序启动的时候&#xff0c;一个进程被…

小鹅通基于 TSE 云原生 API 网关的落地实践

导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕&#xff0c;40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场&#xff0c;我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。…

TCP 核心工作机制

TCP 的核心知识&#xff1a;如何保证传输可靠 如何提高传输效率 如何保证传输可靠&#xff1a;确认应答机制 超时重传机制 如何提高传输效率&#xff1a;滑动窗口机制、流量控制机制、延时应答机制、捎带确认机制、拥塞控制机制 可靠机制 TCP的可靠性主要是通过 确认应答 …

多门店自助点餐+外卖二合一小程序系统源码:自助点餐+外卖配送 带完整搭建教程

互联网的普及和移动支付的便捷&#xff0c;餐饮行业也在经历着数字化转型。小编来给大家介绍一款多门店自助点餐外卖二合一小程序&#xff0c;带完整的搭建教程。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.多门店管理&#xff1a;支持一个平台管理多个…

华为OS与麒麟OS:华为自研操作系统的对决

导言 在移动操作系统领域&#xff0c;华为OS和麒麟OS代表了华为在自主研发方面的努力。本文将深入探讨这两个操作系统的特点、竞争关系以及它们在用户体验、生态系统建设等方面的差异。 1. 背景与起源 华为OS的诞生&#xff1a; 华为OS是华为公司为应对外部环境而自主…

【音视频 | AAC】AAC音频编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

网络基础【网线的制作、OSI七层模型、集线器、交换机介绍、路由器的配置】

目录 一.网线的制作 1.1.网线的标准 1.2.水晶头的做法 二.OSI七层模型、集线器、交换机介绍 集线器&#xff08;Hub&#xff09;&#xff1a; 交换机&#xff08;Switch&#xff09;&#xff1a; 三.路由器的配置 3.1.使用 3.2.常用的功能介绍 1、如何管理路由器 2、家…

SVN搭建指导

环境 centos 7.9 SVN安装方式一&#xff1a;yum 1.1 http服务 至今还没有搞定网页版&#xff0c;网页版需要搭建apache http服务。遇到如下问题&#xff1a; centos - svn: Could not open the requested SVN filesystem - Stack Overflow 在试了加777权限&#xff0c;加a…

Hal深入实战/perfetto-systrace实战/SurfaceFlinger合集-安卓framework开发实战开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01; 下面来介绍一下新的framework专题halperfettosurafceflinger&#xff0c;这个专题主要就是分为3大块&#xff0c;但是彼此直接又是相互关联的。 比如surfaceflingre模块深入分析需要用到hal相关的模块&#xff…

Git报错x509: certificate signed by unknown authority

下载报错&#xff1a; Error downloading object: model-00001-of-00008.safetensors (ed3ac49): Smudge error: Error downloading model-00001-of-00008.safetensors (ed3ac4983f682a999b0e4b6f072aad294c4fd9a7e968e90835ba5c4b466d3c7c): LFS: Get https://cdn-lfs.huggin…

百度侯震宇:AI原生与大模型将从三个层面重构云计算

12月20日&#xff0c;2023百度云智大会智算大会在北京举办&#xff0c;大会以「大模型重构云计算&#xff0c;Cloud for AI」为主题&#xff0c;深度聚焦大模型引发的云计算变革。 百度智能云表示&#xff0c;为满足大模型落地需求&#xff0c;正在基于「云智一体」战略重构…