ESP系列入门教程(二)——之简单驱动温湿度传感器DHT11【附 ESP32 / ESP8266 通用代码】

ESP系列入门教程<二>

    • 概要
    • 技术名词简介
      • ● ESP系列简介
    • 硬件连接实现
    • 代码实现
      • ●Demo:驱动DHT11温湿度传感器
      • ●编译注意事项:添加DHT库

概要

最近在跟着几个大佬的教学视频做项目。陆续会更新记录一些要点,便于后期总结笔记的时候进行引用。
也可以帮助有心跟着一起复刻的宝子们,更好地捋清思路。

【本系列教程 - 总目标】:
使用ESP系列板卡,通过MQTT进行数据通信,达到远程控制多个传感器的效果。

ESP芯片官方技术文档链接
https://www.espressif.com.cn/zh-hans/support/documents/technical-documents

◆配置说明
硬件板卡:ESP系列板卡 <本系列教程以ESP32ESP8266为例>

硬件元件:

  • DHT11温湿度传感器
  • 一颗LED灯
  • 一个5v驱动的继电器
  • 一个按键开关
  • 杜邦线若干

◆需求概述

【本篇章目标】
在 ESP系列入门教程(一) 中,我们已经完成了ESP系列驱动继电器,通过按键达到控制LED亮灭的效果
本章,我们将基于之前的代码,继续进行开发。
进一步驱动控制DHT11温湿度传感器,同时附上代码(ESP32和ESP8266通用代码)

技术名词简介

● ESP系列简介

ESP芯片是一种由乐鑫科技(Espressif Systems)开发的低功耗无线通信芯片。

ESP芯片系列包括ESP8266和ESP32两个主要型号。这些芯片具有强大的处理能力和丰富的外设接口,适用于物联网(IoT)应用和嵌入式系统开发。

◆ESP8266
是一款高度集成的Wi-Fi芯片,具有低功耗和低成本的特点。它支持TCP/IP协议栈,可以通过Wi-Fi连接到互联网,并与其他设备进行通信。ESP8266可以作为主控芯片,与传感器、执行器等设备进行通信,实现智能家居、智能农业、智能工业等应用。

◆ESP32
是ESP8266的升级版本,除了具备Wi-Fi功能外,还增加了蓝牙(Bluetooth)功能。ESP32具有更高的处理能力和更多的外设接口,支持更复杂的应用场景。它可以作为Wi-Fi和蓝牙网关,连接多个设备并实现数据传输和控制。

ESP芯片具有开放的开发环境和丰富的开发资源,开发者可以使用Arduino IDE、MicroPython等开发工具进行编程。此外,乐鑫科技还提供了丰富的文档和示例代码,方便开发者快速上手和开发应用。

硬件连接实现

ESP8266和ESP32引脚图有很多部分不一样,详情请参考前面写好的:ESP系列入门教程(一)
https://blog.csdn.net/qq_38141255/article/details/135597139?spm=1001.2014.3001.5501
里面有详细的引脚图,有需要请对照配置。

以ESP32图示为例:
图来自B站大佬:莽小石
在这里插入图片描述

代码实现

●Demo:驱动DHT11温湿度传感器

#include <Arduino.h>
#include <DHT.h>

// 定义按键和继电器的引脚
const int buttonPin = 2;    // 按键连接到引脚2
const int relayPin  = 4;    // 继电器连接到引脚4

int buttonState = 0;       // 保存当前按键状态(低电平或高电平)
int lastButtonState = 0;   // 保存上一次的按键状态
unsigned long lastDebounceTime  = 0;     // 上次去抖动的时间
unsigned long debounceDelay     = 120;   // 去抖动延迟时间,单位:毫秒


// DHT11传感器连接到引脚5
#define DHTPIN 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define The_Temp     "温度: "
#define The_Damp     "湿度: "

// 上一次发送的温湿度值和发送的时间
float lastTemperature = 0;
float lastHumidity = 0;
unsigned long lastMessageTime = 0;


// 处理按键状态
void handleButton() {
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        toggleRelay();
      }
    }
  }
  lastButtonState = reading;
}
// 切换继电器状态
void toggleRelay() {
  if (digitalRead(relayPin) == HIGH) {
    turnRelayOff();
  } else {
    turnRelayOn();
  }
}

// 打开继电器
void turnRelayOn() {
  digitalWrite(relayPin, HIGH);
  Serial.println("Relay ON");
}

// 关闭继电器
void turnRelayOff() {
  digitalWrite(relayPin, LOW);
  Serial.println("Relay OFF");
}
 
 
// 初始化函数
void setup() {
  // put your setup code here, to run once:

  // 设置波特率
  Serial.begin(115200);

  //设置灯引脚
  pinMode(buttonPin, INPUT);
  pinMode(relayPin , OUTPUT);
} 

void loop() {
  // put your main code here, to run repeatedly:
  // 读取按键状态并执行相应操作
  handleButton();

  // 读取温湿度传感器数据
  readAndPublishDHTData();
}


// 读取温湿度传感器数据并发送到MQTT服务器
void readAndPublishDHTData() {
  float humidity    = dht.readHumidity();
  float temperature = dht.readTemperature();

  // 检查是否读取温湿度失败
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("读取DHT传感器失败!");
    return;
  }

  // 仅当温度或湿度变化时才发送数据
  if (temperature != lastTemperature || humidity != lastHumidity) {
    // 将温湿度数据转换为字符串
    String dhtData = The_Temp + String(temperature) + "°C, " + The_Damp + String(humidity) + "%";

    // 打印到串口监视器
    Serial.println(dhtData);
    
    // 更新上一次的温湿度值和发送的时间
    lastTemperature = temperature;
    lastHumidity    = humidity;
    lastMessageTime = millis();
  }
}

●编译注意事项:添加DHT库

PS:注意,如果是使用Arduino编辑器进行代码编译,需要提前添加DHT11的库,如图所示
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发OpenHarmony组件复用案例

概述 在开发应用时&#xff0c;有些场景下的自定义组件具有相同的组件布局结构&#xff0c;仅有状态变量等承载数据的差异。这样的组件缓存起来&#xff0c;需要使用到该组件时直接复用&#xff0c; 减少重复创建和渲染的时间&#xff0c;从而提高应用页面的加载速度和响应速度…

windows平台高dpi介绍

flutter在windows平台如何自定义dpi设置 系统层级的支持(windows平台对高dpi的支持) 主要有两点&#xff1a; 设置系统的缩放比例 (系统及系统自带的app会根据这个设置来进行缩放&#xff1b;自己的app需要结合自己设置的dpi awareness来实现对应的dpi支持)设置进程的dpi aw…

工作为了什么,因为人间值得

人生&#xff0c;只要照亮某个角落就够了。《人间值得》这本书的名字我没有考证&#xff0c;但是读书的内容可以推断&#xff0c;作者应该不是用本书来表达《人间值得》的内涵。通篇略读&#xff0c;并没有写人间哪儿值得&#xff0c;没有写人间的真善美、甚至爱&#xff0c;而…

simulink之Data Type Conversion

Data Type Conversion 将输入信号转换为指定的数据类型。 数据类型转换块将任何Simulink数据类型的输入信号转换为您为输出数据类型参数指定的数据类型。输入可以是任何实值或复值信号。如果输入是真实的&#xff0c;那么输出就是真实的。如果输入是复杂的&#xff0c;那么输出…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

vue使用i18n实现国际化

安装 npm install vue-i18nnext在src下创建一个名为i18n的文件夹,并按照下图创建需要的文件 i18n/locales/en.json {"common": {"BUTTON_OK": "OK","BUTTON_CANCEL": "Cancel","BUTTON_SUBMIT": "Submit…

FTP和本地yum搭建

一、文件共享服务 1.存储类型 二、FTP文件传输协议 1.工作原理 2.登录 三、vsftpd服务修改默认命令端口 四、内网搭建yum仓库 方法一&#xff1a;通过ftp服务搭建内网yum仓库服务器 补充 方法二&#xff1a;通过httpd协议搭建内网yum仓库服务器

Windows系统搭建WebDAV服务并结合内网穿透实现公网访问本地文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

配置华为设备NQA UDP Jitter检测VoIP业务抖动

组网需求 如图1所示&#xff0c;总部和子公司之间需要跨越外部网络进行通信&#xff0c;DeviceA和DeviceD为总部和子公司的网络出口设备&#xff0c;DeviceB和DeviceC为外部网络提供商的边缘设备。 总部和子公司之间经常要通过VoIP进行电话会议&#xff0c;要求双向时延小于2…

【架构】docker实现主从容错切换迁移【案例2/4】

实现主从容错切换迁移 在3主3从【案例1/4】的基础上&#xff0c;实现主从容错切换迁移&#xff0c;示意图如下&#xff1a; 一、数据读写存储 1、启动6机构成的集群并通过exec进入&#xff08;任意一台都行&#xff09;&#xff1a; docker exec -it redis-node-1 /bin/bas…

封装日期时间组件

概述 该组件包含日期选择&#xff0c;任意时间选择、固定时间点选择。 子组件代码(date-picker.vue) <template><div id"date_picker"><el-popover placement"top" width"322" trigger"click" ref"popover&quo…

OpenCV-Python(35):BRIEF算法

算法介绍 BRIEF&#xff08;Binary Robust Independent Elementary Features&#xff09;是一种用于计算机视觉中特征点描述子的算法。它是一种二进制描述子&#xff0c;通过比较图像上不同位置的像素值来生成特征点的描述子。 BRIEF算法的基本思想是选取一组固定的像素对&…

[VGG团队论文阅读]Free3D: Consistent Novel View Synthesis without 3D Representation

Vedaldi, C. Z. A. (n.d.). Free3D: Consistent Novel View Synthesis without 3D Representation. Chuanxiaz.com. https://chuanxiaz.com/free3d/static/videos/Free3D.pdf Free3D: 无需3D表示的一致新视角合成 Visual Geometry Group, University of Oxford 摘要 我们介绍…

Radzen Blazor Studio 脚手架框架解读

背景 组织管理管理准备使用Blazor这个工具实现&#xff0c;因为其有对应的 scaffold 脚手架&#xff0c;先构建数据库&#xff0c;然后通过向导&#xff0c;生成CRUD以及对应的接口&#xff0c;那么有必要看一下&#xff0c;其内部的代码结构是什么样的。 结构 接口层 有两类…

MIT 6s081 blog1.xv6内存管理

xv6内存管理部分 xv6内存布局 内核地址空间 如xv6指导书中图3.3&#xff1a;从0x80000000开始的地址为内核地址空间&#xff0c;CLINT、PLIC、uart0、virtio disk等为I/O设备&#xff08;内存映射I/O&#xff09;&#xff0c;可以看到xv6虚拟地址到物理地址的映射&#xff0…

YOLOv8目标检测中数据集各部分的作用

自学答疑使用&#xff0c;持续更新… 在目标检测任务中&#xff0c;通常将整个数据集划分为训练集&#xff08;training set&#xff09;、验证集&#xff08;validation set&#xff09;和测试集&#xff08;test set&#xff09;。这三个数据集在训练和评估过程中具有不同的…

水经注语义化版本控制规范1.2.0版

为了更好的对产品进行版本管理&#xff0c;我们曾基于业界的一些权威参考资料&#xff0c;梳理过两版水经注产品的版本控制规范。 但随着多个平台的产品研发&#xff0c;以及产品在各平台的更新发布&#xff0c;再结合我们的实际情况&#xff0c;现在对版本控制规范进行一次升…

手把手教你使用Django如何连接Mysql

目录 一、引言 二、准备工作 三、配置Django连接MySQL 1、安装MySQL驱动&#xff1a; 2、配置数据库设置&#xff1a; 3、 创建数据库迁移&#xff1a; 四、编写Django模型和视图函数 1、编写模型&#xff1a; 2. 编写视图函数&#xff1a; 3. 编写模板&#xff1a; …

帆软笔记-决策表报对象使用(两表格联动)

效果描述如下&#xff1a; 数据库中有个聚合商表&#xff0c;和一个储能表&#xff0c;储能属于聚合商&#xff0c;桩表中有个字段是所属聚合商。 要求帆软有2个表格&#xff0c;点击某个聚合商&#xff0c;展示指定的储能数据。 操作&#xff1a; 帆软选中表格单元&#xf…