当前位置: 首页 > news >正文

STM32和DHT11使用显示温湿度度(代码理解)+单总线协议

基于STM32CT,利用DHT11采集温湿度数据,在OLED上显示。一定要阅读DHT11数据手册。

1、 DHT11温湿度传感器

引脚说明

1、VDD 供电3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND 接地,电源负极

硬件电路

微处理器与DHT11的连接典型应用电路如上图所示,DATA上拉后与微处理器的I/O端口相连。
1.典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降低上拉电
阻的阻值。
2. 使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。
3. 每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次
读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。

以上硬件部分来自于DHT11数据手册,为方便硬件部分DATA直接接STM32的IO口。
硬件部分接好线之后,需要知道单片机和 DHT11如何通信,即将数据传给单片机显示在OLED上。

2、单总线协议

DHT11与单片机之间通过简化的单总线协议通信。(和从机通过1根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制。既可传输时钟,又能传输数据,而且数据传输是双向的。)

  • 单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。
  • 设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;
  • 单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从j结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

重点理解下图的时序图就明白具体什么样,后续的代码也是基于这个图编写的协议。
在这里插入图片描述
上下两张图相同
在这里插入图片描述
通信过程分为主机(stm32)发送起始信号-从机(DHT11)发送响应信号-从机发送数据-从机发送结束信号

  • DHT11上电后,一直采集数据,DATA数据线由上拉电阻拉高(或者单片机IO口设置为高电平)一直保持高电平;此时 DHT11的 DATA 引脚处于输入状态,时刻检测外部信号。
  • 主机起始信号:单片机IO口为输出模式,输出低电平并保持一段时间,然后再回高电平也就是释放总线,另外IO口转为开漏输入模式。
  • 从机响应信号:DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束后,输出 一段时间的低电平作为应答信号,紧接着输出一段时间的高电平(也就是释放总线)通知单片机准备接收数据。
  • 输出40位数据: 湿度高8位 :湿度低8位: 温度高8位 : 温度低8位 : 校验位
    校验位 =湿度高8位 + 湿度低8位 +温度高8位 + 温度低8位 ,不正确则放弃重新接收数据。
    输出数据时:,位数据0的格式为: 54 微秒的低电平和 23-27 微秒的高电平,位数据1的格式为: 54 微秒的低电平加68-74微秒的高电平。
  • 结束信号:数据输出完后,继续输出持续时间的低电平后转为输入状态,由于释放总线随之变为高电平。但DHT11内部重测环境温湿度数据,并记录数据,等待外部信号的到来。

该表来自DHT11数据手册,说明了起始信号、响应信号、发送数据0/1、结束信号中高低电平的持续时间,编写代码时也要参照这着表格和上面的时序图编写。
在这里插入图片描述

3、DHT11代码

DHT11.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"#define  DHT11_IO   GPIOB
#define  DHT11_Pin  GPIO_Pin_12
#define  DHT11_RCC  RCC_APB2Periph_GPIOB//设置IO输出
void DHT11_MOSI_Init(void)
{RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStruct.GPIO_Pin=DHT11_Pin;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(DHT11_IO,&GPIO_InitStruct);GPIO_SetBits(DHT11_IO,DHT11_Pin);}//设置IO为输入
void DHT11_MISO_Init(void)
{RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;//浮空输入,引脚电平来自外界GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin=DHT11_Pin;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(DHT11_IO,&GPIO_InitStruct);}//单总线通信 开始
void DHT11_Start(void)
{DHT11_MOSI_Init();  //highGPIO_ResetBits(DHT11_IO,DHT11_Pin);//low 主机拉低总线18-30ms,然后释放Delay_ms(25);GPIO_SetBits(DHT11_IO,DHT11_Pin);  //high  释放Delay_us(13);  //保持高电平,等待从机响应     根据数据手册设置的主机释放总线的时间DHT11_MISO_Init();  //io为输入 等待从机}// 接收数据,高位先行
uint8_t DHT11_ReceiveByte(void)
{uint8_t Byte=0x00;for(int i=0;i<8;i++){//数据0:54us低电平+23-27高电平  数据1:54us低电平+68-74高电平while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==0);//等待低电平时间过去Delay_us(40);  //高电平持续时间超过40 说明数据为1if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==1)  //读到为1,说明为高电平{ Byte|=(0x80>>i); //将数据位写入 Byte 中,从高位到低位  高位先行while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==1);//等待高电平结束}}return Byte;}
//接收数据
//该函数每次读出的温湿度数值是上一次读取测量的结果 
char DHT11_GetData(uint8_t *Humi,uint8_t* Temp)
{char Mark='+'; //温度 零下还是零上uint8_t Humi_H,Humi_L,Temp_H,Temp_L,Check; //温湿度高低位、校验位DHT11_Start();//通信if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==0){while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==0);  //DHT11响应完毕while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==1);  // 准备接收高电平之后的数据//湿度高8位    湿度低8位   温度高8位     温度低8位      校验位  传感器输出40位数据Humi_H=DHT11_ReceiveByte();                   Humi_L=DHT11_ReceiveByte();//等于0Temp_H=DHT11_ReceiveByte();Temp_L=DHT11_ReceiveByte();//温度低8位中的Bit8为1则表示负温度,否则为正温度,后7位为小数部分Check=DHT11_ReceiveByte();if(Humi_H+Humi_L+Temp_H+Temp_L==Check) //校验{*Humi=Humi_H; //传送数据*Temp=Temp_H;//小数部分不做处理//如果温度的低8位的最高位为1,表示温度为负数if((Temp_L&0x80)==0x80){Mark='-';}}//DHT11继续输出低电平54微秒后转为输入状态,释放总线变为高电平。while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_Pin)==0);GPIO_SetBits(DHT11_IO,DHT11_Pin); //释放总线}return Mark;
}
//获取实时温湿度
//连续获取两次数据,DHT11模块会在上一次结束信号时重测温湿度数据
char DHT11_GetRealData(uint8_t *Humi,uint8_t* Temp)
{char Mark='+';DHT11_GetData(Humi,Temp);Delay_ms(1000);Delay_ms(1000);Delay_ms(100);          //数据手册规定读取传感器数据大于2sMark=DHT11_GetData(Humi,Temp);return Mark;}

DHT11.h

#ifndef __DTH11_H
#define __DTH11_H//上电后等待1秒才调用函数
char DHT11_GetData(uint8_t *Humi,uint8_t* Temp);
char DHT11_GetRealData(uint8_t *Humi,uint8_t* Temp);//实时温湿度
void DHT11_Start(void);
#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "DTH11.H"uint8_t Humi,Temp;
int main(void)
{OLED_Init();DHT11_Start();OLED_ShowString(1, 1, "Humi:");OLED_ShowString(2, 1, "Temp:");Delay_ms(1000);while (1){DHT11_GetData(&Humi,&Temp);DHT11_GetRealData(&Humi,&Temp);OLED_ShowNum(1,6,Humi,2);OLED_ShowNum(2,6,Temp,2);}
}

相关文章:

STM32和DHT11使用显示温湿度度(代码理解)+单总线协议

基于STM32CT&#xff0c;利用DHT11采集温湿度数据&#xff0c;在OLED上显示。一定要阅读DHT11数据手册。 1、 DHT11温湿度传感器 引脚说明 1、VDD 供电3.3&#xff5e;5.5V DC 2、DATA 串行数据&#xff0c;单总线 3、NC 空脚 4、GND 接地&#xff0c;电源负极 硬件电路 微…...

EVM-MLIR:以MLIR编写的EVM

1. 引言 EVM_MLIR&#xff1a; 以MLIR编写的EVM。 开源代码实现见&#xff1a; https://github.com/lambdaclass/evm_mlir&#xff08;Rust&#xff09; 为使用MLIR和LLVM&#xff0c;将EVM-bytecode&#xff0c;转换为&#xff0c;machine-bytecode。LambdaClass团队在2周…...

深入Django(八)

掌握Django的管理后台 引言 在前七天的教程中&#xff0c;我们介绍了Django的基础架构、模型、视图、模板、URL路由、表单系统以及数据库迁移。今天&#xff0c;我们将深入了解Django的管理后台&#xff0c;这是一个功能强大的内置管理界面&#xff0c;用于创建、更新、查看和…...

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命 在科技的浪潮中,华为再次引领潮流,2024年的开发者大会带来了一系列令人瞩目的创新成果。从鸿蒙操作系统的全新Beta版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…...

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.7-2.8

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.7 迁移学习&#xff08;Transfer learning&#xff09; 第三门课 结构化机器学习项目&#xff0…...

云计算渲染时代:选择Blender或KeyShot进行高效渲染

在云渲染技术日益成熟的背景下&#xff0c;挑选一款贴合项目需求的3D渲染软件显得尤为关键。当前&#xff0c;Blender与KeyShot作为业界领先的全能渲染解决方案&#xff0c;广受推崇。它们虽皆能创造出令人信服的逼真视觉效果&#xff0c;但在特色功能上各有所长。本篇文章旨在…...

html5中的iframe

HTML5中的iframe 浏览上下文是浏览器展示文档的环境&#xff0c;通常是一个tab标签页&#xff0c;一个窗体或者是浏览器页面的一部分。每个浏览上下文都有一个活动文档的源和一个记录所有展示文档的有序历史。浏览上下文的通讯被严格限制&#xff0c;只有两个同源的浏览器上下…...

海睿思问数(TableGPT):开创企业新一代指标应用模式

1 指标建设对企业经营管理数字化的价值分析 指标是将海量数据中关键信息提炼和挖掘出来&#xff0c;以数据为载体展示企业经营管理和分析中的统计量。它通过分析数据&#xff0c;形成一个具有度量值的汇总结果&#xff0c;使得业务状态可以被描述、量化和分解。指标通常由度量…...

LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能

LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能 使语言模型的微调类似于调制一杯精致的鸡尾酒。模型合并可用于提高单个模型的性能。我们发现此方法对于大型语言模型和密集嵌入模型也很有用,并设计了…...

默认导出(default)和命名导出

1.默认导出 优点&#xff1a; 简洁的导入语法&#xff1a; 导入时不需要使用花括号&#xff0c;可以直接重命名。单一职责&#xff1a; 模块导出一个主要功能或对象时&#xff0c;默认导出更符合逻辑。 适用场景&#xff1a; 模块只有一个导出&#xff1a; 如一个组件、一个…...

开发个人Go-ChatGPT--1 项目介绍

开发个人Go-ChatGPT--1 项目介绍 开发个人Go-ChatGPT--1 项目介绍知识点大纲文章目录项目地址 开发个人Go-ChatGPT–1 项目介绍 本文将以一个使用Ollama部署的ChatGPT为背景&#xff0c;主要还是介绍和学习使用 go-zero 框架&#xff0c;开发个人Go-ChatGPT的服务器后端&#…...

皮卡超级壁纸 | 幸运壁纸幸运壁纸app是一款涵盖了热门影视剧、动漫、风景等等资源的装饰工具,

软件下载链接&#xff1a;壁纸下载方式在链接中文章底部 皮卡超级壁纸 皮卡超级壁纸是一款专为手机用户设计的壁纸应用&#xff0c;它提供了丰富多样的高清壁纸资源&#xff0c;让用户的手机界面焕然一新。这款应用以其海量的壁纸库和用户友好的操作界面&#xff0c;在市场上…...

普通集群与镜像集群配置

目录 一. 环境准备 二. 开始配置集群 三. RabbitMQ镜像集群配置 四. 安装并配置负载均衡器HA 一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 主机名系统IP服务rabbitmq-1 Rocky_linux9.4 192.168.226.22RabbitMQ&#xff0c;MySQLrabbitmq-2Rocky_linux9.41…...

2024科技文化节程序设计竞赛

补题链接 https://www.luogu.com.cn/contest/178895#problems A. 签到题 忽略掉大小为1的环&#xff0c;答案是剩下环的大小和减环的数量 #include<bits/stdc.h> #include<iostream> #include<cstdio> #include<vector> #include<map> #incl…...

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…...

【密码学】RSA公钥加密算法

文章目录 RSA定义RSA加密与解密加密解密 生成密钥对一个例子密钥对生成加密解密 对RSA的攻击通过密文来求得明文通过暴力破解来找出D通过E和N求出D对N进行质因数分解通过推测p和q进行攻击 中间人攻击 一些思考公钥密码比对称密码的机密性更高&#xff1f;对称密码会消失&#x…...

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…...

C++怎么解决不支持字符串枚举?

首先&#xff0c;有两种方法&#xff1a;使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性&#xff0c;运行时发现错误高 - 编译期类型检查&#xf…...

中英双语介绍四大会计师事务所(Big Four accounting firms)

中文版 “四大会计师事务所”&#xff08;Big Four accounting firms&#xff09;是全球最具影响力和规模最大的四家专业服务公司&#xff0c;它们在审计、税务、咨询和财务咨询等领域占据着主导地位。这四家公司分别是普华永道&#xff08;PwC&#xff09;、德勤&#xff08;…...

ubuntu 查看联网配置

在Ubuntu中&#xff0c;你可以使用多种命令来查看联网配置。以下是一些常用的方法和命令&#xff1a; 查看网络接口配置&#xff1a; 使用 ip 命令可以查看网络接口的配置信息&#xff0c;包括IP地址、子网掩码等。 ip addr show或者&#xff0c;你也可以使用传统的 ifconfig 命…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...