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

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器

  • 0. 前言
  • 1. DHT11驱动原理
  • 2. 完整代码
  • 3. 演示效果
  • 4. 其他FreeRtos文章

0. 前言

开发环境:ESP-IDF 4.3
操作系统:Windows10 专业版
开发板:自制的ESP32-WROOM-32E
准备一个DHT11温湿度传感器

DHT11是比较经典的入门级温湿度传感器,这节我们学习使用它来测得周边环境的温湿度数据。

1. DHT11驱动原理

在这里插入图片描述
在这里插入图片描述
其控制时序如下:

  1. 主机发送起始信号:主机将总线拉低至少18ms,然后拉高20-40us,等待DHT11响应。
  2. DHT11响应信号:DHT11在收到起始信号后,会将总线拉低80us,然后拉高80us,表示已经准备好发送数据。
  3. DHT11发送数据:DHT11会依次发送40位数据,每一位数据的时间长度为50us,高电平表示1,低电平表示0。
  4. 主机接收数据:主机在接收到每一位数据后,会等待50us,然后再接收下一位数据。
  5. 数据校验:DHT11发送完40位数据后,会再次将总线拉低50us,然后拉高80us,表示数据已经发送完毕。主机接收到数据后,需要进行校验,确保数据的正确性。
  6. 通信结束:主机在接收到数据后,需要将总线拉高至少40us,表示通信结束。

需要注意的是,DHT11的控制时序非常严格,如果时序不正确,可能会导致数据传输失败。因此,在使用DHT11时,需要仔细按照时序进行控制。

首先,我们将引脚设置为输出模式,并将其拉低20毫秒,然后将其拉高,最后将其设置为输入模式。

然后,我们等待DHT11的响应信号,并开始读取数据。

我们使用FreeRTOS的计时器来计算每个位的持续时间,并将其转换为0或1的位。

2. 完整代码

#include <string.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <nvs_flash.h>
#include <driver/rmt.h>
#include <soc/rmt_reg.h>
#include "driver/gpio.h" 
#include <esp_log.h>#define DHT11_GPIO	26		// DHT11引脚定义
const static char *TAG = "DHT11_Demo";// 温度是10倍,/10有1位小数
int temp_x10 = 123;
int humidity = 60;
const int channel = 0;uint8_t DHT11_PIN = -1;
// 将RMT读取到的脉冲数据处理为温度和湿度
static int parse_items(rmt_item32_t *item, int item_num, int *humidity, int *temp_x10);// DHT11 初始化
void DHT11_Init(uint8_t dht11_pin)
{DHT11_PIN = dht11_pin;const int RMT_CLK_DIV = 80;										// RMT计数器时钟分频器const int RMT_TICK_10_US = (80000000 / RMT_CLK_DIV / 100000);	// RMT计数器10us.(时钟源是APB时钟)const int rmt_item32_tIMEOUT_US = 1000;							// RMT接收超时usrmt_config_t rmt_rx = {.gpio_num = dht11_pin,.channel = channel,.clk_div = RMT_CLK_DIV,.mem_block_num = 1,.rmt_mode = RMT_MODE_RX,					// 接收模式.rx_config.filter_en = false,.rx_config.filter_ticks_thresh = 100,.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US),};rmt_config(&rmt_rx);rmt_driver_install(rmt_rx.channel, 1000, 0);	// 安装驱动//rmt_driver_uninstall(rmt_rx.channel)			// 卸载驱动
}// 将RMT读取到的脉冲数据处理为温度和湿度
static int parse_items(rmt_item32_t *item, int item_num, int *humidity, int *temp_x10)
{int i = 0;unsigned rh = 0, temp = 0, checksum = 0;if (item_num < 42){					// 检查是否有足够的脉冲数ESP_LOGI(TAG, "item_num < 42  %d",item_num);return 0;}item++;								// 跳过开始信号脉冲for (i = 0; i < 16; i++, item++){	// 提取湿度数据rh = (rh << 1) + (item->duration1 < 35 ? 0 : 1);}for (i = 0; i < 16; i++, item++){	// 提取温度数据temp = (temp << 1) + (item->duration1 < 35 ? 0 : 1);}for (i = 0; i < 8; i++, item++){	// 提取校验数据checksum = (checksum << 1) + (item->duration1 < 35 ? 0 : 1);}// 检查校验if ((((temp >> 8) + temp + (rh >> 8) + rh) & 0xFF) != checksum){ESP_LOGI(TAG, "Checksum failure %4X %4X %2X\n", temp, rh, checksum);return 0;}// 返回数据*humidity = rh >> 8;*temp_x10 = (temp >> 8) * 10 + (temp & 0xFF);return 1;
}// 使用RMT接收DHT11数据
int DHT11_StartGet(int *temp_x10, int *humidity)
{RingbufHandle_t rb = NULL;size_t rx_size = 0;rmt_item32_t *item;int rtn = 0;//获得RMT RX环形缓冲区句柄,并处理RX数据rmt_get_ringbuf_handle(channel, &rb);if (!rb){return 0;}//发送20ms脉冲启动DHT11单总线gpio_set_level(DHT11_PIN, 1);gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT);ets_delay_us(1000);gpio_set_level(DHT11_PIN, 0);ets_delay_us(20000);//将rmt_rx_start和rmt_rx_stop放入缓存rmt_rx_start(channel, 1);rmt_rx_stop(channel);//信号线设置为输入准备接收数据gpio_set_level(DHT11_PIN, 1);gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT);//这次启动RMT接收器以获取数据rmt_rx_start(channel, 1);//从环形缓冲区中取出数据item = (rmt_item32_t *)xRingbufferReceive(rb, &rx_size, 2);if (item != NULL){int n;n = rx_size / 4 - 0;// 解析来自ringbuffer的数据值.rtn = parse_items(item, n, humidity, temp_x10);// 解析数据后,将空格返回到ringbuffer.vRingbufferReturnItem(rb, (void *)item);}//停止RMT接收rmt_rx_stop(channel);return rtn;
}// 温度 湿度变量
int temp = 0,hum = 0;// 主函数
void app_main(void)
{ESP_ERROR_CHECK(nvs_flash_init());vTaskDelay(100 / portTICK_PERIOD_MS);ESP_LOGI(TAG, "[APP] APP Is Start!~\r\n");ESP_LOGI(TAG, "[APP] IDF Version is %d.%d.%d",ESP_IDF_VERSION_MAJOR,ESP_IDF_VERSION_MINOR,ESP_IDF_VERSION_PATCH);ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());DHT11_Init(DHT11_GPIO);while (1){if (DHT11_StartGet(&temp, &hum)){ESP_LOGI(TAG, "[%lld] temp->%i.%i C     hum->%i%%", esp_timer_get_time(), temp / 10, temp % 10, hum);}vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

3. 演示效果

如图所示,这是我把它放在了我的电脑排风口附近测得的温度:
在这里插入图片描述

4. 其他FreeRtos文章

基于Freertos的ESP-IDF开发——0.Windows下espidf的环境搭建
基于Freertos的ESP-IDF开发——1.HelloWorld
基于Freertos的ESP-IDF开发——2.点亮一颗LED
基于Freertos的ESP-IDF开发——3.使用任务(上)
基于Freertos的ESP-IDF开发——3.使用任务(中)
基于Freertos的ESP-IDF开发——3.使用任务(下)
基于Freertos的ESP-IDF开发——4.使用任务的方式来点亮LED灯
基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别]

相关文章:

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器 0. 前言1. DHT11驱动原理2. 完整代码3. 演示效果4. 其他FreeRtos文章 0. 前言 开发环境&#xff1a;ESP-IDF 4.3 操作系统&#xff1a;Windows10 专业版 开发板&#xff1a;自制的ESP32-WROOM-32E 准备一个DHT11温湿度传…...

C++——模板初阶

文章目录 一.泛型编程二.函数模板1.函数模板的概念2.函数模板的格式3.函数模板的原理4.函数模板的实例化&#xff08;1&#xff09;隐式实例化&#xff08;2&#xff09;显式实例化 5.模板参数的匹配原 三.类模板1.类模板的定义格式2.类模板的实例化 前言&#xff1a; 本章我们…...

【TOOLS: Linux与windows及linux与linux之间文件传输常用方法及命令】

文章目录 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法1.1.2 SCP 文件传输方法1.1.3 FTP 文件传输方法 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法 1&#xff09;设置 virtualbox 中的共享文件夹&#xff0c;用户可以在windows某个盘下创建自己的共享文件…...

【博览群书】《实战大数据》——属于我的第一本大数据图书

文章目录 前言简介目录其他 前言 Hello家人们&#xff0c;博主前不久参加了CSDN图书馆和机械工业出版社联合举办的图书类活动&#xff0c;很荣幸在活动中获得了属于自己的第一本大数据图书&#xff0c;《实战大数据—— 分布式大数据分析处理系统开发与应用》。作为大数据专业…...

【计算机组成原理】实验二

文章目录 实验二 运算器实验一、实验目的二、实验原理三、运算器功能编码四、实验内容任务一 算术运算任务二 逻辑运算任务三 移位运算 实验二 运算器实验 一、实验目的 完成算术、逻辑、移位运算实验&#xff0c;熟悉ALU运算类型的控制位运用。实验仪器&#xff1a;JTHS-A …...

hive数据库hql基础操作02

1.内部表和外部表 默认情况下创建的表就是内部表&#xff0c;Hive拥有该表的结构和文件。换句话说&#xff0c;Hive完全管理表&#xff08;元数据和数据&#xff09;的生命周期&#xff0c;类似于RDBMS中的表。当你删除内部表时&#xff0c;它会删除数据以及表的元数据。可以使…...

门电路OD门

漏极开路输出的门电路&#xff08;OD门&#xff09; 为了满足输出电平的变换&#xff0c;输出大负载电流&#xff0c;以及实现“线与”功能&#xff0c;将CMOS门电路的输出级做成漏极开路的形式&#xff0c;称为漏极开路输出的门电路&#xff0c;简称OD&#xff08;Open&#x…...

没有域名,一个服务器Nginx怎么部署多个前端项目

因为没有域名&#xff0c;所以用路径来作区分&#xff0c; 主项目&#xff1a;直接根路由访问该项目&#xff0c;与正常配置无任何差别从项目&#xff1a;此处设置/new路径&#xff0c;为从项目&#xff0c;所有从项目访问路径均要加上/new ①修改Nginx配置文件 Nginx 配置文…...

城市内涝的原因和解决措施,内涝监测预警助力城市防涝度汛

城市内涝是城市化进程中最遇到的自然灾害&#xff0c;城市内涝不仅会对市民生活造成困扰&#xff0c;也会对城市基础设施和经济发展产生不利影响。因此&#xff0c;及时监测城市内涝现象&#xff0c;对于城市管理和城市安全具有重要意义。本文将深入探讨城市内涝的原因以及针对…...

8年测试总结,性能测试问题大全,这些问题你应该认清的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 响应时间VS吞吐量…...

RabbitMQ集群安装

RabbitMQ集群安装 1.前言 OS: CentOS Linux release 7.9.2009 (Core) 机器: IPnodecpu内存存储10.106.1.241max-rabbitmg-018 核16 G100 G10.106.1.242max-rabbitmg-028 核16 G100 G10.106.1.243max-rabbitmg-038 核16 G100 G 因为操作系统版本是 centos7&#xff0c;所以…...

面试:link和@import的区别

1&#xff1a;link是XHTML标签&#xff0c;除了加载CSS外&#xff0c;还可以加载RSS&#xff1b;import只能加载CSS 2:link引入CSS时&#xff0c;在页面载入时同时加载&#xff1b;import需要页面完全载入后加载&#xff0c;可能会出行闪屏 3:link是XHTML标签&#xff0c;无兼容…...

图片隐写(一)

文件隐藏 binwalk binwalk -e filename foremost foremost filename steghide & stegseek Install sudo apt-get install steghidestegseek Use steghide extract -sf filename -p passwordtime stegseek secret.file aaa.txt dd 文本隐藏 二进制文件末尾 or 文…...

Vivado 下 IP核 之ROM 读写

目录 Vivado 下 IP核 之ROM 读写 1、实验简介 2、ROM IP 核简介 3、ROM IP 核配置 3.1、创建 ROM 初始化文件 3.2、单端口 ROM 的配置 3.3、双端口 ROM 的配置 3.4、ROM IP 核的调用 &#xff08;1&#xff09;ROM 顶层模块代码 &#xff08;2&#xff09;ROM IP 核仿…...

朗诵素材-《诵四季诗韵,咏师恩师德》

女&#xff1a;中华五千年的悠久历史&#xff0c;孕育了底蕴深厚的民族文化。 男&#xff1a;华夏源远流长的经典诗文&#xff0c; 女&#xff1a;是文化艺苑中经久不衰的瑰宝。 男&#xff1a;在那些脍炙人口的诗句里&#xff0c;凝聚着华光熠熠的民族精魂。 女&#xff1…...

CHB-麻省理工学院头皮脑电图数据库

数据库介绍 该数据库在波士顿儿童医院收集&#xff0c;包括患有顽固性癫痫发作的儿科受试者的脑电图记录。受试者在停用抗癫痫药物后被监测长达几天&#xff0c;以表征他们的癫痫发作并评估他们手术干预的候选资格。 数据库链接&#xff1a;https://physionet.org/content/chb…...

传输层协议

目录 传输层 端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof UDP协议UDP协议端格式​编辑 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 TCP协议 TCP协议段格式 确认应答(ACK)机制 超时重传机制 连…...

公司新招了个字节拿36K的人,让我见识到了什么才是测试扛把子......

5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉分…...

pytorch rpc如何实现分物理机器的model parallel

因为业务需要&#xff0c;最近接到一项任务&#xff0c;是如何利用pytorch实现model parallel以及distributed training。搜罗了网上很多资料&#xff0c;以及阅读了pytorch官方的教程&#xff0c;都没有可参考的案例。讲的比较多的是data parallel&#xff0c;关于model paral…...

APP服务端架构的演变

大家好&#xff0c;我是易安&#xff01; 早期2013年的时候&#xff0c;随着智能设备的普及和移动互联网的发展&#xff0c;移动端逐渐成为用户的新入口&#xff0c;各个电商平台都开始聚焦移动端App&#xff0c;如今经历了10年的发展&#xff0c;很多电商APP早已经没入历史的洪…...

基于声卡与电流互感器的安全交流功率测量系统设计与实践

1. 项目概述&#xff1a;用声卡安全测量交流功率我一直对各种测量技术抱有浓厚的兴趣&#xff0c;毕竟“测量即认知”这句老话在今天依然适用。对于电力消耗和产出&#xff0c;没有什么比直接测量更能说明问题了。交流功率的测量&#xff0c;核心在于同时获取电压和电流的瞬时值…...

Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路

Python UiAutomation实战&#xff1a;打通数据采集全链路的智能解决方案 在数据驱动的商业环境中&#xff0c;企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析&#xff0c;销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...

告别混乱绑定!在UE5 GAS中优雅管理技能输入(基于GameplayTag)

告别混乱绑定&#xff01;在UE5 GAS中优雅管理技能输入&#xff08;基于GameplayTag&#xff09;当你的UE5 RPG项目发展到中期&#xff0c;技能数量从十几个膨胀到几十个时&#xff0c;最痛苦的莫过于发现InputAction绑定已经变成一团乱麻。每次新增技能都要修改输入绑定逻辑&a…...

多模型聚合平台如何助力网站AIB测试与选型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 多模型聚合平台如何助力网站AIB测试与选型 对于网站产品经理而言&#xff0c;首页文案的生成质量直接影响用户的第一印象和转化率。…...

AutoWall终极指南:如何在Windows上轻松设置炫酷动态壁纸

AutoWall终极指南&#xff1a;如何在Windows上轻松设置炫酷动态壁纸 【免费下载链接】AutoWall &#x1f30c; Live wallpapers on Windows 7/8/10/11 using open-source wallpaper engine 项目地址: https://gitcode.com/gh_mirrors/au/AutoWall 厌倦了千篇一律的静态桌…...

告别RaiDrive广告!用开源rclone+Alist,免费把阿里云盘/百度网盘变成电脑本地硬盘

开源方案实战&#xff1a;用rcloneAlist打造无广告的云盘本地化体验 每次打开RaiDrive时弹出的广告窗口是否让您感到困扰&#xff1f;商业软件的收费模式是否让您犹豫不决&#xff1f;今天&#xff0c;我们将彻底解决这些问题。通过开源工具Alist和rclone的组合&#xff0c;您不…...

清华大学学位论文LaTeX模板:30分钟快速排版终极指南

清华大学学位论文LaTeX模板&#xff1a;30分钟快速排版终极指南 【免费下载链接】thuthesis LaTeX Thesis Template for Tsinghua University 项目地址: https://gitcode.com/gh_mirrors/th/thuthesis 还在为论文格式烦恼吗&#xff1f;清华大学官方LaTeX模板thuthesis让…...

DeepSeek代码审查配置避坑清单:12个被99%团队忽略的关键参数(含生产环境校验脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek代码审查功能概览 DeepSeek 提供的代码审查&#xff08;Code Review&#xff09;能力基于其大语言模型对编程语义、安全规范与工程实践的深度理解&#xff0c;支持多语言静态分析、漏洞识别、可…...

如何用YOLOv5实现FPS游戏智能瞄准:完整实战指南

如何用YOLOv5实现FPS游戏智能瞄准&#xff1a;完整实战指南 【免费下载链接】FPSAutomaticAiming 基于yolov5的FPS游戏AI。 项目地址: https://gitcode.com/gh_mirrors/fp/FPSAutomaticAiming 在竞技射击游戏中&#xff0c;精准瞄准是决定胜负的关键因素&#xff0c;而F…...

大学生零成本副业!SRC 漏洞挖掘入门教程,玩法收益一次性讲清

大学生零成本副业&#xff01;SRC 漏洞挖掘入门教程&#xff0c;玩法收益一次性讲清 摘要&#xff1a;对大学生来说&#xff0c;找副业最核心的需求是“时间灵活、门槛低、能兼顾学习、有长期成长”&#xff0c;而SRC漏洞挖掘正是完美契合这些需求的选择——无需编程基础、无需…...