Arduino ESP32连接GY39传感器,数据上传到ThingsBoard物联网平台教程

发布时间:2026/6/3 10:25:29

Arduino ESP32连接GY39传感器,数据上传到ThingsBoard物联网平台教程 ESP32与GY39传感器数据上云全指南从硬件连接到ThingsBoard可视化在智能农业、环境监测或工业物联网项目中如何将传感器数据可靠地传输到云端并实现可视化一直是开发者面临的挑战。ESP32作为一款兼具Wi-Fi和蓝牙功能的低成本开发板配合GY39这款集成了气压、温湿度和光照强度检测的多功能传感器能够快速搭建环境监测节点。而ThingsBoard作为开源的物联网平台提供了完善的数据接收、处理和展示功能。本文将手把手带你完成从硬件连接、数据采集到云端可视化的全流程实现。1. 硬件准备与环境搭建1.1 所需材料清单在开始项目前请确保准备好以下硬件和软件硬件部分ESP32开发板推荐使用ESP32-WROOM-32GY39传感器模块杜邦线若干建议使用母对母微型USB数据线用于供电和编程面包板可选方便原型搭建软件部分Arduino IDE已安装ESP32开发板支持ThingsBoard账户社区版或专业版串口调试助手如Putty或Arduino自带串口监视器1.2 ESP32开发环境配置首先需要在Arduino IDE中配置ESP32开发环境打开Arduino IDE进入文件→首选项在附加开发板管理器网址中添加https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json打开工具→开发板→开发板管理器搜索并安装esp32安装完成后选择ESP32 Dev Module作为开发板提示如果下载速度慢可以尝试使用国内镜像源或科学上网工具加速下载。1.3 GY39传感器工作原理GY39是一款高度集成的环境传感器模块内部包含多个传感器单元传感器类型测量范围精度输出频率温度传感器-40~85°C±0.5°C1Hz湿度传感器0~100%RH±3%RH1Hz气压传感器300~1100hPa±0.1hPa1Hz光照传感器0~120Klux±5%1Hz模块通过I2C或UART接口与主控通信本文将以更常用的I2C接口为例进行讲解。2. 硬件连接与传感器数据读取2.1 ESP32与GY39的电路连接按照以下方式连接ESP32和GY39传感器ESP32引脚GY39引脚备注3.3VVCC电源正极GNDGND电源地GPIO21SDAI2C数据线GPIO22SCLI2C时钟线连接完成后可以通过以下代码测试I2C通信是否正常#include Wire.h void setup() { Serial.begin(115200); Wire.begin(); // 扫描I2C设备 Serial.println(\nI2C Scanner); byte error, address; int nDevices 0; for(address 1; address 127; address ) { Wire.beginTransmission(address); error Wire.endTransmission(); if (error 0) { Serial.print(I2C device found at address 0x); if (address16) Serial.print(0); Serial.print(address,HEX); Serial.println( !); nDevices; } } if (nDevices 0) Serial.println(No I2C devices found\n); else Serial.println(done\n); } void loop() {}2.2 GY39传感器库的安装与使用由于Arduino官方库中没有GY39的专用库我们需要使用第三方库或自行编写驱动。推荐使用GY39_I2C库下载GY39_I2C库可从GitHub获取将库文件夹放入Arduino的libraries目录重启Arduino IDE以下是使用该库读取传感器数据的基本示例#include GY39_I2C.h GY39_I2C gy39; void setup() { Serial.begin(115200); gy39.begin(); } void loop() { if(gy39.update()) { Serial.print(Temperature: ); Serial.print(gy39.getTemperature()); Serial.println( °C); Serial.print(Humidity: ); Serial.print(gy39.getHumidity()); Serial.println( %); Serial.print(Pressure: ); Serial.print(gy39.getPressure()); Serial.println( hPa); Serial.print(Light: ); Serial.print(gy39.getLight()); Serial.println( Lux); } delay(1000); // 每秒读取一次 }3. ThingsBoard平台配置3.1 创建ThingsBoard账户与设备访问 ThingsBoard官网 并注册账户登录后进入设备页面点击按钮创建新设备填写设备名称如ESP32_GY39记下设备的访问令牌将在ESP32代码中使用3.2 配置数据仪表盘ThingsBoard提供了强大的可视化工具可以创建自定义仪表盘进入仪表盘页面创建新仪表盘添加各种小部件如数字显示、折线图、仪表盘等为每个小部件配置数据源绑定到ESP32设备上传的数据键4. ESP32与ThingsBoard的MQTT通信4.1 MQTT协议基础MQTT是一种轻量级的发布/订阅协议非常适合物联网应用。ThingsBoard内置了MQTT代理设备可以通过MQTT协议上传数据。关键概念主题(Topic)数据发布的通道QoS服务质量等级0、1或2保留消息(Retain)服务器是否保存最后一条消息4.2 ESP32上的MQTT客户端实现我们将使用PubSubClient库实现MQTT通信。首先安装库在Arduino IDE中点击工具→管理库搜索并安装PubSubClient以下是完整的ESP32代码实现传感器数据读取和MQTT上传#include WiFi.h #include PubSubClient.h #include GY39_I2C.h #include ArduinoJson.h // WiFi配置 const char* ssid your_SSID; const char* password your_PASSWORD; // ThingsBoard配置 const char* mqtt_server demo.thingsboard.io; const char* token your_device_token; const char* topic v1/devices/me/telemetry; WiFiClient espClient; PubSubClient client(espClient); GY39_I2C gy39; void setup_wifi() { delay(10); Serial.println(); Serial.print(Connecting to ); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(); Serial.println(WiFi connected); Serial.println(IP address: ); Serial.println(WiFi.localIP()); } void reconnect() { while (!client.connected()) { Serial.print(Attempting MQTT connection...); if (client.connect(ESP32Client, token, NULL)) { Serial.println(connected); } else { Serial.print(failed, rc); Serial.print(client.state()); Serial.println( try again in 5 seconds); delay(5000); } } } void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); gy39.begin(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); if(gy39.update()) { // 创建JSON数据 StaticJsonDocument200 doc; doc[temperature] gy39.getTemperature(); doc[humidity] gy39.getHumidity(); doc[pressure] gy39.getPressure(); doc[light] gy39.getLight(); // 序列化JSON char jsonBuffer[200]; serializeJson(doc, jsonBuffer); // 发布数据 client.publish(topic, jsonBuffer); Serial.println(Data published:); Serial.println(jsonBuffer); } delay(10000); // 每10秒上传一次数据 }4.3 数据格式与规则链配置ThingsBoard支持多种数据格式我们推荐使用JSON格式因为它结构清晰且易于扩展。上传的数据将自动存储在设备的遥测数据中。在ThingsBoard中可以通过规则链对数据进行进一步处理进入规则链页面添加新的规则节点如数据验证单位转换报警触发数据持久化5. 高级功能与优化5.1 低功耗优化对于电池供电的应用需要考虑功耗优化使用ESP32的深度睡眠模式#define uS_TO_S_FACTOR 1000000 // 微秒到秒的转换因子 #define TIME_TO_SLEEP 300 // 休眠时间(秒) void setup() { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start(); }降低传感器采样频率缩短Wi-Fi连接时间5.2 数据安全传输为确保数据传输安全建议使用TLS加密的MQTT连接端口8883定期更换设备令牌实现数据校验机制5.3 故障排除与调试常见问题及解决方法问题现象可能原因解决方案无法连接Wi-FiSSID/密码错误检查凭证确保信号强度MQTT连接失败令牌错误或网络问题验证令牌检查防火墙设置传感器数据异常接线错误或电源不稳检查连接确保3.3V供电稳定数据上传延迟网络拥塞或处理能力不足优化代码减少数据量6. 实际应用案例6.1 智能温室监控系统将多个ESP32GY39节点部署在温室不同位置监测各区域的微气候差异根据光照数据自动调节遮阳网结合温湿度数据控制通风系统气压变化可用于预测天气变化6.2 楼宇环境质量监测在办公楼内部署传感器网络实时监测CO2浓度需额外传感器根据环境数据调节HVAC系统生成室内舒适度指数6.3 工业设备环境监控监测电气柜、服务器机房等关键区域温度异常预警防止过热湿度监控预防凝露气压监测用于洁净室控制在完成基础功能后我发现最实用的优化是添加了本地数据缓存功能当网络中断时ESP32会将数据暂存到SPIFFS文件系统中待网络恢复后重新上传。这在实际部署中显著提高了数据的完整性。另一个实用技巧是在ThingsBoard中设置基于历史数据的趋势预测可以提前发现潜在的环境异常。

相关新闻