DHT22温湿度传感器(Espressif驱动)

  • DHT22

    • 温度范围:-40-80°C
    • 温度精度:±0.5°C
    • 湿度范围:0-100%RH
    • 湿度精度:±2-5%RH
    • 分辨率:0.1°C / 0.1%RH
    • 
      #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE#include <stdio.h>
      #include <freertos/FreeRTOS.h>
      #include <freertos/task.h>
      #include "esp_system.h"
      #include "freertos/event_groups.h"#include "esp_event.h"
      #include "nvs_flash.h"#include "esp_log.h"
      #include "driver/gpio.h"#include "DHT.h"// == global defines =============================================static const char *TAG = "DHT";int DHTgpio = GPIO_NUM_4; // my default DHT pin = 4
      float humidity = 0.;
      float temperature = 0.;//串口打印的主函数(默认的波特率为115200)
      void DHT_task(void *pvParameter)
      {setDHTgpio(GPIO_NUM_4);ESP_LOGI(TAG, "Starting DHT Task\n\n");while (1){ESP_LOGI(TAG, "=== Reading DHT ===\n");int ret = readDHT();errorHandler(ret);ESP_LOGI(TAG, "Hum: %.1f Tmp: %.1f\n", getHumidity(), getTemperature());// -- wait at least 2 sec before reading again ------------// The interval of whole process must be beyond 2 seconds !!vTaskDelay(2000 / portTICK_PERIOD_MS);}
      }void app_main()
      {// Initialize NVSesp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES){ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);esp_log_level_set("*", ESP_LOG_INFO);esp_rom_gpio_pad_select_gpio(GPIO_NUM_4);xTaskCreate(&DHT_task, "DHT_task", 2048, NULL, 5, NULL);
      }// == set the DHT used pin=========================================void setDHTgpio(int gpio)
      {DHTgpio = gpio;
      }// == get temp & hum =============================================float getHumidity() { return humidity; }
      float getTemperature() { return temperature; }// == error handler ===============================================void errorHandler(int response)
      {switch (response){case DHT_TIMEOUT_ERROR:ESP_LOGE(TAG, "Sensor Timeout\n");break;case DHT_CHECKSUM_ERROR:ESP_LOGE(TAG, "CheckSum error\n");break;case DHT_OK:break;default:ESP_LOGE(TAG, "Unknown error\n");}
      }/*-------------------------------------------------------------------------------
      ;
      ;	get next state
      ;
      ;	I don't like this logic. It needs some interrupt blocking / priority
      ;	to ensure it runs in realtime.
      ;
      ;--------------------------------------------------------------------------------*/int getSignalLevel(int usTimeOut, bool state)
      {int uSec = 0;while (gpio_get_level(DHTgpio) == state){if (uSec > usTimeOut)return -1;++uSec;esp_rom_delay_us(1); // uSec delay}return uSec;
      }#define MAXdhtData 5 // to complete 40 = 5*8 Bitsint readDHT()
      {int uSec = 0;uint8_t dhtData[MAXdhtData];uint8_t byteInx = 0;uint8_t bitInx = 7;for (int k = 0; k < MAXdhtData; k++)dhtData[k] = 0;// == Send start signal to DHT sensor ===========gpio_set_direction(DHTgpio, GPIO_MODE_OUTPUT);// pull down for 3 ms for a smooth and nice wake upgpio_set_level(DHTgpio, 0);esp_rom_delay_us(3000);// pull up for 25 us for a gentile asking for datagpio_set_level(DHTgpio, 1);esp_rom_delay_us(25);gpio_set_direction(DHTgpio, GPIO_MODE_INPUT); // change to input mode// == DHT will keep the line low for 80 us and then high for 80us ====uSec = getSignalLevel(85, 0);// ESP_LOGI(TAG, "Response = %d", uSec);if (uSec < 0)return DHT_TIMEOUT_ERROR;// -- 80us up ------------------------uSec = getSignalLevel(85, 1);// ESP_LOGI(TAG, "Response = %d", uSec);if (uSec < 0)return DHT_TIMEOUT_ERROR;// == No errors, read the 40 data bits ================for (int k = 0; k < 40; k++){// -- starts new data transmission with >50us low signaluSec = getSignalLevel(56, 0);if (uSec < 0)return DHT_TIMEOUT_ERROR;// -- check to see if after >70us rx data is a 0 or a 1uSec = getSignalLevel(75, 1);if (uSec < 0)return DHT_TIMEOUT_ERROR;// add the current read to the output data// since all dhtData array where set to 0 at the start,// only look for "1" (>28us us)if (uSec > 40){dhtData[byteInx] |= (1 << bitInx);}// index to next byteif (bitInx == 0){bitInx = 7;++byteInx;}elsebitInx--;}// == get humidity from Data[0] and Data[1] ==========================humidity = dhtData[0];humidity *= 0x100; // >> 8humidity += dhtData[1];humidity /= 10; // get the decimal// == get temp from Data[2] and Data[3]temperature = dhtData[2] & 0x7F;temperature *= 0x100; // >> 8temperature += dhtData[3];temperature /= 10;if (dhtData[2] & 0x80) // negative temp, brrr it's freezingtemperature *= -1;// == verify if checksum is ok ===========================================// Checksum is the sum of Data 8 bits masked out 0xFFif (dhtData[4] == ((dhtData[0] + dhtData[1] + dhtData[2] + dhtData[3]) & 0xFF))return DHT_OK;elsereturn DHT_CHECKSUM_ERROR;
      }
      

      DHT.h//对应需要添加头文件

    • /* DHT22 temperature sensor driver相关宏定义和函数的说明
      */#ifndef DHT_H_
      #define DHT_H_#define DHT_OK 0
      #define DHT_CHECKSUM_ERROR -1
      #define DHT_TIMEOUT_ERROR -2// == function prototypes =======================================void setDHTgpio(int gpio);
      void errorHandler(int response);
      int readDHT();
      float getHumidity();
      float getTemperature();
      int getSignalLevel(int usTimeOut, bool state);#endif

      运行结果显示:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——排序(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

MySQL主从复制

主节点 server id 1. 更改server id 指定二进制日志文件目录 [rootmaster ~]#vim /etc/my.cnf.d/mariadb-server.cnf [mysqld] server-id8 log-bin 2. 新建目录并赋予权限 mkdir -p /data/mysql/logbin/chowm -R mysql.mysql /data/mysql/ 3. 重新启动 systemctl enabl…

酥皮点心,味蕾上的享受

甘肃酥皮点心承载着悠久的历史与深厚的文化底蕴。它起源于古老的丝绸之路&#xff0c;在岁月的长河中&#xff0c;经过一代又一代甘肃人的传承与创新&#xff0c;成为了如今令人陶醉的美食。每一块酥皮点心都仿佛在诉说着过去的故事&#xff0c;见证着甘肃大地的变迁与发展。食…

SpringCloud核心组件(三)

文章目录 Nacos 注册中心1. 简介功能1.服务发现和服务健康监测2.动态配置服务3. 动态 DNS 服务4. 服务及其元数据管理 优势设计理念易于使用面向标准高可用方便扩展 部署模式单机模式集群模式 Nacos 生态&#xff1a; 2. 安装 Nacos第一步&#xff1a;拉取镜像第二步&#xff1…

反射、枚举以及lambda表达式

反射、枚举以及lambda表达式 反射定义用途反射基本信息反射相关的类Class类(反射机制的起源)Class类中的相关方法 反射示例获得Class对象的三种方式反射的使用 反射优点和缺点重点总结 枚举的使用背景及定义使用枚举优点缺点枚举和反射总结单例模式 Lambda表达式背景Lambda表达…

Java学习Day60:回家!(ElasticStatic)

1.what is ElasticStatic The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elaticsearch&#xff0c;简称…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…

恶意PDF文档分析记录

0x1 PDF是什么 PDF&#xff08;便携式文件格式&#xff0c;Portable Document Format&#xff09;是由Adobe Systems在1993年用於文件交换所发展出的文件格式。 因为PDF的文件格式性质广泛用于商业办公&#xff0c;引起众多攻击者对其开展技术研究&#xff0c;在一些APT&#…

SpringBoot集成itext导出PDF

添加依赖 <!-- PDF导出 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId>&l…

不想后悔,混动车这样买

文 | AUTO芯球 作者 | 雷慢 不买一辆混动车&#xff0c; 你永远不知道自己有多抠&#xff01; 我有个跑滴滴的小伙伴&#xff0c; 他说近10年来最后悔的事&#xff0c; 就是没买个纯电续航长点的混动车&#xff0c; 怎么回事呢&#xff0c; 这个小伙伴今年买了辆纯电续航…

第一个C语言程序,带领我们进入C语言的大门!

第一个C语言程序&#xff0c;带领我们进入C语言的大门&#xff01; 我们有两种方式从计算机获得信息&#xff1a;一是看屏幕上的文字、图片、视频等&#xff0c;二是听从喇叭发出来的声音。让喇叭发出声音目前还比较麻烦&#xff0c;我们先来看看如何在屏幕上显示一些文字吧。p…

大模型到底是什么?小白也能看懂的科普贴,让你从大模型入门到大模型精通

&#xff08;图源网络&#xff09; 从去年到今年&#xff0c;大模型、chatGPT等概念和技术越来越火&#xff0c;但是像笔者一样的技术小白一直对大模型是一种似懂非懂的状态。鉴于最近在做基于大模型和Agent的上层AI应用&#xff0c;如若不了解底层概念&#xff0c;始终还是会…

qt QStandardPaths 详解

1、概述 QStandardPaths是Qt框架中的一个类&#xff0c;它提供了一种跨平台的方式来访问标准的位置&#xff0c;如应用程序的数据目录、配置目录、缓存目录、临时文件目录等。这些位置通常是用户特定的&#xff0c;并且遵循操作系统的标准和惯例。通过使用QStandardPaths&…

对node工程进行压力测试与性能分析

在系统上线前&#xff0c;为了看下系统能承受多大的并发和并发下的负载情况&#xff0c;进行了一轮压测。在压测过程中&#xff0c;发现服务器的cpu飚的的非常高&#xff0c;而tps&#xff0c;接口耗时、服务可用等都是正常的&#xff0c;卧槽&#xff0c;这就奇了怪了&#xf…

昆明华厦眼科医院在大观小学开展近视科普教育讲座

为响应全社会对青少年近视防控的号召&#xff0c;昆明华厦眼科医院组织了一场近视科普教育讲座&#xff0c;活动走进大观小学&#xff0c;旨在通过专业的眼科知识普及&#xff0c;提升小学生们对眼健康的认知&#xff0c;培养他们爱眼护眼的意识。讲座结束后还特地为教师群体进…

MPLS基本原理

Multiprotocol Label Switching 多标签交换 前言 MPLS位于TCP/IP协议栈中的链路层和网络层之间,用于向IP层提供连接服务,同时又从链路层达到服务.MPLS以标签交换代替IP转发. MPLS并不是一种业务或者应用,它实际上是一种隧道技术.这种技术不仅支持多种高层协议与业务,而且在一…

《MarsCode:编程领域的智能新势力》

《MarsCode&#xff1a;编程领域的智能新势力》 一、MarsCode 的诞生与发展&#xff08;一&#xff09;逐步崛起的历程&#xff08;二&#xff09;与各方的合作与影响 二、MarsCode 的独特魅力&#xff08;一&#xff09;强大的功能特点&#xff08;二&#xff09;多语言支持与…

PyInstaller未包含预编译引导程序

1 现象 在使用 PyInstaller 打包 Python 应用时&#xff0c;遇到了一个错误&#xff0c;错误信息如下&#xff1a; Fatal error: PyInstaller does not include a pre-compiled bootloader for your platform. For more details and instructions how to build the bootloade…

华为HCIP-openEuler考试内容大纲:备考必看!

华为HCIP-openEuler认证考试作为ICT领域的一项重要技术认证&#xff0c;已经成为越来越多IT从业者追求的目标。无论你是想提升自己的技术能力&#xff0c;还是为了未来的职业发展&#xff0c;HCIP-openEuler都是一个极具价值的认证。那么&#xff0c;如何高效备考&#xff0c;顺…