我前兩天買了個魚缸,里面養了些觀賞魚,可沒燈光照射的話,魚看起來就黯淡失色。所以我覺得, 需要加裝一個可以自定義顏色的RGB燈帶,增加些觀賞性,并且我是一個比較懶的人,我感覺遠程遙控的功能也要有。之前做項目用過WIZnet的W5500芯片實現以太網功能,近期他們出了個帶MCU的以太網芯片W55MH32,正好可以跟他們銷售申請套開發板玩玩,計劃是以太網連接到OneNET,微信弄個小程序也連上OneNET,最終從小程序操控RGB燈帶,功能實現沒問題,后面弄成POE供電的,方便布線,文章記錄下開發過程,后續會把代碼以及PCB都open出來,文中會展示小程序源碼和工程源碼,我會把工程完整的展示同時也會說明快速使用時需要替換的參數。這套方案其實還能用到其他場景,比如在床頭裝個氛圍燈,也很合適。
本項目以 W55MH32 以太網單片機為核心,搭建了一套基于以太網的全彩燈條遠程控制系統,實現通過微信小程序遠程調節 WS2812B 燈條的顏色及動態效果(如流水燈、彩虹燈)。項目驗證了 W55MH32 在物聯網燈光控制場景的適用性及 MQTT+OneNET 架構的通信效率。
以太網燈條調色器實現:開源項目鏈接
原理圖和PCB暫時未實現,實現后將會進行補充。
視頻現象查看點擊跳轉
1 項目核心價值與實現效果
通過微信小程序的 RGB 滑塊,能精準調節紅、綠、藍三色比例,實現任意顏色輸出。
支持兩種動態模式切換:
流水燈 (Chasing Lights): 單燈按序輪播。
彩虹燈 (Rainbow): 漸變色彩循環。
基于 MQTT+OneNET 架構,通信穩定且延遲低。
核心驗證: 驗證了 W55MH32 在物聯網燈光控制場景的高適用性。
簡單來說: 用手機就能隨時隨地控制燈條的顏色和動態效果,無論是家庭裝飾還是場景布置都很實用。 硬件
1.1 方案圖示

1.2 通信架構說明
整個系統的通信流程清晰易懂:
微信小程序發送控制指令(如顏色調節、模式切換)。
指令通過 MQTT 協議上傳至 OneNET 云平臺。
W55MH32 通過以太網連接路由器,從 OneNET 接收指令。
W55MH32 解析指令后驅動 WS2812B 執行相應動作。
設備狀態通過串口助手實時反饋(方便調試)。
2 項目環境
2.1 軟件準備
開發環境: Keil uVision 5
調試工具: WIZ UartTool
小程序開發: 微信開發者工具
云平臺: OneNET
2.2 硬件準備
W55MH32-EVB
RGB燈條
RJ45網線
3 注冊 OneNET 賬號及建立物模型
注冊賬號在此不贅述,下面重點介紹如何建立物模型。
3.1 創建產品

3.2 創建物模型

物模型的建立根據自己的需要建立。
3.3 獲取基本信息
獲得產品ID、設備名稱以及密鑰(示例):
產品ID: iP20B5FpF6
設備名稱: d2
設備密鑰: TFU3bT**************************=

3.4 Token 密鑰生成
設備與 OneNET 平臺通信時,Token 作為身份憑證用于安全認證。需使用 Token 生成工具: OneNET Token 生成工具文檔
res 字段: products/{產品id}/devices/{設備名} (使用設備級 Key)。替換 {產品id} 和 {設備名}。
et 字段: 訪問過期時間 (Unix 時間戳)。可使用在線轉換工具獲取。
key 字段: 填寫設備的密鑰。
點擊 generate 生成 Token 密鑰。

3.5 物模型 Topic (示例)
設置直連設備屬性: $sys/iP20B5FpF6/d2/thing/property/set
直連設備屬性設置響應: $sys/iP20B5FpF6/d2/thing/property/set_reply
直連設備上報屬性: $sys/iP20B5FpF6/d2/thing/property/post
直連設備上報屬性響應: $sys/iP20B5FpF6/d2/thing/property/post/reply

4 微信小程序
小程序源工程下載:
鏈接:https://pan.baidu.com/s/16nBbtMhSUeqvVxuVY35Ezg
提取碼:xjdg
修改步驟:
下載后導入微信開發者工具。
修改 index.js 文件:
修改 Token: 替換 header: {"authorization": "你的token"} 中的值為生成的 Token。
修改產品 ID 和設備名: 在 url 中替換 product_id 和 device_name 參數為實際值。
// 修改為自己的產品ID和設備名 url: "https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=你的產品ID&device_name=你的設備名" // 替換為生成的token header: {"authorization": "你的token"}
根據注釋修改物模型初始化名稱及綁定圖片。

5 例程添加與修改
5.1 修改 MQTT 連接參數 (do-mqtt.c)
下載 W55MH32 MQTT 例程,修改 mqttconn 結構體參數為你的 OneNET 信息:
mqttconn mqtt_params = { .mqttHostUrl = "mqtts.heclouds.com", //MQTT服務器的URL地址 .server_ip = {0,}, // 服務器IP地址(此處未使用,保留默認值) .port = 1883, // 連接端口號,1883為MQTT默認非加密端口 .clientid = "d2", // MQTT客戶端ID (替換為你的設備名) .username = "iP20B5FpF6", // MQTT用戶名 (替換為你的產品ID) .passwd = "vers=md5&sign=YT2N73HSjmyy%2BbQEFMDjMw%3D%3D", // 用戶密碼 (替換為你的簽名信息) .pubtopic = "$sys/iP20B5FpF6/d2/thing/property/post", // 發布主題 (替換產品ID和設備名) .pubtopic_reply = "$sys/iP20B5FpF6/d2/thing/property/post/reply", // 發布響應主題 .subtopic = "$sys/iP20B5FpF6/d2/thing/property/set", // 訂閱主題 .subtopic_reply = "$sys/iP20B5FpF6/d2/thing/property/set_reply", // 訂閱響應主題 .pubQoS = QOS0, // 發布消息的服務質量等級(0:最多一次) .willtopic = "/wizchip/will", // 遺囑消息主題,客戶端異常斷開時發布 .willQoS = QOS0, // 遺囑消息的服務質量等級 .willmsg = "wizchip offline!", // 遺囑消息內容 .subQoS = QOS0, // 訂閱消息的服務質量等級 };
5.2 添加 WS2812B 驅動代碼 (ws2812b.c)
創建 ws2812b.c/h 文件,實現燈條控制函數:
/** * @brief 設置特定LED的顏色 * * @param index LED索引(0起始) * @param red 紅色分量(0-255) * @param green 綠色分量(0-255) * @param blue 藍色分量(0-255) * * @note 顏色數據暫存于緩沖區,需調用ws2812b_update()生效 */ void ws2812b_set_color(uint8_t index, uint8_t red, uint8_t green, uint8_t blue) { if (index < LED_NUM) { s_led_colors[index][0] = green; // WS2812B使用GRB格式 s_led_colors[index][1] = red; s_led_colors[index][2] = blue; } } /** * @brief 設置所有LED為統一顏色 * * @param red 紅色分量(0-255) * @param green 綠色分量(0-255) * @param blue 藍色分量(0-255) * * @note 顏色數據暫存于緩沖區,需調用ws2812b_update()生效 */ void ws2812b_set_all_color(uint8_t red, uint8_t green, uint8_t blue) { for (uint8_t i = 0; i < LED_NUM; i++) { ws2812b_set_color(i, red, green, blue); } } /** * @brief 關閉所有LED(設置為黑色) * * @note 需調用ws2812b_update()生效 */ void ws2812b_clear_all(void) { memset(s_led_colors, 0, sizeof(s_led_colors)); } /** * @brief 將緩沖區顏色數據發送至WS2812B燈帶 * * @note 嚴格遵循WS2812B時序要求,發送GRB格式數據 */ void ws2812b_update(void) { /* 禁用中斷以確保精確時序 */ __disable_irq(); TIM_TypeDef *timer_ptr = WS2812B_TIM; timer_ptr-?>CCR1 = 0; // 初始化為低電平 /* 處理所有LED */ for (uint8_t i = 0; i < LED_NUM; i++) { /* 組合24位GRB顏色數據(綠色8位 + 紅色8位 + 藍色8位) */ uint32_t grb = ((s_led_colors[i][0] < 16) | (s_led_colors[i][1] < 8) | s_led_colors[i][2]); /* 從高位到低位逐位發送 */ for (int8_t bit_pos = 23; bit_pos >= 0; bit_pos--) { /* 根據當前位值設置PWM占空比 */ uint16_t duty = (grb & (1UL < bit_pos)) ? s_bit1_duty : s_bit0_duty; timer_ptr-?>CCR1 = duty; /* 等待一個PWM周期 */ uint32_t start_time = timer_ptr->CNT; while ((timer_ptr->CNT - start_time) < s_pwm_period) ; } } /* 發送復位信號(至少50us低電平) */ timer_ptr-?>CCR1 = 0; /* 精確延時50us */ const uint32_t reset_cycles = (SystemCoreClock / 20000); // 計算50us所需的時鐘周期數 for (volatile uint32_t i = 0; i < reset_cycles; i++) ; /* 恢復中斷 */ __enable_irq(); } /** * @brief 彩虹動畫效果 * * @note 循環更新LED顏色以創建流動彩虹效果 */ void ws2812b_rainbow_effect(void) { static uint8_t start_position = 0; for (uint8_t i = 0; i < LED_NUM; i++) { const uint8_t position = (start_position + i) % 256; uint8_t r = 0; uint8_t g = 0; uint8_t b = 0; /* 根據位置計算RGB值 */ if (position < 85) { r = position * 3; g = 255 - position * 3; } else if (position < 170) { const uint8_t adjusted_pos = position - 85; r = 255 - adjusted_pos * 3; b = adjusted_pos * 3; } else { const uint8_t adjusted_pos = position - 170; g = adjusted_pos * 3; b = 255 - adjusted_pos * 3; } ws2812b_set_color(i, r, g, b); } start_position = (start_position + 5) % 256; // 更新起始位置 ws2812b_update(); delay_ms(400); } /** * @brief 跑馬燈效果 * * @note 單個LED依次循環點亮 */ void ws2812b_running_light(void) { static uint8_t position = 0; ws2812b_clear_all(); ws2812b_set_color(position, get_red_value(), get_green_value(), get_blue_value()); ws2812b_update(); delay_ms(200); position = (position + 1) % LED_NUM; } /* 獲取顏色值的函數實現 */ uint8_t get_blue_value(void) { return g_blue_value; } uint8_t get_red_value(void) { return g_red_value; } uint8_t get_green_value(void) { return g_green_value; }
5.3 修改 MQTT 指令解析 (do_mqtt.c)
在解析 OneNET 下發指令 (cJSON 解析) 的函數中,添加對顏色和模式指令的處理邏輯:
/* 處理燈帶開關命令 */
cJSON *light_strip = cJSON_GetObjectItem(params, "LightStrip"); // 從JSON參數中獲取燈帶控制項
if (light_strip != NULL) { // 當存在燈帶控制參數時
if (light_strip->valueint) { // 判斷參數值是否為真(開啟)
strncat(status_msg, "LightStrip:OK;", // 向狀態字符串追加燈帶開啟狀態
sizeof(status_msg) - strlen(status_msg) - 1); // 計算剩余緩沖區空間防止溢出
g_rainbow_effect = 1; // 啟用全局彩虹特效標志
} else { // 參數值為假(關閉)
strncat(status_msg, "LightStrip:OFF;", // 追加燈帶關閉狀態
sizeof(status_msg) - strlen(status_msg) - 1);
g_rainbow_effect = 0; // 禁用彩虹特效
ws2812b_clear_all(); // 調用底層驅動清除所有LED狀態
ws2812b_update(); // 執行硬件更新使清除操作生效
}
}
/* 處理流水燈開關命令 */
cJSON *flowing_light = cJSON_GetObjectItem(params, "FlowingLight"); // 獲取流水燈控制參數
if (flowing_light != NULL) { // 當存在流水燈參數時
if (flowing_light->valueint) { // 參數值為真(開啟)
printf("Switch on the chasing lightsrn"); // 輸出調試日志
g_flowing_light = 1; // 設置流水燈全局使能標志
} else { // 參數值為假(關閉)
printf("Switch off the chasing lightsrn");
g_flowing_light = 0; // 清除流水燈標志
ws2812b_clear_all(); // 清除LED顯示
ws2812b_update(); // 同步硬件狀態
}
}
/* 處理顏色設置命令 */
cJSON *red = cJSON_GetObjectItem(params, "red"); // 提取紅色分量參數
if (red != NULL) { // 當存在紅色參數時
handle_color_command(red->valueint, "RED", status_msg); // 調用顏色處理函數并更新狀態
}
cJSON *green = cJSON_GetObjectItem(params, "green"); // 提取綠色分量參數
if (green != NULL) {
handle_color_command(green->valueint, "GREEN", status_msg);
}
cJSON *blue = cJSON_GetObjectItem(params, "blue"); // 提取藍色分量參數
if (blue != NULL) {
handle_color_command(blue->valueint, "BLUE", status_msg);
}
5.4 處理接收的數據 (do_mqtt.c)
/**
* @brief 處理顏色更新指令
*
* @param color_value 要設置的顏色值(0-255)
* @param color_type 顏色類型(RED/GREEN/BLUE)
* @param status_msg 狀態消息緩沖區指針
*/
static void handle_color_command(int color_value, const char *color_type,
char *status_msg) {
// 創建臨時字符串存儲格式化后的顏色信息
char temp[16] = {0};
// 格式化顏色類型和數值(例如:"RED:255;")
snprintf(temp, sizeof(temp), "%s:%d;", color_type, color_value);
// 將格式化后的字符串追加到狀態消息末尾
strncat(status_msg, temp, STATUS_MSG_MAX_SIZE - strlen(status_msg) - 1);
// 根據顏色類型更新對應的全局顏色變量
if (strcmp(color_type, "RED") == 0) {
g_red_value = color_value; // 更新紅色分量
} else if (strcmp(color_type, "GREEN") == 0) {
g_green_value = color_value; // 更新綠色分量
} else if (strcmp(color_type, "BLUE") == 0) {
g_blue_value = color_value; // 更新藍色分量
}
// 遍歷所有LED燈珠設置顏色
for (uint8_t i = 0; i < LED_NUM; i++) {
// 調用底層驅動設置單個LED顏色(GRB格式)
ws2812b_set_color(i, g_red_value, g_green_value, g_blue_value);
}
// 發送更新指令使顏色設置生效
ws2812b_update();
}
5.5 修改主函數 (main.c)
在 main() 函數中進行初始化,并在主循環中調用控制函數:
// ... (其他初始化) WS2812B_Init(); // 初始化WS2812B驅動 (配置定時器GPIO等) WS2812B_Update(); // 初始更新燈條 while (1) { // 檢查并執行流水燈效果 if(g_flowing_light == 1) { ws2812b_running_light(); } // 檢查并執行彩虹燈效果 if(g_rainbow_effect == 1) { ws2812b_rainbow_effect(); } do_mqtt(); }
6 功能驗證
精準調色:
小程序提供紅(R)、綠(G)、藍(B)三個滑塊。
通過調整滑塊比例,可以組合出任意顏色。
LED燈條實時顯示設定顏色

流水燈模式:
打開小程序上的“流水燈”按鈕。
燈條按照當前設定的顏色進行單燈順序輪播。

彩虹燈模式:
打開小程序上的“彩虹燈”按鈕。
燈條顯示漸變循環的彩虹效果。

總結
本文采用W55MH32開發板搭配WS2812B燈條,借助MQTT協議連接OneNET云平臺,并配合微信小程序,實現了以太網燈條的遠程調色以及動態模式(如流水燈、彩虹燈)控制。感謝大家閱讀,若有疑問歡迎在評論區留言,我會為大家解答,助力你的開發工作。
審核編輯 黃宇
-
物聯網
+關注
關注
2945文章
47819瀏覽量
414863 -
遠程控制
+關注
關注
4文章
726瀏覽量
37033
發布評論請先 登錄
第二十六章 W55MH32?上位機搜索和配置示例
第二十三章 W55MH32 MQTT_OneNET示例
第十八章 W55MH32 FTP_Server示例
第十六章 W55MH32 PING示例
第十五章 W55MH32 SNMP示例
第十四章 W55MH32 TFTP示例
第九章 W55MH32 HTTP Server示例
第五章 W55MH32 UDP示例
WIZnet W55MH32以太網單片機開發教程第十一章 通用定時器(下篇)
WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)
W55MH32高性能以太網單片機教程 第九章 窗口看門狗(WWDG)
第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板
第一章 W55MH32 高性能以太網單片機的學習方法概述
即刻啟程,踏上W55MH32高性能以太網單片機學習之路!
WIZnet高性能以太網單片機W55MH32重磅發布!
一文讀懂:W55MH32 如何攜手微信小程序與 OneNET,實現以太網燈條調色自由(軟硬件開源)
評論