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

发布时间:2024年01月15日

概要

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

【本系列教程 - 总目标】:
使用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的库,如图所示
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_38141255/article/details/135601292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。