物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载导读本文讲解 NodeMCU 固件中 Somfy 模块docs/modules/somfy.md的完整用法它基于 ESP8266/ESP8285 的硬件定时器与 GPIO 中断在 433 MHz 频段上收发 Somfy RTS 遥控协议从而用一块开发板和几十元的 RF 收发模块替代原装遥控器控制 Somfy 电动卷帘/百叶窗。读完本文你将掌握硬件接线与晶振注意事项、somfy.sendcommand()发送控制指令、somfy.listen()监听遥控信号、以及 rolling code滚动码持久化与多窗帘场景的完整实战方案。模块概述与适用场景Somfy 模块为 NodeMCU 固件提供了一套简洁的接口用于通过 433.42 MHz 的 RF 发射器控制 Somfy 电动百叶窗同时也能监听原装 Somfy 遥控器发出的命令。其实现参考了开源项目 Nickduino Somfy RemoteArduino 版本协议细节可参见 Somfy RTS protocol 文档与 Arduino 论坛的相关讨论。该模块在 NodeMCU 固件中的源码位于 app/modules/somfy.c由 vsky279 贡献并维护自 2016-09-27 起收录。典型应用场景用一个 ESP8266 替代多个原装遥控器集中控制家里/办公室的多扇 Somfy 窗帘把窗帘控制接入 Lua 业务逻辑实现定时开关、联动光照传感器等自动化通过somfy.listen()监听原装遥控器的按键反向获取地址、命令与滚动码用于调试或复刻遥控器。硬件准备与接线必需的硬件一块 NodeMCU 开发板ESP8266/ESP8285标准 433 MHz RF 发射器用于发送命令可选433 MHz RF 接收器用于somfy.listen()监听。关于频率晶振的关键说明市面常见的 433 MHz RF 发射模块标称频率为 433.92 MHz而 Somfy 协议运行在433.42 MHz。文档建议把发射模块上的晶振更换为 433.42 MHz 的对应晶振以获得可靠的通信。不过也有用户反馈即使保留原厂 433.92 MHz 晶振也能正常工作——是否需要更换取决于实际发射距离与接收灵敏度。接线sendcommand(pin, ...)中的pin即发射器数据引脚所接的 GPIOlisten(pin, ...)中的pin是接收器数据引脚所接的 GPIO。两者可按需要接在同一块板子的任意可用 GPIO 上参考示例 lua_examples/somfy.lua 中使用 GPIO4 即引脚 4。-- 发射器数据脚接 GPIO4接收器数据脚可接其他 GPIO gpio.mode(4, gpio.OUTPUT, gpio.PULLUP)硬件定时器独占与其他模块的兼容性约束该模块发送命令时使用硬件定时器FRC1 定时器来精确产生协议波形因此它不能与同样占用硬件定时器的 NodeMCU 模块同时使用包括sigma deltapcmperfpwm如果固件中同时启用了这些模块在运行 Somfy 发送功能时可能产生冲突。此外从源码 app/modules/somfy.c 可见编译启用 Somfy 模块还强制要求固件开启GPIO_INTERRUPT与GPIO_INTERRUPT_HOOK两个编译选项用于接收监听否则编译直接报错#ifdef LUA_USE_MODULES_SOMFY #if !defined(GPIO_INTERRUPT_ENABLE) || !defined(GPIO_INTERRUPT_HOOK_ENABLE) #error Must have GPIO_INTERRUPT and GPIO_INTERRUPT_HOOK if using SOMFY module #endif #endif接收监听侧使用platform_gpio_register_intr_hook注册 GPIO 中断钩子见 app/modules/somfy.c这也解释了上述编译期约束的由来。somfy.sendcommand()发送 Somfy 控制命令sendcommand负责按照 Somfy 协议构造一帧数据并通过 RF 发射器发送。语法somfy.sendcommand(pin, remote_address, command, rolling_code, repeat_count, callback)参数说明参数说明pin接 RF 发射器数据脚的 GPIO 引脚号。remote_address遥控器地址。受控设备窗帘电机只会响应对应已编程的遥控器地址也就是你要“冒充”的那把遥控器的地址。command要发送的命令取值为somfy.UP、somfy.DOWN、somfy.PROG、somfy.STOP之一。rolling_code滚动码。每按一次按钮滚动码 1接收端只有在滚动码大于上次收到值且差值不超过一定窗口约为 100时才接受命令。因此滚动码必须持久化存储例如存到文件系统否则 ESP8266 复位后会丢失同步。repeat_count命令重复发送的次数。callback可选。命令发送完成后回调的函数用于串联多条命令例如把窗帘停在指定位置。返回值nil。源码层面的发送流程从 app/modules/somfy.c 可以看到sendcommand的底层实现大致如下校验引脚合法性并设为输出模式调用buildFrame()构造 7 字节协议帧加密密钥0xA7、命令、滚动码、地址并计算 4 位校验和、做混淆初始化 FRC1 硬件定时器platform_hw_timer_init把sendCommand状态机挂到定时器中断上由中断逐位输出波形唤醒脉冲9415 µs→ 静默89565 µs→ 硬件同步 → 软件同步4550 µs→ 56 bit 数据 → 帧间静默30415 µs并支持重复帧。帧结构与校验算法可在 app/modules/somfy.c 中找到实现frame[0] 0xA7; // Encryption key. Doesnt matter much frame[1] button 4; // Which button did you press? The 4 LSB will be the checksum frame[2] code 8; // Rolling code (big endian) frame[3] code; frame[4] remote 16; // Remote address frame[5] remote 8; frame[6] remote; // 校验和所有半字节(nibble)的 XOR仅保留低 4 位 for (uint8_t i 0; i 7; i) checksum ^ frame[i] ^ (frame[i] 4); checksum 0b1111; frame[1] | checksum; // 混淆从第 2 字节起逐个与前一个字节 XOR for (uint8_t i 1; i 7; i) frame[i] ^ frame[i-1];repeat_count 与“一步/全行程”的行为差异文档基于作者实际测试给出了一个很有价值的经验原装遥控器例如 TELIS 4 MODULIS RTS在按下“下”按钮时会在数据帧后额外附带 56 bit 信息缩短帧间间隔用于区分“短按一下走一步”和“长按一直到底”。由于该附加信息的加扰算法尚未公开NodeMCU 无法精确复刻。实测行为是repeat_count 2相当于短按窗帘只下降1 步repeat_count 16可以让窗帘完全下降到底。因此示例代码中把repeat_count设为 16 来模拟“长按到底”设为 2 来模拟“短按一步”。新遥控注册首次配对流程要在不触碰原装遥控器编程逻辑的前提下把 ESP8266“克隆”成一把新遥控器按文档给出的步骤选一个与原装遥控器不同的任意地址例如123选一个滚动码起点任意无符号整数均可从1开始是个好选择长按原装遥控器的PROG编程按钮直到窗帘轻微上下动一下进入编程模式执行somfy.sendcommand(4, 123, somfy.PROG, 1, 2)此时窗帘会有反应ESP8266 遥控器即注册成功之后执行somfy.sendcommand(4, 123, somfy.DOWN, 2, 16)即可将窗帘完全关闭。somfy.listen()监听遥控器命令listen通过 RF 接收器监听空中 Somfy 命令识别出完整帧后触发 Lua 回调。语法somfy.listen(pin, callback)参数说明参数说明pin接 RF 接收器数据脚的 GPIO 引脚号。callback(address, command, rc, frame)识别到 Somfy 命令时调用的函数传nil可停止监听。回调的四个参数address发送命令的遥控器地址command遥控器发送的命令取值为0到0xf之间的数字可对照somfy.UP、somfy.DOWN、somfy.PROG、somfy.STOPrc滚动码frame长度 10 的字符串包含捕获到的完整数据帧。返回值nil。示例somfy.listen(4, function(address, command, rc, frame) print((Address:\t0x%x\nCommand:\t0x%x\nRolling code:\t%d):format(address, command, rc)) print((Frame:\t..(%02x ):rep(#frame)):format(frame:byte(1, -1))) end)停止监听并解除 GPIO 占用、释放回调somfy.listen() -- 省略全部参数 somfy.listen(4, nil) -- 或显式传 nil源码层面的接收流程接收侧在 app/modules/somfy.c 实现了基于 GPIO 中断的状态机中断处理函数按边沿触发方式捕获每个电平跳变的时间间隔用 ±30%TOLERANCE_MIN 0.7、TOLERANCE_MAX 1.3的容差窗口匹配硬件同步、软件同步、半符号与整符号等特征时长累计 80 bit56 bit 数据 附加信息后投递到高优先级任务somfy_decode任务对载荷做去混淆、校验和验证然后解析出地址、命令与滚动码回调 Lua见 app/modules/somfy.c。实战多窗帘控制与滚动码持久化由于滚动码必须跨重启保持文档与示例 lua_examples/somfy.lua 都强调要把滚动码存入文件系统ESP8266 上即 SPIFFS。示例文件演示了一套完整的方案用sjson模块把配置保存到somfy.cfg文件结构形如{window1:{rc:1,address:123},window2:{rc:1,address:124}}每次发送命令前先rc rc 1再调用somfy.sendcommand采用延迟写盘 备份文件策略先写somfy.cfg并将旧文件改名为somfy.bak通过判断滚动码差值决定“立即保存”还是“65 秒后延迟保存”以显著减少对 Flash 的写次数延长寿命通过回调串联命令实现“完全下降 → 等待 → 完全上升 → 等待 → 逐格微调”的完整运动序列。示例中的核心函数节选local function down(remote, cb, par) par par or {} config[remote].rc config[remote].rc 1 somfy.sendcommand(pin, config[remote].address, somfy.DOWN, config[remote].rc, 16, function() wait(100, cb, par) end) writeconfig() end其中writeconfig()负责滚动码的延迟持久化。整个示例在 ESP8266 复位后会自动从somfy.cfg或备份somfy.bak读回配置保证滚动码同步不丢失。启用模块与编译约束Somfy 模块默认未编译进固件。如需启用需在 app/include/user_modules.h 中取消注释#define LUA_USE_MODULES_SOMFY同时必须确保固件开启 GPIO 中断与中断钩子支持否则 app/modules/somfy.c 的#error会终止编译。模块的 Lua 接口注册于 app/modules/somfy.c共暴露两个函数与四个命令常量Lua 符号值/说明somfy.sendcommand(pin, remote, cmd, rc, repeat, cb)发送命令somfy.listen(pin, cb)监听命令somfy.UP0x2somfy.STOP0x1somfy.DOWN0x4somfy.PROG0x8注意事项小结发送侧独占硬件定时器勿与sigma delta、pcm、perf、pwm同时使用监听侧依赖 GPIO 中断钩子固件编译时必须开启对应特性滚动码必须持久化且每次发送前 1建议参考 lua_examples/somfy.lua 的延迟写盘方案以保护 Flashrepeat_count 2模拟短按走一步repeat_count 16模拟长按全行程实际效果以你的电机型号为准若使用标准 433.92 MHz 发射模块通信距离不理想可更换为 433.42 MHz 晶振再试。进一步阅读模块文档docs/modules/somfy.md模块源码app/modules/somfy.c完整多窗帘示例lua_examples/somfy.lua硬件定时器接口app/platform/hw_timer.h模块编译开关app/include/user_modules.h赞分享物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载相关推荐ESPSomfy-RTS: 智能控制你的索弗(Somfy)遮阳帘ESPSomfy RTS: 智能控制你的索弗 Somfy 遮阳帘 项目介绍 ESPSomfy RTS 是一个专为索弗SomfyRTS系列窗帘和百叶窗设计的控告别手动拉窗帘ESP32打造智能窗帘控制系统告别手动拉窗帘ESP32打造智能窗帘控制系统 还在每天手动开关窗帘遇到恶劣天气忘记关窗出差时想远程调节家中光线本文将带你用Arduino ESP32开发嵌入式物联网驱动开发3步打造智能家居核心Arduino-ESP32 Matter协议窗帘控制系统实现指南3步打造智能家居核心Arduino ESP32 Matter协议窗帘控制系统实现指南 你是否还在为不同品牌智能设备无法互联互通而烦恼是否想过用不到50行代码嵌入式物联网驱动开发上一篇Ultimate Vocal Remover GUI v5.6AI音频分离技术的革命性突破下一篇Opik部署故障排除手册解决常见问题的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
