这是一个非常简单的示例代码,展示了如何使用PlatformIO通过串行接口与WLED JSON API进行交互。借助WLED JSON API,能够使用JSON API命令来控制任何其他具有串行能力的微控制器上闪存了WLED的MCU。运行代码可以更改WLED-MCU上LED灯条的颜色。
硬件环境:
- 发送的微控制器: esp32
- 接收的微控制器: esp32,搭载WLED0.15
- WLED版本: "WLED-0.15"- 波特率: 115200
使用硬件串口,不可以使用软件串口。SoftwareSerial 仅适用于非常低的波特率,绝对不适合 921600。如果可能,您应该始终使用 HardwareSerial;如果 SoftwareSerial 是不可或缺的,请使用尽可能低的波特率。 本代码用HardwareSerial,波特率115200
接线:
串口 | ESP32引脚功能 | 默认GPIO |
---|---|---|
TX | 串口发送 | GPIO17 |
RX | 串口接收 | GPIO16 |
注意:两者GND需共线 |
一、WLED固件安装
方法1.网页版安装(需要魔法,最简单的方法)
网页地址:https://install.wled.me/,将ESP32/ESP8266等WLED支持的单片机设备通过USB线连接到电脑上,然后点击install安装即可
-
方法2.ESP TOOLS安装
ESP32TOOLS安装与使用参考文章esptool.py 介绍和使用
乐鑫官方ESP32TOOLSgit网站:GitHub - espressif/esptool: Serial utility for flashing, provisioning, and interacting with Espressif SoCs
固件已上传夸克网盘:https://pan.quark.cn/s/a85f20146fff,该固件版本是0.15正式版
烧录进去即可
二、platformio环境搭建
首先新建工程文件,设置如下:
设置完成之后点击finish,在/include和/src目录下分别添加自定义函数WLED_API.h和WLED_API.cpp:
这两个文件就是我们自定义发送JSON API给WLED设备的代码了
WLED_API.h
#ifndef WLED_API_H
#define WLED_API_H
#include <Arduino.h>
// 通用 API
void wled_setColor(Stream &port, uint8_t r, uint8_t g, uint8_t b, int segment = 0);
void wled_setBrightness(Stream &port, uint8_t brightness);
void wled_power(Stream &port, bool on);
void wled_setEffect(Stream &port, int effectId);
// 解析响应
bool wled_parseState(const String &json, bool &onState, uint8_t &brightness);
#endif
WLED_API.cpp
#include "wled_api.h"
#include <ArduinoJson.h>
// 发送 JSON 到串口
void sendJson(Stream &port, JsonDocument &doc) {
String output;
serializeJson(doc, output);
port.println(output);
}
// 设置颜色
void wled_setColor(Stream &port, uint8_t r, uint8_t g, uint8_t b, int segment) {
StaticJsonDocument<256> doc;
JsonArray segs = doc.createNestedArray("seg");
JsonObject seg0 = segs.createNestedObject();
seg0["id"] = segment;
JsonArray col = seg0.createNestedArray("col");
JsonArray rgb = col.createNestedArray();
rgb.add(r);
rgb.add(g);
rgb.add(b);
sendJson(port, doc);
}
// 设置亮度
void wled_setBrightness(Stream &port, uint8_t brightness) {
StaticJsonDocument<128> doc;
doc["bri"] = brightness;
sendJson(port, doc);
}
// 开关
void wled_power(Stream &port, bool on) {
StaticJsonDocument<64> doc;
doc["on"] = on;
sendJson(port, doc);
}
// 设置效果
void wled_setEffect(Stream &port, int effectId) {
StaticJsonDocument<64> doc;
doc["fx"] = effectId;
sendJson(port, doc);
}
// 解析响应 JSON(简化为 on 和 brightness)
bool wled_parseState(const String &json, bool &onState, uint8_t &brightness) {
StaticJsonDocument<512> doc;
DeserializationError err = deserializeJson(doc, json);
if (err) return false;
if (!doc.containsKey("state")) return false;
JsonObject state = doc["state"];
onState = state["on"] | false;
brightness = state["bri"] | 0;
return true;
}
main.cpp
#include <Arduino.h>
#include <HardwareSerial.h>
#include "WLED_API.h"
/*
| 串口 | ESP32引脚功能 | 默认GPIO |
| -- | --------- | ------ |
| TX | 串口发送 | GPIO17 |---------WLED RX GPIO3
| RX | 串口接收 | GPIO16 |---------WLED TX GPIO1
ESP32 有三个硬件串口:
Serial → 通常接USB(调试使用)
Serial1 → 自定义(推荐用于主设备通信)
Serial2 → 自定义(备用通信)
*/
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
Serial1.begin(115200, SERIAL_8N1, 16, 17); // 初始化WLED串口指定PIN16 17为 TX RX
delay(1000);
// 控制 WLED
wled_power(Serial1, true);//打开灯带,打开后才能显示,传入false则关闭
wled_setBrightness(Serial1, 200);//设置亮度(0-255)
wled_setColor(Serial1, 255, 100, 0, 0); // 橙色
wled_setEffect(Serial1, 38); // 极光效果,效果id查找:https://kno.wled.ge/features/effects/
}
void loop() {
// 监听 WLED 响应并解析
if (Serial1.available()) {
String response = Serial1.readStringUntil('\n');
Serial.println("[WLED] Response:");
Serial.println(response);
bool isOn;
uint8_t bri;
if (wled_parseState(response, isOn, bri)) {
Serial.printf("Parsed: Power=%s, Brightness=%d\n", isOn ? "ON" : "OFF", bri);
} else {
Serial.println("Failed to parse WLED state.");
}
}
delay(500);
}
platformio.ini,需要加上monitor_speed = 115200以及lib_deps = bblanchon/ArduinoJson@^6.21.2,完整代码如下:
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = bblanchon/ArduinoJson@^6.21.2
参考网站:
WLED原项目链接:https://github.com/wled/WLED
本项目geihub链接:https://github.com/27daiwu/WLED_SERISE_Project
WLED项目JSON API查询网站:JSON API - WLED Project
WLED项目官网:Welcome to WLED - WLED Project