手把手教你用ESP32-C3和MQTT协议,5分钟搞定ONENET云平台数据上报与灯光控制

张开发
2026/6/16 0:23:43 15 分钟阅读
手把手教你用ESP32-C3和MQTT协议,5分钟搞定ONENET云平台数据上报与灯光控制
ESP32-C3与MQTT实战5分钟实现ONENET云平台数据交互与灯光控制物联网开发中最令人兴奋的瞬间莫过于看到硬件设备第一次成功与云端对话。本文将带你用ESP32-C3开发板配合常见的SHT30温湿度传感器和SK6812 RGB灯珠完成从本地数据采集到云端控制的完整链路。不同于分散的基础教程这里会聚焦一个具体应用场景——当你跟着步骤走完不仅能获得实时环境数据看板还能通过手机APP随时调整灯光颜色。1. 硬件准备与开发环境搭建工欲善其事必先利其器。我们需要准备以下硬件组件ESP32-C3开发板推荐含USB-TypeC接口的版本SHT30温湿度传感器I2C接口精度±2%RHSK6812 RGB灯珠内置驱动IC单线控制杜邦线若干建议使用彩色线区分功能开发环境配置直接影响后续效率乐鑫官方的ESP-IDF框架提供了完善工具链# 安装ESP-IDF工具链以Ubuntu为例 sudo apt-get install git wget flex bison gperf python3 python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util mkdir ~/esp cd ~/esp git clone --recursive https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh . ./export.sh提示Windows用户可使用ESP-IDF Tools Installer一键安装VSCode安装乐鑫官方插件后可直接创建工程。硬件连接参考下表设备引脚ESP32-C3接口功能说明SHT30 SDAGPIO4I2C数据线SHT30 SCLGPIO5I2C时钟线SK6812 DINGPIO8数据输入SK6812 VCC3.3V电源正极SK6812 GNDGND电源地线连接完成后用USB线将开发板接入电脑在终端输入ls /dev/tty*确认设备识别Windows使用设备管理器查看COM端口。2. ONENET云平台配置中国移动ONENET平台为物联网设备提供了友好的MQTT接入方式注册并登录ONENET控制台进入产品开发→创建产品选择MQTT旧版协议填写产品基本信息产品名称ESP32-C3环境监测行业类别智能家居联网方式Wi-Fi产品创建成功后进入设备列表→添加设备设备名称My_ESP32_C3设备鉴权信息建议使用MAC地址后6位记录关键参数PRODUCT_ID产品IDDEVICE_ID设备IDAUTH_INFO鉴权信息平台数据流与命令配置在数据流模板中创建temperature和humidity两个数据流在应用管理中新建灯光控制应用添加RGB调色板控件进入设备调试页面准备测试消息交互3. ESP-IDF工程核心代码实现新建工程后需要重点关注三个功能模块的实现3.1 WiFi连接与MQTT初始化在main/main.c中添加网络配置#define WIFI_SSID your_SSID #define WIFI_PASS your_password void wifi_init_sta() { wifi_config_t wifi_config { .sta { .ssid WIFI_SSID, .password WIFI_PASS }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); }MQTT客户端配置使用乐鑫官方esp_mqtt组件#include mqtt_client.h esp_mqtt_client_config_t mqtt_cfg { .uri mqtt://183.230.40.39:6002, .client_id DEVICE_ID, .username PRODUCT_ID, .password AUTH_INFO, }; esp_mqtt_client_handle_t client esp_mqtt_client_init(mqtt_cfg); esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); esp_mqtt_client_start(client);3.2 传感器数据采集与上报SHT30驱动采用I2C通信协议数据读取函数示例#include driver/i2c.h #define SHT30_ADDR 0x44 #define I2C_MASTER_SCL_IO 5 #define I2C_MASTER_SDA_IO 4 float read_sht30_temperature() { uint8_t cmd[2] {0x2C, 0x06}; uint8_t data[6]; i2c_master_write_to_device(I2C_NUM_0, SHT30_ADDR, cmd, 2, 1000/portTICK_PERIOD_MS); vTaskDelay(20/portTICK_PERIOD_MS); i2c_master_read_from_device(I2C_NUM_0, SHT30_ADDR, data, 6, 1000/portTICK_PERIOD_MS); uint16_t temp_raw (data[0] 8) | data[1]; return -45 175 * (temp_raw / 65535.0); }数据上报ONENET的MQTT消息格式{ id: 123, dp: { temperature: [{v: 25.3}], humidity: [{v: 56.7}] } }3.3 RGB灯光控制实现SK6812灯珠使用RMT驱动配置PWM信号#include driver/rmt.h #include led_strip.h #define LED_GPIO 8 #define LED_NUM 1 led_strip_config_t strip_cfg { .strip_gpio_num LED_GPIO, .max_leds LED_NUM, }; led_strip_t *strip led_strip_new_rmt_sk6812(strip_cfg); strip-set_pixel(strip, 0, 255, 0, 0); // 设置为红色 strip-refresh(strip, 100);云端命令解析逻辑void handle_cloud_command(char *data) { cJSON *root cJSON_Parse(data); if(root) { cJSON *rgb cJSON_GetObjectItem(root, rgb); if(rgb) { int r cJSON_GetObjectItem(rgb, r)-valueint; int g cJSON_GetObjectItem(rgb, g)-valueint; int b cJSON_GetObjectItem(rgb, b)-valueint; strip-set_pixel(strip, 0, r, g, b); strip-refresh(strip, 100); } cJSON_Delete(root); } }4. 系统联调与问题排查当所有代码就绪后按以下步骤验证功能WiFi连接检查查看串口日志确认IP获取使用ping测试网络连通性MQTT连接测试ONENET控制台查看设备在线状态使用MQTT.fx工具订阅设备主题数据上报验证# 查看上报的原始数据 mosquitto_sub -t \$sys/{PRODUCT_ID}/{DEVICE_ID}/dp/post/json -h 183.230.40.39 -P 6002命令下发测试在ONENET应用界面调整RGB值观察串口日志中的命令接收情况常见问题解决方案现象可能原因解决方法WiFi连接失败密码错误/信号弱检查SSID大小写靠近路由器MQTT频繁断开心跳间隔过长设置mqtt_cfg.keepalive 60灯光颜色异常数据时序错误检查RMT时钟分频参数传感器读数不准I2C总线冲突确认上拉电阻已启用当看到灯光随着云端控制实时变化温湿度数据在平台图表上形成曲线时这个完整的物联网闭环系统就真正跑通了。这种即时的反馈正是物联网开发最吸引人的魅力所在——物理世界与数字世界的边界在此刻变得模糊。

更多文章