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。将阴极(短脚)直接连接到面包板上的接地轨。确保所有连接牢固,并仔细检查是否有松动的导线。
设置仪表盘
-
访问 Adafruit IO,然后点击 Start for free 创建一个免费账户。

-
填写表单以创建账户。

-
创建 Adafruit 账户后,您需要重新打开 Adafruit IO。点击 Dashboards,然后点击 New Dashboard。

-
创建一个 New Dashboard。

-
进入新创建的 Dashboard 并创建一个新块。

-
创建 1 个 Toggle 块。

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

-
勾选 LED 数据流,然后进入下一步。

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

-
我们还需要创建两个 Text Blocks。它们将用于显示温度和湿度。因此,创建两个名为 temperature 和 humidity 的数据流。

-
创建完成后,您的 Dashboard 应该看起来像这样:

-
您可以使用 Dashboard 上的 Edit Layout 选项调整布局。

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

代码示例与讲解
代码首先包含必要的库,设置 Wi-Fi 凭据,并定义 MQTT 参数。诸如 AIO_USERNAME 和 AIO_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 更新仪表板
/*
* 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");
/*
* 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");
Common Course Links
Common Course Files
资源与参考
-
文档ESP32 教程 48/55 - SunFounder 文档页面:使用 Adafruit IO 进行温湿度监控docs.sunfounder.com
文件📁
没有可用的文件。