搜索代码

ESP32教程48/55 - 远程温度监控与LED控制MQTT | SunFounder的ESP32物联网套件

ESP32教程48/55 - 远程温度监控与LED控制MQTT | SunFounder的ESP32物联网套件

在本教程中,我们将探讨如何利用ESP32模块配合SunFounder的ESP32扩展板,通过Adafruit IO平台远程监测温度和湿度。此外,我们还将实现通过网页界面控制LED的功能。完成本项目后,您将能够在浏览器中查看实时温度和湿度数据,并远程开关LED。

本项目利用MQTT协议实现ESP32与Adafruit IO服务之间的高效通信。MQTT轻量且非常适合物联网应用,使我们能够轻松发布传感器数据并订阅LED控制命令。如需进一步了解代码和接线的细节,请务必观看本教程随附的视频(视频中00:00处)。

硬件说明

本项目的主要组件包括ESP32微控制器、DHT11温湿度传感器和一个LED。ESP32是一款功能强大的微控制器,内置Wi-Fi和蓝牙功能,是物联网项目的理想选择。它可以处理多项任务并无缝连接互联网。

DHT11传感器负责测量温度和湿度。它输出可由ESP32读取的数字信号。LED作为指示灯,可通过远程控制来演示MQTT协议在互联网设备管理中的有效性。

数据手册详情

制造商 Adafruit
零件编号 DHT11
逻辑/IO电压 3.3 V
供电电压 3.3 V
输出电流(每通道) 20 mA
峰值电流(每通道) 50 mA
PWM频率指南 不适用
输入逻辑阈值 0.3 V(低电平),0.7 V(高电平)
压降 / RDS(on) / 饱和电压 不适用
热限制 0至50 °C
封装 3引脚
备注 / 变体 如需更高精度,请使用DHT22。

 

  • 确保接线正确,以防损坏。
  • LED需串联220欧姆电阻以限制电流。
  • 如有必要,为DHT11数据引脚使用上拉电阻。
  • 检查Wi-Fi凭据是否区分大小写。
  • 监控串口输出以调试连接问题。
  • 保持MQTT主题唯一,避免冲突。
  • 测试传感器读数,确保其有效。
  • 注意DHT11的响应时间;读数可能需要一段时间才能稳定。

LED = 控制LED;temperature = 发布温度数据;humidity = 发布湿度数据。

接线说明

要连接组件,首先连接DHT11传感器。使用红色导线将DHT11的左引脚连接到面包板上的3.3V电源轨。DHT11的中间引脚应使用黄色导线连接到ESP32上的引脚13。最后,使用蓝色导线将DHT11的右引脚连接到接地轨。

接下来,对于LED,将阳极(长脚)通过220欧姆电阻连接到ESP32的引脚15。将阴极(短脚)直接连接到面包板上的接地轨。确保所有连接牢固,并仔细检查是否有松动的导线。

设置仪表盘

  1. 访问 Adafruit IO,然后点击 Start for free 创建一个免费账户。

    ../../_images/sp230516_102503.png
  2. 填写表单以创建账户。

    ../../_images/sp230516_102629.png
  3. 创建 Adafruit 账户后,您需要重新打开 Adafruit IO。点击 Dashboards,然后点击 New Dashboard

    ../../_images/sp230516_103347.png
  4. 创建一个 New Dashboard

    ../../_images/sp230516_103744.png
  5. 进入新创建的 Dashboard 并创建一个新块。

    ../../_images/sp230516_104234.png
  6. 创建 1 个 Toggle 块。

    ../../_images/sp230516_105727.png
  7. 接下来,您需要在此创建一个新的数据流。此开关将用于控制 LED,我们将此数据流命名为 “LED”。

    ../../_images/sp230516_105641.png
  8. 勾选 LED 数据流,然后进入下一步。

    ../../_images/sp230516_105925.png
  9. 完成块设置(主要是块标题、开启文本和关闭文本),然后点击右下角的 Create block 按钮完成操作。

    ../../_images/sp230516_110124.png
  10. 我们还需要创建两个 Text Blocks。它们将用于显示温度和湿度。因此,创建两个名为 temperaturehumidity 的数据流。

    ../../_images/sp230516_110657.png
  11. 创建完成后,您的 Dashboard 应该看起来像这样:

    ../../_images/sp230516_111134.png
  12. 您可以使用 Dashboard 上的 Edit Layout 选项调整布局。

    ../../_images/sp230516_111240.png
  13. 点击 API KEY,您将看到您的用户名和 API KEY 显示出来。请记下这些信息,因为您的代码中会用到它们。

    ../../_images/sp230516_111641.png

 

代码示例与讲解

代码首先包含必要的库,设置 Wi-Fi 凭据,并定义 MQTT 参数。诸如 AIO_USERNAMEAIO_KEY 等关键标识符用于与 Adafruit IO 服务进行身份验证。

#define AIO_USERNAME "YourUsername"
#define AIO_KEY "YourKey"

这些行定义了您的 Adafruit IO 用户名和密钥,这对于连接到 MQTT 代理至关重要。确保这些值准确无误,以建立成功的连接。

setup() 函数中,初始化 Wi-Fi 连接,并使用根 CA 证书设置 MQTT 客户端以实现安全通信。

WiFi.begin(WLAN_SSID, WLAN_PASS);
client.setCACert(adafruitio_root_ca);

此代码将 ESP32 连接到指定的 Wi-Fi 网络,并设置用于安全 MQTT 连接的根 CA。正确处理这些连接对于可靠的数据传输至关重要。

最后,loop() 函数管理 MQTT 连接,并定期发布温度和湿度读数。

mqtt.processPackets(5000);

此行允许 ESP32 处理订阅主题的传入消息,确保设备对从 Web 界面发送的命令保持响应。

有关完整代码,请参阅文章下方加载的完整程序。

演示 / 预期效果

成功设置后,您应该会在Adafruit IO仪表板上看到温度和湿度的实时更新。您还可以通过网页界面切换LED的开关状态。如果LED没有按预期响应,请检查您的接线,并确保MQTT主题名称与代码中定义的一致。

请注意,由于证书过期,可能会出现某些MQTT连接错误。请确保您的代码中包含最新的根CA证书,以避免这些问题(视频中15:30处)。

视频时间戳

  • 00:00 开始
  • 1:50 项目介绍
  • 3:16 什么是MQTT
  • 6:36 Adafruit IO设置
  • 11:13 接线
  • 13:38 Arduino代码讲解
  • 22:03 选择ESP32开发板和COM端口
  • 23:44 项目演示
  • 27:05 更新仪表板
849-ESP32 Tutorial 48/55- Arduino code for Remote Temperature Monitoring and LED control MQTT
语言: C++
/*
 * Adafruit MQTT 库 ESP32 Adafruit IO SSL/TLS 示例
 * 
 * 使用最新版本的 ESP32 Arduino 核心:
 * https://github.com/espressif/arduino-esp32
 * 
 * 与 Adafruit Huzzah32 Feather 和 Breakout Board 的兼容性很好:
 * https://www.adafruit.com/product/3405
 * https://www.adafruit.com/products/4172
 * 
 * Adafruit 投入时间和资源提供这个开源代码,
 * 请通过购买 Adafruit 的产品来支持 Adafruit 和开源硬件!
 * 
 * 由 Tony DiCola 为 Adafruit Industries 编写。
 * 由 Brent Rubell 为 Adafruit Industries 修改
 * MIT 许可证,以上所有文本必须包含在任何再分发中
 * /
 */
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/*
 * WiFi接入点 *********************************/
 * 
 * #define WLAN_SSID "SSID"
 * #define WLAN_PASS "PASSWORD"
 * 
 * /************************* Adafruit.io设置
 */

#define AIO_SERVER "io.adafruit.com"

 // 使用端口8883进行MQTTS
#define AIO_SERVERPORT 8883

 // Adafruit IO 账户配置
 // (要获取这些值,请访问 https://io.adafruit.com 并点击“Active Key”)
 // #define AIO_USERNAME "您的_ADAFRUIT_IO_用户名"
 // #define AIO_KEY "您的 Adafruit IO 密钥"

#define AIO_USERNAME "JimmyKernel"
#define AIO_KEY "aio_Mxiv12i74b5jKfKNSKLYjlhPmoHC"

/*
 * 全球状态(您不需要更改此项!)******************/
 * 
 * // WiFiFlientSecure用于SSL/TLS支持
 * WiFiClientSecure client;
 * 
 * // 通过传入WiFi客户端和MQTT服务器及登录详情设置MQTT客户端类。
 * Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
 * 
 * // io.adafruit.com 根CA
 * const char* adafruitio_root_ca = \
 *  "-----BEGIN CERTIFICATE-----\n"
 *  "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
 *  "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
 *  "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
 *  "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
 *  "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
 *  "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
 *  "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
 *  "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
 *  "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
 *  "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
 *  "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
 *  "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
 *  "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
 *  "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
 *  "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
 *  "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
 *  "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
 *  "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
 *  "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
 *  "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
 *  "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
 *  "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
 *  "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
 *  "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
 *  "7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
 *  "-----END CERTIFICATE-----\n";
 * 
 * /****************************** 订阅 روانات
 */

 // 设置一个名为'test'的发布订阅源和一个名为'test2'的订阅源。
 // 注意,AIO的MQTT路径遵循以下形式:<username>/feeds/<feedname>
Adafruit_MQTT_Subscribe LED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED");
Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

850-ESP32 Tutorial 48/55- Basic Adafruit MQTT code (watch video)
语言: C++
/*
 * Adafruit MQTT 基础课程 1
 * 在 YouTube 上观看此代码的视频指导 https://youtu.be/M9BQweAsHJM
 * 本课程和代码的资源页面:
 * 📚⬇️ 下载和资源页面 https://robojax.com/RJT670
 * 教程由 https://youTube.com/@robojax 提供
 * 
 * Adafruit MQTT 库 ESP32 Adafruit IO SSL/TLS 示例
 * 
 * 使用最新版本的 ESP32 Arduino 核心:
 * https://github.com/espressif/arduino-esp32
 * 
 * 与 Adafruit Huzzah32 Feather 和 Breakout Board 完美兼容:
 * https://www.adafruit.com/product/3405
 * https://www.adafruit.com/products/4172
 * 
 * Adafruit 投入时间和资源提供此开源代码,
 * 请通过购买 Adafruit 的产品来支持 Adafruit 和开源硬件!
 * 
 * 由 Tony DiCola 为 Adafruit Industries 编写。
 * 由 Brent Rubell 为 Adafruit Industries 修改
 * MIT 许可证,以上所有文本必须包含在任何再分发中
 * /
 * 
 * /// 参考: https://www.electronicwings.com/esp32/esp32-mqtt-client
 */
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/*
 * WiFi接入点 *********************************/
 * 
 * #define WLAN_SSID "dars"
 * #define WLAN_PASS "5152535455"
 * 
 * /************************* Adafruit.io 设置
 */

#define AIO_SERVER "io.adafruit.com"

 // 使用端口8883进行MQTTS
#define AIO_SERVERPORT 8883

 // Adafruit IO 账户配置
 // (要获取这些值,请访问 https://io.adafruit.com 并点击“激活密钥”)
 // #define AIO_USERNAME "您的Adafruit IO用户名"
 // #define AIO_KEY "您的 Adafruit IO 密钥"

#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_wCyL33EVKLcGoAotGNEQ4dGQYOLZ"

/*
 * 全球状态(您不需要更改此内容!)******************/
 * 
 * //支持SSL/TLS的WiFiFlientSecure
 * WiFiClientSecure client;
 * 
 * //通过传入WiFi客户端和MQTT服务器及登录详细信息来设置MQTT客户端类。
 * Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
 * 
 * // io.adafruit.com 根CA
 * const char* adafruitio_root_ca =
 *  "-----BEGIN CERTIFICATE-----\n"
 *  "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"
 *  "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
 *  "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"
 *  "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n"
 *  "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
 *  "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n"
 *  "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n"
 *  "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n"
 *  "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n"
 *  "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n"
 *  "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n"
 *  "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n"
 *  "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n"
 *  "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n"
 *  "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n"
 *  "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n"
 *  "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n"
 *  "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n"
 *  "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n"
 *  "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n"
 *  "-----END CERTIFICATE-----\n";
 */

 // 设置一个名为“test”的发布Feed和一个名为“test2”的订阅Feed。
 // 注意AIO的MQTT路径遵循以下格式:<username>/feeds/<feedname>
Adafruit_MQTT_Subscribe LED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED");
 // Adafruit_MQTT_Publish 湿度 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
 // Adafruit_MQTT_Publish 温度 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

文件📁

没有可用的文件。