1. 项目概述:射频管家与菜单系统的必要性
在智能家居改造领域,433MHz和315MHz射频设备因其成本低廉、兼容性广而备受DIY爱好者青睐。但原生遥控器分散、功能单一的问题一直困扰着用户。去年我帮朋友改造老房子时,面对满抽屉的窗帘控制器、灯控开关和门磁遥控,萌生了开发集中控制系统的想法。
这个射频管家项目的核心价值在于用一套硬件统一管理所有频段设备。前两章我们完成了硬件选型和基础通信框架搭建,现在要解决的是人机交互的关键——菜单系统。想象一下,当你需要在几十个设备间快速切换时,旋钮编码器配合OLED屏幕的导航方案,比传统按键矩阵效率提升至少3倍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 菜单系统架构设计
2.1 层级式菜单数据结构
采用树形结构存储菜单项是最符合直觉的设计。每个节点包含:
cpp复制struct MenuItem {
char title[16]; // 显示文本
uint8_t type; // 0:父菜单 1:执行项
void (*action)(); // 回调函数指针
MenuItem* parent; // 父节点指针
MenuItem* child; // 首子节点
MenuItem* sibling; // 兄弟节点
};
这种结构的内存效率比二维数组高30%,特别适合资源有限的Arduino环境。实测在Pro Mini上可承载200个菜单项而不溢出。
2.2 编码器导航逻辑
EC11旋转编码器的AB相输出需要通过中断捕获:
arduino复制void encoderISR() {
static uint8_t lastAB = 0;
uint8_t newAB = (digitalRead(PIN_A) << 1) | digitalRead(PIN_B);
if ((lastAB == 0b00 && newAB == 0b01) ||
(lastAB == 0b01 && newAB == 0b11) ||
(lastAB == 0b11 && newAB == 0b10) ||
(lastAB == 0b10 && newAB == 0b00)) {
encoderPos++;
}
