dht11.h

#ifndef __DHT11_H
#define __DHT11_H#include "stm32f1xx_hal.h"  // 根据实际芯片型号调整(如stm32f4xx_hal.h)// DHT11数据结构
typedef struct {GPIO_TypeDef *GPIOx;    // GPIO端口(如GPIOA)uint16_t GPIO_Pin;      // GPIO引脚(如GPIO_PIN_0)uint8_t Temperature;    // 温度(整数部分,°C)uint8_t Humidity;       // 湿度(整数部分,%)
} DHT11_TypeDef;// 函数声明
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11);// 微秒级延时函数(需用户实现,或使用下方dht11.c中的模板)
void delay_us(uint16_t us);#endif /* __DHT11_H */

dht11.c

#include "dht11.h"
#include <stdint.h>// 私有函数声明
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11);
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11);
static void Set_Pin_Output(DHT11_TypeDef *DHT11);
static void Set_Pin_Input(DHT11_TypeDef *DHT11);// 初始化DHT11
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) {DHT11->GPIOx = GPIOx;DHT11->GPIO_Pin = GPIO_Pin;DHT11->Temperature = 0;DHT11->Humidity = 0;
}// 读取温湿度数据(返回0成功,1失败)
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11) {uint8_t data[5] = {0};if (DHT11_Start(DHT11) != 0) return 1; // 启动失败// 读取40位数据(5字节)for (int i = 0; i < 5; i++) {data[i] = DHT11_ReadByte(DHT11);}// 校验和验证if ((data[0] + data[1] + data[2] + data[3]) != data[4]) {return 1; // 校验失败}DHT11->Humidity = data[0];DHT11->Temperature = data[2];return 0;
}// 启动DHT11(发送开始信号)
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11) {Set_Pin_Output(DHT11);// 主机拉低至少18msHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_RESET);delay_us(18000);// 主机拉高20-40μsHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_SET);delay_us(30);// 切换为输入模式,等待DHT11响应Set_Pin_Input(DHT11);// 检测DHT11的低电平响应信号(超时检测)uint32_t timeout = 10000; // 10ms超时while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET) {if (--timeout == 0) return 1;delay_us(1);}// 检测DHT11的高电平信号(超时检测)timeout = 10000;while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {if (--timeout == 0) return 1;delay_us(1);}return 0; // 启动成功
}// 读取一个字节的数据
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11) {uint8_t byte = 0;for (int i = 0; i < 8; i++) {// 等待低电平结束(数据位开始)while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET);// 延时40μs判断高低电平(0: 26-28μs, 1: 70μs)delay_us(40);if (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {byte |= (1 << (7 - i)); // 高位在前}// 等待高电平结束while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET);}return byte;
}// 设置引脚为输出模式
static void Set_Pin_Output(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 设置引脚为输入模式
static void Set_Pin_Input(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 微秒级延时函数(需用户根据实际定时器实现)
__weak void delay_us(uint16_t us) {/* 默认实现(需替换为您的实际延时函数) */for (uint16_t i = 0; i < us; i++) {for (uint16_t j = 0; j < 10; j++) { // 粗略延时(需校准)__NOP();}}
}

使用教程

#include "dht11.h"DHT11_TypeDef myDHT11;DHT11_Init(&myDHT11, GPIOA, GPIO_PIN_1);if (DHT11_ReadData(&myDHT11) == 0){//温度处理 + LED1控制if(myDHT11.Temperature>TT){HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//LED1motorIndex=3;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);OLED_ShowString(112, 16, "H", OLED_8X16);//温度过高显示"H"}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);//LED1motorIndex=0;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);OLED_ShowString(112, 16, "L", OLED_8X16);//温度正常显示"L"}sprintf(str, "温度:%d.0℃", myDHT11.Temperature);OLED_ShowString(1, 16, str, OLED_8X16);//湿度处理if(myDHT11.Humidity>HT){HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);//LED2OLED_ShowString(112, 32, "H", OLED_8X16);//湿度过高显示"H"}else{HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);OLED_ShowString(112, 32, "L", OLED_8X16);//湿度正常显示"L"}sprintf(str, "湿度:%dRH%%", myDHT11.Humidity);OLED_ShowString(1, 32, str, OLED_8X16);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912222.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912222.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912222.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Actix Web 精要】Rust Web 服务开发核心技术与实战指南

目录 一、Actix Web 核心架构解析1.1 核心组件交互流程1.2 关键组件说明&#xff1a; 二、项目初始化与配置2.1 创建项目2.2 添加依赖 (Cargo.toml)2.3 项目结构 三、核心模块实现3.1 配置管理 (src/config.rs)3.2 应用状态管理 (src/main.rs)3.3 数据模型 (src/models/user.rs…

从URL到视频:用Python和AI构建自动化内容讲解视频生成管道

摘要 本文旨在从技术层面&#xff0c;深入探讨并实践一个将任意网页链接&#xff08;如飞书文档、博客文章&#xff09;自动转换为带有配音和字幕的讲解视频的系统。我们将详细拆解整个实现流程&#xff0c;覆盖从内容抓取与解析、利用大语言模型&#xff08;LLM&#xff09;智…

Java 使用 Easy Excel 进行 Excel 数据导入导出

1. 通过 Maven 下载 Easy Excel 依赖包 在项目的 pom.xml 文件中添加以下依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> <!-- 使用最新版本 -->…

国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)

在 PDF 文档的 .NET 平台处理流程中&#xff0c;使用 C# 读取 PDF 条码 是一项常见需求&#xff0c;特别适用于处理扫描件或电子表单。无论是物流、金融、医疗还是制造行业&#xff0c;PDF 文档中经常包含用于追踪或识别的条码。这些条码可能是嵌入图像&#xff0c;也可能是矢量…

2023国赛数字取证-流量分析

数据取证 - 1 A 集团的⽹络安全监控系统发现恶意份⼦正在实施⾼级可持续攻击&#xff08;APT&#xff09;&#xff0c;并抓取了部分可疑流量包。请 您根据捕捉到的流量包&#xff0c;搜寻出⽹络攻击线索&#xff0c;分解出隐藏的恶意程序&#xff0c;并分析恶意程序的⾏为。 …

【预约小程序】-健身房预约课程小程序——仙盟创梦IDE

东方仙盟-坐拥万个代码 免费报表 阿雪技术观 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&#xff0c;更要成为贡献者。无论是分享自己的代码、撰写技术博客&#xff0c;还是参与开源项目的维护和改进&#xff0c;每一个小小的举动都可能成为推动技术进…

SmartETL中数据库操作与流程解耦的设计与应用

正如ETL这个概念本身所指示的&#xff0c;数据库读写访问是ETL的最常用甚至是最主要的操作。现代信息系统的设计与运行基本都是围绕数据库展开的&#xff0c;很多应用的核心功能都是对数据库的CRUD&#xff08;创建、检索、更新、删除&#xff09;操作。 SmartETL框架设计之初…

【记录解决问题】activiti--sql 转义符设置

一、背景 %、&#xff01;、_在sql查询时需要转义&#xff0c;转义的语法 like %?2% escape ?#{escapeCharacter()}二、activiti转义配置 String wildcardEscapeClause ""; if (this.databaseWildcardEscapeCharacter ! null && this.databaseWildcard…

Unity AR构建维护系统的以AI驱动增强现实知识检索系统

本博客概述了为维护开发的AI驱动增强现实&#xff08;AR&#xff09;知识检索系统的开发过程&#xff0c;该系统集成了Unity用于AR、Python服务器用于后端处理&#xff0c;以及ChatGPT用于自然语言处理。该系统允许维护工人通过AR设备&#xff08;如HoloLens 2&#xff09;查询…

Java面向对象核心:方法值传递与封装机制精讲

文章目录 Java面向对象编程核心笔记一、方法值传递机制1. 基本数据类型传递2. 引用数据类型传递值传递总结 二、面向对象核心概念1. 类与对象关系2. 类定义规范3. 对象创建与使用 三、封装机制详解1. 封装三大要素2. 封装示例&#xff08;GirlFriend类&#xff09;3. 测试类4. …

【Actix Web】构建高性能 Rust API:Actix Web 最佳实践与进阶指南

目录 一、高性能 API 架构设计1.1 系统架构图1.2 核心组件 二、项目初始化与配置2.1 创建项目2.2 添加依赖 (Cargo.toml)2.3 配置文件 (config/default.toml) 三、核心模块实现3.1 应用状态管理 (src/state.rs)3.2 数据模型定义 (src/models.rs) 四、认证与授权系统4.1 JWT 认证…

vue项目中纯前端实现导出pdf文件,不需要后端处理。

在 Vue 项目中&#xff0c;纯前端实现导出 PDF 文件是完全可行的。通常可以借助一些 JavaScript 库来将 HTML 内容或 DOM 元素转换为 PDF 并下载&#xff0c;无需后端参与。 下面介绍几种常用的方案和实现方法&#xff1a; 推荐方案&#xff1a;使用 html2canvas jsPDF 安装…

c++虚拟内存

常见的内存困惑 当你编写C程序时&#xff0c;是否遇到过&#xff1a; vector申请200MB内存&#xff0c;但系统显示只占用20MB&#xff1f;程序在低配机器上崩溃&#xff0c;报出std::bad_alloc但内存显示充裕&#xff1f;遍历数组时特定位置耗时突然增加&#xff1f;相同代码…

领域驱动设计(DDD)【22】之限定建模技术

文章目录 一 限定初识二 限定识别三 限定实现 一 限定初识 一个 员工 可以拥有多份 工作经验&#xff0c;而各个 工作经验 的 时间段 不能相互重叠。可以得出一个推论&#xff1a;对于一个 员工 而言&#xff0c;每个 时间段 只能有一条 工作经验。 UML中第二种表述方式&…

《P6492 [COCI 2010/2011 #6] STEP》

题目描述 给定一个长度为 n 的字符序列 a&#xff0c;初始时序列中全部都是字符 L。 有 q 次修改&#xff0c;每次给定一个 x&#xff0c;若 ax​ 为 L&#xff0c;则将 ax​ 修改成 R&#xff0c;否则将 ax​ 修改成 L。 对于一个只含字符 L&#xff0c;R 的字符串 s&#…

macOS,切换 space 失效,向右切换space(move right a space) 失效

背景 准确来讲&#xff0c;遇到的问题是向右切换space&#xff08;move right a space) 失效&#xff0c;并向左是成功的。 在键盘-快捷键-调度中心中&#xff0c;所有的快捷键均可用&#xff0c;但是“向右移动一个空间”总是失效。 已经检查过不是快捷键冲突的问题&#x…

网飞猫官网入口 - 免费高清影视平台,Netflix一站观看

网飞猫是一个专注于提供丰富影视资源的在线平台&#xff0c;涵盖国内外热门电影、电视剧、动漫、综艺等多种类型。它不仅整合了Netflix的独家内容&#xff0c;还提供了大量高清、蓝光画质的影视作品&#xff0c;支持多语言字幕&#xff0c;满足不同用户的观影需求。网飞猫的界面…

Hyper-v-中的FnOs--飞牛Nas虚拟磁盘扩容(不清除数据)

在Hyper-v下的飞牛Nas要怎么在不删除原有虚拟磁盘数据的情况下扩容呢 OK下面开始教学&#xff08;适用于Basic模式的虚拟磁盘扩容&#xff0c;Linear没试过&#xff09; 先关闭飞牛Nas系统 找到飞牛Nas虚拟机&#xff0c;在设置下SCSI控制器找到要扩容的虚拟磁盘&#xff0c; 点…

掌握 MySQL 的基石:全面解读数据类型及其影响

前言 上篇文章小编讲述了关于MySQL表的DDL操作&#xff0c;在那里我多次使用了MySQL的数据类型&#xff0c;但是我并没有去讲述MySQL的数据类型&#xff0c;想必各位读者已经很好奇MySQL的数据类型都有什么了&#xff0c;今天这篇文章我将会详细的去讲述MySQL的数据类型&#x…

buildadmin 如何制作自己的插件

官方文档指引 提示&#xff1a;若不计划发布到应用市场&#xff0c;可省略图片等非必要功能 参考文档&#xff1a;https://doc.buildadmin.com/senior/module/basicInfo.html 目录 官方文档指引开发说明模块开发流程模块包结构示例安装开发工具 总结 开发说明 目标&#xff…