ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

WLED JSON IR Remote:用 ir.json 把任意红外遥控器变成 WLED 控制器

WLED JSON IR Remote:用 ir.json 把任意红外遥控器变成 WLED 控制器 WLED JSON IR Remote用 ir.json 把任意红外遥控器变成 WLED 控制器【免费下载链接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!项目地址: https://gitcode.com/GitHub_Trending/wl/WLEDWLED 的 JSON IR Remote 是一种“零编译”的红外遥控扩展方案用户不需要修改 C 代码、不需要重新编译固件只需上传一个名为ir.json的 JSON 配置文件就可以把任何与 WLED 红外接收头兼容的遥控器按键映射到任意 HTTP Request API 或 JSON API 命令。读完本文你将掌握ir.json的完整键值规范键、cmd、rpt、label、PL/FX/FP、三种命令形态的写法、可重复按键的底层机制以及如何利用仓库自带的 7 个遥控器配置模板和 ir_json_maker.py 批量生成自己的配置。设计目标让遥控器适配 WLED而不是让 WLED 适配遥控器WLED 固件内置了 7 种固定遥控器解码方案24 键、40 键、44 键、21 键、6 键、9 键及 24 键 CT 白键版每种对应一段硬编码的 C 代码。当你手里的遥控器不属于这些型号时传统做法是改源码重新编译——这正是 JSON IR Remote 要消除的步骤。从源码结构看这一机制由 wled00/ir.cpp 中的decodeIR()统一分发if (irEnabled 8) { // any remote configurable with ir.json file decodeIRJson(code); stateUpdated(CALL_MODE_BUTTON_PRESET); return; }即红外遥控类型取值为8时所有解码逻辑被旁路改为在 Flash 文件系统的/ir.json文件中按键查表。该类型在 Web 界面上显示为 JSON remote见 settings_leds.htm 中的option value8JSON remote/option以及 index.js 中的8: json-remote映射。配置持久化时写入hw.ir.type字段cfg.cpp 中CJSON(irEnabled, hw[ir][type])因此重启后依然生效。三步完成配置ir.json的完整使用流程只有三步与官方 readme 一致上传配置文件通过设备 IP 的/edit页面把名为ir.json的配置文件上传到主控板。文件可以选自仓库 usermods/JSON_IR_remote/ 目录下按按键数命名的现成模板也可以自己编写格式见下文。设置 IR 引脚在 设置 LED 设置 页面把 IR 引脚设置为红外接收头所接的 GPIO。该参数由 set.cpp 中的IR参数处理并经PinManager::allocatePin()校验分配int hw_ir_pin request-arg(F(IR)).toInt(); if (PinManager::allocatePin(hw_ir_pin,false, PinOwner::IR)) { irPin hw_ir_pin; } else { irPin -1; } irEnabled request-arg(F(IT)).toInt(); initIR();若引脚分配失败irPin置为 -1红外功能实际不可用。选择遥控类型在 设置 同步接口 页面将“红外遥控器”一项选为JSON Remote内部即IT8。ir.json 文件格式详解文件是一个 JSON 对象每个键是十六进制编码的 IR 码例如0xFF629D值为该按键按下时要执行的命令描述对象。各属性说明如下属性必填说明键如0xFF629D是十六进制 IR 码。源码按0x%lX:格式精确拼键查表因此键必须写成 24 位或更宽十六进制并带0x前缀cmd是按键执行的命令可以是 HTTP API 字符串、JSON 对象或以!开头的 C 函数名rpt否布尔值。当命令可重复触发但不含~字符时置为true长按时才会持续重复执行label否仅用于编辑时的人类可读标注运行时无作用PL/FX/FP条件仅在使用!presetFallback时提供要加载的预置、回退效果、回退调色板编号desc/pos/cmnt否仓库模板文件中的额外元数据文件描述、按键位置、备注运行逻辑同样忽略它们官方示例完整继承自 readme.md{ 0xFF629D: {cmd: T2, rpt: true, label: Toggle on/off}, 0xFF9867: {cmd: A~16, label: Inc brightness}, 0xFF38C7: {cmd: {bri: 10}, label: Dim to 10}, 0xFF22DD: {cmd: !presetFallback, PL: 1, FX: 16, FP: 6, label: Preset 1 or fallback to Saw - Party} }四种典型条目分别展示了带rpt的开关命令、含~的相对增量命令、JSON 对象命令、以及 C 函数命令。cmd 的三种命令形态cmd属性的写法由源码 decodeIRJson() 决定共三条执行路径1. HTTP Request API 命令字符串0xFF629D: {cmd: T2, rpt: true}源码会把字符串包装成winT2形式后交给handleSet()处理——与通过 URL 直接发?winT2完全等价因此 WLED 全部 HTTP 短命令语法都能用T2开关切换T1开T0关A~16亮度相对增加 16~表示相对增量SI~16/SI~-16效果速度增减CY0FX~清空选中分段并循环切换到下一个效果仓库 9 键模板中“Select”键即此写法FP~/FP~循环上一/下一个调色板。还有一个源码层面的细节如果当前处于“应用到所有选中间”模式且命令中没有指定分段无SS参数固件会自动追加SS主分段号让命令只作用于主分段避免误改其他分段。2. JSON API 对象命令0xFF38C7: {cmd: {bri: 10}}cmd为 JSON 对象时走deserializeState(jsonCmdObj, CALL_MODE_BUTTON_PRESET)即按 WLED JSON API/state的入参格式整体应用状态。除常规状态字段外源码还支持两个专门特性这是 readme 未提及、但从 decodeIRJson() 可确认的实现事实psave{cmd: {psave: 5, bri: 80, ...}}会把该 JSON 保存为名为IR Preset 5的预置编号 1–250而不是立即应用seg当处于“应用到所有选中间”模式且seg为数组时固件取数组第一个分段对象、去掉其id后应用到所有选中间实现“一个按键统一改写多个分段”。3. 受限 C 函数命令!前缀0xFF22DD: {cmd: !presetFallback, PL: 1, FX: 16, FP: 6}以!开头的字符串调用固件内置函数目前仅开放三个命令源码匹配前缀行为!incBrightness!incBri亮度升到下一个档位!decBrightness!decBri亮度降到下一个档位!presetFallback!presetF加载预置PL若该预置不存在则回退使用效果FX与调色板FP注意源码是按前缀匹配startsWith判断的且亮度档位并非线性步进而是沿一组预定义的几何级数档位表移动const uint8_t brightnessSteps[] { 5, 7, 9, 12, 16, 20, 26, 34, 43, 56, 72, 93, 119, 154, 198, 255 };ir.cpp。低亮度时步进细、高亮度时步进粗视觉体感比固定步长更均匀。!presetFallback的PL缺省为 1、FX缺省随机、FP缺省为 0即三个参数可以部分省略。长按重复机制~与rpt红外遥控器长按某键时会持续发送同一码但 WLED 的解码器IRrecv/IRremote在收到“重复码”时会给出特殊值0xFFFFFFFF。源码中的处理链条是decodeIRJson()执行命令前若命令字符串含~或条目声明了rpt: true则记录lastValidCode codeir.cpp收到重复码时decodeIR()进入applyRepeatActions()static void applyRepeatActions() { if (irEnabled 8) { decodeIRJson(lastValidCode); // 用上次有效码重放 JSON 命令 stateUpdated(CALL_MODE_BUTTON_PRESET); return; } ... }也就是说重复码会完整重放上一次的 JSON 命令。这正是A~16这类相对增量命令能实现“长按连续调光”的原因——每次重放都相对当前值再 16。而绝对值命令如{bri: 10}重放无意义含~时也不会被标记为可重复对于T2这类确实可重复但字符串里没有~的命令必须显式写rpt: true。从源码看 decodeIRJson 的完整执行流结合 decodeIRJson()一次按键的完整链路如下取锁requestJSONBufferLock(JSON_LOCK_IR)获取共享 JSON 缓冲区锁与其他 JSON 解析逻辑互斥查表拼出键0x%lX:后调用readObjectFromFile(/ir.json, objKey, pDoc)。若文件中找不到该码fdo为空——此时若/ir.json文件本身都不存在会置errorFlag ERR_FS_IRLOADWeb 界面同步页可看到相应提示index.js 中对应错误文案为Missing ir.json.分流执行cmd是!字符串 → C 函数cmd是普通字符串 → 加win前缀走handleSet()cmd是对象 →deserializeState()或savePreset()解锁并广播releaseJSONBufferLock()后由外层decodeIR()调stateUpdated(CALL_MODE_BUTTON_PRESET)把本次改动当作“按钮预置”来源广播给 MQTT/UDP 等下游。命令分发后handleIR()以约 120ms 的轮询节奏调用irrecv-decode()取码ir.cpp解码期间若灯带正在刷帧且距上次检查不足 240ms 会让出本次检查避免占用渲染时间。仓库自带的遥控器配置模板usermods/JSON_IR_remote/ 目录提供了 7 个按按键数命名的现成配置覆盖常见红外遥控面板。选取按键数与你的遥控器一致的模板再按实际标注微调即可——官方 readme 特别提示许多不同外观的遥控器内部共用同一套编码只是按键标注不同。文件说明6-key_ir.json6 键学习遥控器含pos1x1–6x1位置标注开关映射为T2上下键映射为调色板循环FP~/FP~9-key_ir.json9 键A/B/C 映射为预置 1/2/3方向键映射为速度与亮度 ±1621-key_ir.json21 键彩色面板24-key_ir.json24 键与固件内置 24 键遥控同码集可用 JSON 方式重新定义其行为32-key_ir.json32 键40-key-black_ir.json / 40-key-blue_ir.json40 键黑/蓝两版键位略有差异44-key_ir.json44 键含 DIY 键与色温键以 9-key_ir.json 为例完整文件仅 40 余行展示了模板的标准结构desc文件描述 每键label/cmnt/cmd{ desc: 9-key, 0xFF629D: { label: Power, cmd: T2 }, 0xFF22DD: { label: A, cmnt: Preset 1, cmd: PL1 }, 0xFF30CF: { label: Left, cmnt: Speed -, cmd: SI~-16 }, 0xFF18E7: { label: Select, cmnt: Cycle effects, cmd: CY0FX~ } }如何拿到自己遥控器的 IR 码ir.json的键来自遥控器实际发出的十六进制码获取方式在源码里已有内置支持handleIR()在串口开启的情况下会把每帧解码结果打印出来if (results.value ! 0 serialCanTX) { Serial.printf_P(PSTR(IR recv: 0x%lX\n), (unsigned long)results.value); }因此实操流程为先在 LED 设置里选好 IR 引脚、遥控类型任选只要irEnabled 0接收器就会初始化开启 WLED 串口输出用遥控器逐键按下从串口日志中抄下IR recv:后面的十六进制码即可作为ir.json的键。长按时观察到的重复值0xFFFFFFFF不需要写入配置——它由applyRepeatActions()自动处理。用 ir_json_maker.py 批量生成配置当遥控器按键多、标注复杂时手写 JSON 容易出错。仓库提供了 ir_json_maker.py配合 IR_Remote_Codes.xlsx 批量生成各按键数模板。脚本逻辑基于 openpyxl为每个工作表生成一个表名_ir.jsondesc字段取表名每行按表头映射出codeIR 码、row/col生成pos、comment生成cmnt、rpt、cmd、颜色字段等若某行未直接给cmd但给了主/次/第三色十六进制脚本合成调色板命令FP5CLh主色C2h次色C3h第三色FP5即自定义三色调色板第三色缺省时由主色做 HSV 色相偏移 降饱和自动生成键名直接命中内置 CSS 命名色表Red、Blue、GoldenRod 等约 140 种时同样自动合成FP5CL...命令。运行方式在usermods/JSON_IR_remote/目录下pip install openpyxl python ir_json_maker.py脚本会依次打印Parsing worksheet 表名并在同目录输出各表名_ir.json。修改 xlsx 中任一行后重跑即可再生成适合把模板配置纳入版本管理。常见问题与限制按键无反应优先确认三处——/ir.json是否已上传成功同步接口页会报 “Missing ir.json.”、IR 引脚是否分配成功、遥控类型是否已选 “JSON remote”。另外检查 JSON 键的写法源码按0x%lX:精确匹配0xff629d这类小写或无前缀写法不会命中源码用%lX大写格式拼键从源码结构看应统一写成0xFF629D样式的大写十六进制。长按不连续检查命令是否含~或是否为rpt: true的条目!incBrightness等 C 函数路径天然支持重复源码中它们会主动记录lastValidCode。命令只作用于单个分段HTTP 命令在未指定SS时会被自动绑定到主分段想批量改写所有选中间请改用 JSON 对象命令并配合seg字段或先调整界面顶部的“应用到所有选中间”开关状态。适用前提该机制依赖 WLED 固件的红外接收功能WLED_DISABLE_INFRARED未启用的构建、IRremote 系解码库支持的协议模板均为 NEC 系 24 位码0xFFxxxx以及 Web 文件系统可写LFS/FFatFS 分区。若固件构建禁用了红外支持irEnabled相关代码整体不参与编译JSON Remote 也就无从谈起。小结JSON IR Remote 把 WLED 的红外遥控从“固件写死 7 种型号”变成了“Flash 上一份 JSON 说了算”ir.json的每个键是一个十六进制 IR 码cmd可以写 HTTP API、JSON API 对象或三个受限 C 函数之一~/rpt机制让长按连续调节成立。配合 usermods/JSON_IR_remote/ 下的 7 个按键数模板、串口码捕获与 ir_json_maker.py 批量生成工具绝大多数市售通用红外遥控器都能在不动一行 C 代码的情况下成为 WLED 的专用控制器。核心实现全部集中在 wled00/ir.cpp 的decodeIRJson()L556-L633与applyRepeatActions()L635-L661便于进一步定制。【免费下载链接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!项目地址: https://gitcode.com/GitHub_Trending/wl/WLED创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表