用 XOD 可视化编程为 Arduino 快速构建 LCD 菜单系统,零代码实现
硬件准备
| 元件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| DFRobot LCD/Keypad Shield(1602 + 5 键) | 1 |
软件环境
- XOD IDE(xod.io)
- 库安装:
File → Add Libraries…搜索bitrex/xod-menu-system
为什么需要菜单系统?
随着传感器/执行器增多,物理按键不够用,屏幕菜单成为必然。但传统 C++ 菜单库学习曲线陡峭、修改繁琐。XOD 的节点式拖拽编程天然适合快速原型,本项目封装了通用菜单节点库,支持:
- 任意深度的树形菜单(分支/叶子/拼接节点)
- 多种输入源:模拟键盘、编码器、按键矩阵等
- 多种输出:文本 LCD、OLED、串口调试等
- 参数修改即时生效,支持闪存字符串节省 RAM
核心节点架构(右侧控制链)
- 模拟输入节点:读取 A0 电压(键盘分压电阻网络)
- 按键解码节点:将电压映射为 Up/Down/Left/Right/Select 脉冲,含去抖动超时参数
- 菜单控制器节点:接收脉冲,维护菜单树状态,输出当前屏幕文本、选中叶子节点的
Invoke脉冲与参数值 - 显示驱动节点:标准库 16×2 LCD 节点,亦可替换为 OLED/其他
菜单树构建(左侧树形结构)
- Branch 节点:有输入/输出端口,包含多个子菜单,选中时下钻
- Leaf 节点:叶子菜单,无子菜单,选中时触发
Invoke输出脉冲 + 参数值 - Concat 节点:将多个子菜单串联为一组接入 Branch
根节点接入菜单控制器的 Tree 输入即可运行。支持多级嵌套,受限于目标 MCU 的 Flash/RAM。
输出扩展示例
Leaf 节点的 Invoke 脉冲可驱动翻转触发器控制继电器/LED,或写入 Buffer 节点保存参数供后续逻辑使用。第二个示例演示:菜单控制器接收计数器值作为参数输入,Leaf A 选中时将当前值存入 Buffer,屏幕首行显示已存值、次行显示实时值。
已知限制与规避
- 必须至少包含一个 Branch 节点才能编译通过
- “返回顶层”功能尚未实现
- 4 行显示的 Leaf 节点尚未适配
- 常量字符串占用 RAM,提供
flash-string变通节点(需在节点内部 C++ 代码修改文本) - ID 端口暂无功能,预留用于面包屑导航
后续规划
- ARM 平台(ESP32/STM32)测试
- 增加更多输入/输出节点类型
- 探索编译期元编程将更多数据放入 Flash 进一步降低 RAM 占用
获取资源
- XOD 库主页:bitrex/xod-menu-system
- 示例工程文件:
xodmenusystemrev1_1_4-1-19_fLVYrcSgbX.xodball(双击直接在 XOD IDE 打开)
制造工艺
- 仅用 Arduino 构建 DTMF 解码器 – 无需额外 IC
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino 制作超声波悬浮装置:分步指南
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
- Arduino 自动化 Chrome 恐龙游戏 - LDR 光敏电阻 + Python 实现全自动跳跃
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY