ESP32串口收发控制WLED设备(附WLED安装方法)VSCODE+PlatformIO IDE

这是一个非常简单的示例代码,展示了如何使用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

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值