STM32-温湿度上传OneNET项目
一、项目需求
二、项目框图

三、DHT11工作原理
参考于良许嵌入式手把手教你玩转DHT11(原理+驱动) | 良许嵌入式
3.1 正常工作验证 #
上电后,「电源指示灯/POWER」红灯亮,表示上电成功,正常工作。

3.2 DHT11工作时序 #
3.2.1 整体工作时序 #
DHT11 整体工作时序为:主机发送开始信号、DHT11 响应输出、主机接收 40bit 数据(湿度数据+温度数据+校验值),结束信号(可选)。
具体过程如下:
1. 总线空闲状态为高电平,主机拉低总线等待 DHT11 响应, 主机把总线拉低必须大于 18ms,保证 DHT11 能检测到起始信号;
2. 主机发送开始信号结束后,拉高总线电平并延时等待 20-40us 后,读取 DHT11 的响应信号;
3. DHT11 接收到主机的开始信号后,等待微处理器开始信号结束,发送 80us 低电平响应信号;
4. DHT11 发送 80us 高电平准备发送数据;
5. DHT11 发送 40bit 数据(湿度数据+温度数据+校验值)。
过程 主机 DHT11 1 拉低>18ms 2 拉高20~40us 3 响应 80us 低电平 4 拉高 80us 5 发送 40bit 数据(湿度数据+温度数据+校验值)

3.2.2 起始及响应信号 #
总流程讲完介绍一下细分流程: 首先主机拉低总线至少 18ms,然后再拉高总线,延时 20~40us,此时起始信号(有时也叫复位信号)发送完毕。
DHT11 检测到复位信号后,触发一次采样,并拉低总线 80us 表示响应信号,告诉主机数据已经准备好了。
DHT11 之后拉高总线 80us,然后开始传输数据。如果检测到响应信号为高电平,则 DHT11 初始化失败,请检查线路是否连接正常。

3.2.3 读时序 #
DHT11 开始传输数据。每 1bit 数据都以 50us 低电平开始,告诉主机开始传输一位数据了。DHT11 以高电平的长短定义数据位是 0 还是 1:
当 50us 低电平过后拉高总线,高电平持续 26~28us 表示 0,高电平持续 70us 表示数据 1。
当最后 1bit 数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。
位数据0表示方式: 以 50us 低电平开始,高电平持续 26~28us 表示 0。

位数据1表示方式: 以 50us 低电平开始,高电平持续 70us 表示 1。

3.3 DHT11数据格式 #
DHT11 的 DATA 传输一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输。
数据格式为:8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位,
一共 5 字节(40bit)数据。 正常情况下,前四个字节的和刚好与校验位相等,通过这种机制可以保证数据传输的准确性。
四、项目实现
复制项目文件19-串口打印
重命名59-DHT11
新建文件dht11
dht11.c
dht11.h
打开项目工程
加载文件
书写头文件
编译
编程思路:
1、之前的模块都需要init函数,而这里的dht11反倒不需要init函数,因为dht11只有一个data的IO口。DHT11的一个data口用于输入和输出,所以需要对DHT11的IO口做一个配置,则需要:dht11_gpio_input,dht11_gpio_output两个函数。
2、接下来是DHT11的起始信号及响应信号需要:dht11_start
3、读时序:dht11_read_byte
4、将读出的数据,存储下来,用指针(地址)承接:dht11_read
5、因为是单总线协议,所以先进行一个封装
判断1位数据,当IO口电平等于高电平的时候,延时50微妙,判断当下是高电平还是低电平,如果是高电平,则传出来的数据是1,否则就是0,
while(!DHT11_DQ_IN);
delay_us(50);
if(DHT11_DQ_IN == 1)
{
temp = 1;
while(DHT11_DQ_IN);
}
else
temp = 0;
我们知道,一个字节有8位,所以这段代码要执行八次,才是一位,定义一个UINT8_T的变量,这个变量有8位,将受到的一位字节存放在这个变量的像左移一位。
for(i=0; i<8; i++){
while(!DHT11_DQ_IN);
delay_us(50);
if(DHT11_DQ_IN == 1)
{
temp = 1;
while(DHT11_DQ_IN);
}
else
temp = 0;
byte = byte << 1;
byte |= temp;
}
上面这个函数,是用来返回发送过来的一个字节,DHT11会返回5个字节,所以上述操作,要执行5次,并且第五位是校验位,前四位的和等于第五位时,才证明没有发送错数据,官方文档要求,DH11不可以一直在返回数据,需要延长2s
for(i=0; i<5; i++)
{
dht11_data[i] = dht11_read_byte();
}
if(dht11_data[0]+dht11_data[1]+dht11_data[2]+dht11_data[3] == dht11_data[4])
{
memcpy(result,dht11_data,4);//将dht11_data中四个数据复制给result
printf("湿度:%d.%dRH ,",dht11_data[0],dht11_data[1]);
printf("温度:%d.%d℃ \r\n",dht11_data[2],dht11_data[3]);
}
delay_ms(2000);
在esp8266中需要重写esp8266_send_data函数,因为以前的esp8266_send_data函数是用来模仿printf,所以需要重写函数,用来发送数据
//两个参数分别是:要发送的数据,和要发送数据的长度
void esp8266_send_data(char *data,uint16_t len)
{
//清空发送缓冲区
esp8266_rx_clear();
//发送数据函数
HAL_UART_Transmit(&esp8266_handle,(unsigned char*)data,len,100);
}
在OneNet创建产品和设备
三元组很重要:产品id,设备id,密钥

设备id的获取,将设备导入出来,就会有一个表,其中有设备id


将代码中上面部分,按自己的东西改写,
相关文章:
STM32-温湿度上传OneNET项目
一、项目需求 使用 ESP8266 连接 OneNET 云平台,并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11(原理驱动) | 良许嵌入式 3.1 正常工作验证 # 上电后ÿ…...
前端面试-JavaScript 数据类型详解
目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型(原始类型&…...
【进程 】
【进程】 目录1. ELF格式程序与进程2. 进程的组织方式3. 进程的复刻(fork)4. 进程的状态 目录 1. ELF格式程序与进程 在Linux系统里,程序文件普遍采用ELF(Executable and Linkable Format)格式。这种格式的程序文件存…...
深入HBase——数据结构与算法
引入 通过前面的文章,我们对HBase已经有了基本认识,下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇(Column Family)本质上就是一棵LSM树(Log-Structured Merge-Tree)。LSM树…...
Python爬虫实战:获取六图网漫画图
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 一、引言 Python 作为一种广泛应用于数据处理和网络爬虫领域的编程语言,拥有丰富的库和框架。其中,Scrapy 框架以其高效、灵活、可扩展等特点,成为构建爬虫程序的…...
HAProxy介绍与编译安装
目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…...
全链路优化:如何让单点登录认证接口并发性能翻倍?
背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...
在Spring Boot中如何使用Freemaker模板引擎
在 Spring Boot 中使用 FreeMarker 模板引擎可以帮助你创建动态的 Web 页面。以下是详细的步骤和示例代码,介绍如何在 Spring Boot 项目里集成和使用 FreeMarker。 1. 添加依赖 如果你使用的是 Maven 项目,需要在 pom.xml 文件中添加 FreeMarker 相关依赖。Spring Boot 提供…...
Elasticsearch7.1.1 配置密码和SSL证书
生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
个人简历html网页模板,科技感炫酷html简历模板
炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…...
在LangFlow中集成OpenAI Compatible API类型的大语言模型
一、背景与核心价值 从Dify换到这个langflow真的时各种的不适应啊。 就比如这个OpenAI Compatible API,这不应该是基本操作嘛? 算了,服了,习惯了就好了。咱闲言少叙,正片开始: LangFlow作为LangChain的可视化开发工具,其最大优势在于无需编写代码即可构建复杂的大模型…...
Qt开发中有关内存管理方面常见的问题分析与解决方案
在Qt开发中,内存管理是一个既基础又关键的一部分知识。尽管Qt提供了自动化的父子对象管理机制,但在复杂的应用场景中(如多线程、动态UI、异步操作等),我们在开发过程中,仍可能遇到内存泄漏、野指针、重复释…...
【outOfMemoryError】排查思路与解决方案
前言 不好啦❗ 天塌了❗ 系统崩了❗ 快看啊,程序outOfMemoryError了🙈 我的心里活动:“哈哈哈😀哈哈哈😀终于给我碰上了,这个问题可很少发生啊,又积累一个问题。虽然我昨天发了版本࿰…...
Python蓝桥杯刷题-小数第n位详解
题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。 本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开…...
Ubuntu服务器 /data 盘需要手动挂载的解决方案
服务器 /data 盘需要手动挂载的解决方案 如果重启服务器后,发现 /data 盘 没有自动挂载,通常是因为: /etc/fstab 配置文件 没有正确设置 自动挂载。该磁盘 没有被正确识别,需要手动挂载。文件系统错误 导致挂载失败。 下面是解…...
无法打开包括文件: “crtdbg.h”: No such file or directory
目录 无效解决措施(重装WindowsSDK) 有效解决措施 创建环境变量 添加环境变量INCLUDE 添加环境变量LIB RC无法运行 问题现象描述 复制以下文件至Error路径 无效解决措施(重装WindowsSDK) 参考文献:94176676/227706449-a5222d7d-d8d2-4a19-addb-8f546e69786f…...
番茄工作法html实现
对比了deepseek-r1-online和本地部署的14b的版本,输出的输出的html页面。 在线满血版的功能比较强大,可以一次完成所有要求。14b版本的功能有一些欠缺,但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
多源 BFS 是一种解决 边权为 1 的多源最短路问题 的高效算法。其核心思想是将所有源点视为一个“超级源点”,通过一次 BFS 遍历即可计算所有节点到最近源点的最短距离。以下从原理、实现和代码示例三个方面深入讲解: 目录 一、原理分析 1. 单源 BFS vs…...
使用IDEA提交SpringBoot项目到Gitee上
登录Gitee并新建仓库 创建本地仓库 提交本地代码到本地仓库 提交本地代码到远程仓库...
我们来学人工智能 -- DeepSeek客户端
DeepSeek客户端 题记使用后记系列文章 题记 我选择了 Cherry Studio是国内产品由CherryHQ团队开源是一个平台在这里,有豆包、kimi、通义千问的入口当然,最主要是作为大模型的UI正如标题,这里,作为DeepSeep的客户端 使用 下载本…...
结构体进阶
文章目录全局/局部变量重命名方式初始化结构体类型结构体内存对齐位段例如:小端存储枚举联合全局/局部变量 重命名方式 初始化 结构体类型 结构体内存对齐 位段 位段(Bit-Field)是 C 语言结构体里的一种特殊用法,它允许你按 “位…...
名画检测数据集412张VOC+YOLO格式
名画检测数据集412张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):412 标注数量(xml文件个数):412 标注数量(txt文…...
保姆级教程:用VSCode+PHPStudy在Windows上从零搭建NoneBot QQ机器人(含go-cqhttp配置)
从零搭建QQ聊天机器人:Windows下的NoneBot2实战指南 引言 在数字化社交日益普及的今天,智能聊天机器人已经成为许多用户日常互动的一部分。对于技术爱好者而言,搭建一个属于自己的QQ机器人不仅能满足个性化需求,更是一次宝贵的学…...
Qwen3.5-4B-Claude-Opus应用场景:高校编程课程助教——自动批改思路点评
Qwen3.5-4B-Claude-Opus应用场景:高校编程课程助教——自动批改思路点评 1. 高校编程教学的痛点与机遇 在高校计算机专业的编程课程教学中,作业批改一直是让教师头疼的问题。一个50人的班级,每周布置3-5道编程题,教师需要&#…...
汽车行业云端Android系统模块开发深度实践与面试指南
引言 随着智能汽车技术的飞速发展,Android系统在车载云端模块中的应用日益广泛。作为Android研发主任工程师,核心职责是确保系统的高效性、稳定性和可扩展性。本文将从需求分析开始,逐步深入架构设计、开发实践、性能优化等关键环节,结合Java和Kotlin语言特性,分享实战经…...
告别print调试:Python logging模块的实战应用与最佳实践
1. 为什么我们需要告别print调试? 记得刚开始学Python的时候,我最喜欢用的调试方法就是print。每次遇到问题,第一反应就是在代码里插入一堆print语句,看看变量值对不对,程序执行到哪一步了。这种方法在小项目或者快速验…...
别再死记硬背了!用‘预约医生’的例子,5分钟搞懂数据流图里的‘黑洞’、‘白洞’和‘灰洞’
预约医生场景下的数据流图三洞原理:用生活化案例破解系统分析难题 每次打开医院预约系统,看着屏幕上跳转的医生排班表和闪烁的确认按钮,你可能不会想到这背后隐藏着一套精密的数据流动逻辑。就像水管中的水流可能遇到堵塞、泄漏或污染&#x…...
电力电子MATLAB/Simulink模块化多电平变换器仿真研究:MMC控制策略及优化波形分析...
电力电子matlab,simulink仿真 有模块化多电平变换器方向,MMC 载波移相脉冲宽度调制,电容电压平衡算法,环流抑制,最近电平逼近调制,电容电压排序算法,模型预测控制等。 图3,4,5分别为…...
从仿真到实战:手把手教你用Matlab+Robotics Toolbox搭建视觉伺服控制闭环
从仿真到实战:手把手教你用MatlabRobotics Toolbox搭建视觉伺服控制闭环 视觉伺服控制是机器人领域的重要研究方向,它通过实时处理视觉反馈信息来调整机器人运动,实现精确的目标跟踪或定位。不同于传统的开环控制,视觉伺服将视觉…...
LM系列权重测试台:Z-Image专用工具,支持实时动态切换、自动权重清洗注入、单卡显存极致优化,一键测试不同训练步数权重的生成效果
LM系列权重测试台:Z-Image专用工具使用指南 1. 工具概述 LM系列权重测试台是基于阿里云通义Z-Image底座开发的Transformer权重可视化测试工具,专为LM系列自定义权重设计。该工具解决了权重切换繁琐、注入不兼容、单卡显存不足等核心痛点,通…...
