
WLED JSON IR Remote用 ir.json 把任意紅外遙控器變成 WLED 控制器【免費(fèi)下載鏈接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!項(xiàng)目地址: https://gitcode.com/GitHub_Trending/wl/WLEDWLED 的 JSON IR Remote 是一種“零編譯”的紅外遙控?cái)U(kuò)展方案用戶不需要修改 C 代碼、不需要重新編譯固件只需上傳一個(gè)名為ir.json的 JSON 配置文件就可以把任何與 WLED 紅外接收頭兼容的遙控器按鍵映射到任意 HTTP Request API 或 JSON API 命令。讀完本文你將掌握ir.json的完整鍵值規(guī)范鍵、cmd、rpt、label、PL/FX/FP、三種命令形態(tài)的寫(xiě)法、可重復(fù)按鍵的底層機(jī)制以及如何利用倉(cāng)庫(kù)自帶的 7 個(gè)遙控器配置模板和 ir_json_maker.py 批量生成自己的配置。設(shè)計(jì)目標(biāo)讓遙控器適配 WLED而不是讓 WLED 適配遙控器WLED 固件內(nèi)置了 7 種固定遙控器解碼方案24 鍵、40 鍵、44 鍵、21 鍵、6 鍵、9 鍵及 24 鍵 CT 白鍵版每種對(duì)應(yīng)一段硬編碼的 C 代碼。當(dāng)你手里的遙控器不屬于這些型號(hào)時(shí)傳統(tǒng)做法是改源碼重新編譯——這正是 JSON IR Remote 要消除的步驟。從源碼結(jié)構(gòu)看這一機(jī)制由 wled00/ir.cpp 中的decodeIR()統(tǒng)一分發(fā)if (irEnabled 8) { // any remote configurable with ir.json file decodeIRJson(code); stateUpdated(CALL_MODE_BUTTON_PRESET); return; }即紅外遙控類型取值為8時(shí)所有解碼邏輯被旁路改為在 Flash 文件系統(tǒng)的/ir.json文件中按鍵查表。該類型在 Web 界面上顯示為 JSON remote見(jiàn) settings_leds.htm 中的option value8JSON remote/option以及 index.js 中的8: json-remote映射。配置持久化時(shí)寫(xiě)入hw.ir.type字段cfg.cpp 中CJSON(irEnabled, hw[ir][type])因此重啟后依然生效。三步完成配置ir.json的完整使用流程只有三步與官方 readme 一致上傳配置文件通過(guò)設(shè)備 IP 的/edit頁(yè)面把名為ir.json的配置文件上傳到主控板。文件可以選自倉(cāng)庫(kù) usermods/JSON_IR_remote/ 目錄下按按鍵數(shù)命名的現(xiàn)成模板也可以自己編寫(xiě)格式見(jiàn)下文。設(shè)置 IR 引腳在 設(shè)置 LED 設(shè)置 頁(yè)面把 IR 引腳設(shè)置為紅外接收頭所接的 GPIO。該參數(shù)由 set.cpp 中的IR參數(shù)處理并經(jīng)PinManager::allocatePin()校驗(yàn)分配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紅外功能實(shí)際不可用。選擇遙控類型在 設(shè)置 同步接口 頁(yè)面將“紅外遙控器”一項(xiàng)選為JSON Remote內(nèi)部即IT8。ir.json 文件格式詳解文件是一個(gè) JSON 對(duì)象每個(gè)鍵是十六進(jìn)制編碼的 IR 碼例如0xFF629D值為該按鍵按下時(shí)要執(zhí)行的命令描述對(duì)象。各屬性說(shuō)明如下屬性必填說(shuō)明鍵如0xFF629D是十六進(jìn)制 IR 碼。源碼按0x%lX:格式精確拼鍵查表因此鍵必須寫(xiě)成 24 位或更寬十六進(jìn)制并帶0x前綴cmd是按鍵執(zhí)行的命令可以是 HTTP API 字符串、JSON 對(duì)象或以!開(kāi)頭的 C 函數(shù)名rpt否布爾值。當(dāng)命令可重復(fù)觸發(fā)但不含~字符時(shí)置為true長(zhǎng)按時(shí)才會(huì)持續(xù)重復(fù)執(zhí)行l(wèi)abel否僅用于編輯時(shí)的人類可讀標(biāo)注運(yùn)行時(shí)無(wú)作用PL/FX/FP條件僅在使用!presetFallback時(shí)提供要加載的預(yù)置、回退效果、回退調(diào)色板編號(hào)desc/pos/cmnt否倉(cāng)庫(kù)模板文件中的額外元數(shù)據(jù)文件描述、按鍵位置、備注運(yùn)行邏輯同樣忽略它們官方示例完整繼承自 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的開(kāi)關(guān)命令、含~的相對(duì)增量命令、JSON 對(duì)象命令、以及 C 函數(shù)命令。cmd 的三種命令形態(tài)cmd屬性的寫(xiě)法由源碼 decodeIRJson() 決定共三條執(zhí)行路徑1. HTTP Request API 命令字符串0xFF629D: {cmd: T2, rpt: true}源碼會(huì)把字符串包裝成winT2形式后交給handleSet()處理——與通過(guò) URL 直接發(fā)?winT2完全等價(jià)因此 WLED 全部 HTTP 短命令語(yǔ)法都能用T2開(kāi)關(guān)切換T1開(kāi)T0關(guān)A~16亮度相對(duì)增加 16~表示相對(duì)增量SI~16/SI~-16效果速度增減CY0FX~清空選中分段并循環(huán)切換到下一個(gè)效果倉(cāng)庫(kù) 9 鍵模板中“Select”鍵即此寫(xiě)法FP~/FP~循環(huán)上一/下一個(gè)調(diào)色板。還有一個(gè)源碼層面的細(xì)節(jié)如果當(dāng)前處于“應(yīng)用到所有選中間”模式且命令中沒(méi)有指定分段無(wú)SS參數(shù)固件會(huì)自動(dòng)追加SS主分段號(hào)讓命令只作用于主分段避免誤改其他分段。2. JSON API 對(duì)象命令0xFF38C7: {cmd: {bri: 10}}cmd為 JSON 對(duì)象時(shí)走deserializeState(jsonCmdObj, CALL_MODE_BUTTON_PRESET)即按 WLED JSON API/state的入?yún)⒏袷秸w應(yīng)用狀態(tài)。除常規(guī)狀態(tài)字段外源碼還支持兩個(gè)專門(mén)特性這是 readme 未提及、但從 decodeIRJson() 可確認(rèn)的實(shí)現(xiàn)事實(shí)psave{cmd: {psave: 5, bri: 80, ...}}會(huì)把該 JSON 保存為名為IR Preset 5的預(yù)置編號(hào) 1–250而不是立即應(yīng)用seg當(dāng)處于“應(yīng)用到所有選中間”模式且seg為數(shù)組時(shí)固件取數(shù)組第一個(gè)分段對(duì)象、去掉其id后應(yīng)用到所有選中間實(shí)現(xiàn)“一個(gè)按鍵統(tǒng)一改寫(xiě)多個(gè)分段”。3. 受限 C 函數(shù)命令!前綴0xFF22DD: {cmd: !presetFallback, PL: 1, FX: 16, FP: 6}以!開(kāi)頭的字符串調(diào)用固件內(nèi)置函數(shù)目前僅開(kāi)放三個(gè)命令源碼匹配前綴行為!incBrightness!incBri亮度升到下一個(gè)檔位!decBrightness!decBri亮度降到下一個(gè)檔位!presetFallback!presetF加載預(yù)置PL若該預(yù)置不存在則回退使用效果FX與調(diào)色板FP注意源碼是按前綴匹配startsWith判斷的且亮度檔位并非線性步進(jìn)而是沿一組預(yù)定義的幾何級(jí)數(shù)檔位表移動(dòng)const uint8_t brightnessSteps[] { 5, 7, 9, 12, 16, 20, 26, 34, 43, 56, 72, 93, 119, 154, 198, 255 };ir.cpp。低亮度時(shí)步進(jìn)細(xì)、高亮度時(shí)步進(jìn)粗視覺(jué)體感比固定步長(zhǎng)更均勻。!presetFallback的PL缺省為 1、FX缺省隨機(jī)、FP缺省為 0即三個(gè)參數(shù)可以部分省略。長(zhǎng)按重復(fù)機(jī)制~與rpt紅外遙控器長(zhǎng)按某鍵時(shí)會(huì)持續(xù)發(fā)送同一碼但 WLED 的解碼器IRrecv/IRremote在收到“重復(fù)碼”時(shí)會(huì)給出特殊值0xFFFFFFFF。源碼中的處理鏈條是decodeIRJson()執(zhí)行命令前若命令字符串含~或條目聲明了rpt: true則記錄lastValidCode codeir.cpp收到重復(fù)碼時(shí)decodeIR()進(jìn)入applyRepeatActions()static void applyRepeatActions() { if (irEnabled 8) { decodeIRJson(lastValidCode); // 用上次有效碼重放 JSON 命令 stateUpdated(CALL_MODE_BUTTON_PRESET); return; } ... }也就是說(shuō)重復(fù)碼會(huì)完整重放上一次的 JSON 命令。這正是A~16這類相對(duì)增量命令能實(shí)現(xiàn)“長(zhǎng)按連續(xù)調(diào)光”的原因——每次重放都相對(duì)當(dāng)前值再 16。而絕對(duì)值命令如{bri: 10}重放無(wú)意義含~時(shí)也不會(huì)被標(biāo)記為可重復(fù)對(duì)于T2這類確實(shí)可重復(fù)但字符串里沒(méi)有~的命令必須顯式寫(xiě)rpt: true。從源碼看 decodeIRJson 的完整執(zhí)行流結(jié)合 decodeIRJson()一次按鍵的完整鏈路如下取鎖requestJSONBufferLock(JSON_LOCK_IR)獲取共享 JSON 緩沖區(qū)鎖與其他 JSON 解析邏輯互斥查表拼出鍵0x%lX:后調(diào)用readObjectFromFile(/ir.json, objKey, pDoc)。若文件中找不到該碼fdo為空——此時(shí)若/ir.json文件本身都不存在會(huì)置errorFlag ERR_FS_IRLOADWeb 界面同步頁(yè)可看到相應(yīng)提示index.js 中對(duì)應(yīng)錯(cuò)誤文案為Missing ir.json.分流執(zhí)行cmd是!字符串 → C 函數(shù)cmd是普通字符串 → 加win前綴走h(yuǎn)andleSet()cmd是對(duì)象 →deserializeState()或savePreset()解鎖并廣播releaseJSONBufferLock()后由外層decodeIR()調(diào)stateUpdated(CALL_MODE_BUTTON_PRESET)把本次改動(dòng)當(dāng)作“按鈕預(yù)置”來(lái)源廣播給 MQTT/UDP 等下游。命令分發(fā)后handleIR()以約 120ms 的輪詢節(jié)奏調(diào)用irrecv-decode()取碼ir.cpp解碼期間若燈帶正在刷幀且距上次檢查不足 240ms 會(huì)讓出本次檢查避免占用渲染時(shí)間。倉(cāng)庫(kù)自帶的遙控器配置模板usermods/JSON_IR_remote/ 目錄提供了 7 個(gè)按按鍵數(shù)命名的現(xiàn)成配置覆蓋常見(jiàn)紅外遙控面板。選取按鍵數(shù)與你的遙控器一致的模板再按實(shí)際標(biāo)注微調(diào)即可——官方 readme 特別提示許多不同外觀的遙控器內(nèi)部共用同一套編碼只是按鍵標(biāo)注不同。文件說(shuō)明6-key_ir.json6 鍵學(xué)習(xí)遙控器含pos1x1–6x1位置標(biāo)注開(kāi)關(guān)映射為T(mén)2上下鍵映射為調(diào)色板循環(huán)FP~/FP~9-key_ir.json9 鍵A/B/C 映射為預(yù)置 1/2/3方向鍵映射為速度與亮度 ±1621-key_ir.json21 鍵彩色面板24-key_ir.json24 鍵與固件內(nèi)置 24 鍵遙控同碼集可用 JSON 方式重新定義其行為32-key_ir.json32 鍵40-key-black_ir.json / 40-key-blue_ir.json40 鍵黑/藍(lán)兩版鍵位略有差異44-key_ir.json44 鍵含 DIY 鍵與色溫鍵以 9-key_ir.json 為例完整文件僅 40 余行展示了模板的標(biāo)準(zhǔn)結(jié)構(gòu)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的鍵來(lái)自遙控器實(shí)際發(fā)出的十六進(jìn)制碼獲取方式在源碼里已有內(nèi)置支持handleIR()在串口開(kāi)啟的情況下會(huì)把每幀解碼結(jié)果打印出來(lái)if (results.value ! 0 serialCanTX) { Serial.printf_P(PSTR(IR recv: 0x%lX\n), (unsigned long)results.value); }因此實(shí)操流程為先在 LED 設(shè)置里選好 IR 引腳、遙控類型任選只要irEnabled 0接收器就會(huì)初始化開(kāi)啟 WLED 串口輸出用遙控器逐鍵按下從串口日志中抄下IR recv:后面的十六進(jìn)制碼即可作為ir.json的鍵。長(zhǎng)按時(shí)觀察到的重復(fù)值0xFFFFFFFF不需要寫(xiě)入配置——它由applyRepeatActions()自動(dòng)處理。用 ir_json_maker.py 批量生成配置當(dāng)遙控器按鍵多、標(biāo)注復(fù)雜時(shí)手寫(xiě) JSON 容易出錯(cuò)。倉(cāng)庫(kù)提供了 ir_json_maker.py配合 IR_Remote_Codes.xlsx 批量生成各按鍵數(shù)模板。腳本邏輯基于 openpyxl為每個(gè)工作表生成一個(gè)表名_ir.jsondesc字段取表名每行按表頭映射出codeIR 碼、row/col生成pos、comment生成cmnt、rpt、cmd、顏色字段等若某行未直接給cmd但給了主/次/第三色十六進(jìn)制腳本合成調(diào)色板命令FP5CLh主色C2h次色C3h第三色FP5即自定義三色調(diào)色板第三色缺省時(shí)由主色做 HSV 色相偏移 降飽和自動(dòng)生成鍵名直接命中內(nèi)置 CSS 命名色表Red、Blue、GoldenRod 等約 140 種時(shí)同樣自動(dòng)合成FP5CL...命令。運(yùn)行方式在usermods/JSON_IR_remote/目錄下pip install openpyxl python ir_json_maker.py腳本會(huì)依次打印Parsing worksheet 表名并在同目錄輸出各表名_ir.json。修改 xlsx 中任一行后重跑即可再生成適合把模板配置納入版本管理。常見(jiàn)問(wèn)題與限制按鍵無(wú)反應(yīng)優(yōu)先確認(rèn)三處——/ir.json是否已上傳成功同步接口頁(yè)會(huì)報(bào) “Missing ir.json.”、IR 引腳是否分配成功、遙控類型是否已選 “JSON remote”。另外檢查 JSON 鍵的寫(xiě)法源碼按0x%lX:精確匹配0xff629d這類小寫(xiě)或無(wú)前綴寫(xiě)法不會(huì)命中源碼用%lX大寫(xiě)格式拼鍵從源碼結(jié)構(gòu)看應(yīng)統(tǒng)一寫(xiě)成0xFF629D樣式的大寫(xiě)十六進(jìn)制。長(zhǎng)按不連續(xù)檢查命令是否含~或是否為rpt: true的條目!incBrightness等 C 函數(shù)路徑天然支持重復(fù)源碼中它們會(huì)主動(dòng)記錄lastValidCode。命令只作用于單個(gè)分段HTTP 命令在未指定SS時(shí)會(huì)被自動(dòng)綁定到主分段想批量改寫(xiě)所有選中間請(qǐng)改用 JSON 對(duì)象命令并配合seg字段或先調(diào)整界面頂部的“應(yīng)用到所有選中間”開(kāi)關(guān)狀態(tài)。適用前提該機(jī)制依賴 WLED 固件的紅外接收功能WLED_DISABLE_INFRARED未啟用的構(gòu)建、IRremote 系解碼庫(kù)支持的協(xié)議模板均為 NEC 系 24 位碼0xFFxxxx以及 Web 文件系統(tǒng)可寫(xiě)LFS/FFatFS 分區(qū)。若固件構(gòu)建禁用了紅外支持irEnabled相關(guān)代碼整體不參與編譯JSON Remote 也就無(wú)從談起。小結(jié)JSON IR Remote 把 WLED 的紅外遙控從“固件寫(xiě)死 7 種型號(hào)”變成了“Flash 上一份 JSON 說(shuō)了算”ir.json的每個(gè)鍵是一個(gè)十六進(jìn)制 IR 碼cmd可以寫(xiě) HTTP API、JSON API 對(duì)象或三個(gè)受限 C 函數(shù)之一~/rpt機(jī)制讓長(zhǎng)按連續(xù)調(diào)節(jié)成立。配合 usermods/JSON_IR_remote/ 下的 7 個(gè)按鍵數(shù)模板、串口碼捕獲與 ir_json_maker.py 批量生成工具絕大多數(shù)市售通用紅外遙控器都能在不動(dòng)一行 C 代碼的情況下成為 WLED 的專用控制器。核心實(shí)現(xiàn)全部集中在 wled00/ir.cpp 的decodeIRJson()L556-L633與applyRepeatActions()L635-L661便于進(jìn)一步定制?!久赓M(fèi)下載鏈接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!項(xiàng)目地址: https://gitcode.com/GitHub_Trending/wl/WLED創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考