当前位置: 首页 > 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 命…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...