使用 XOD 的无代码 LCD 菜单生成
组件和用品
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
为 Arduino 开发板供电的处理器不是您祖父的微控制器 - 它们具有强大的处理能力,可用于同时监视和控制多种类型的物理硬件和传感器。用于 Arduino 的 XOD 图形编程 IDE 可以简化快速原型硬件设计的任务,但随着系统复杂性的增加,存在用户控制和信息管理的问题——如何安排有关被控制过程的信息以供显示并让用户以合乎逻辑的方式控制它。专用按钮和开关适用于简单的项目,但很快就会用尽合理的方式来安排它们(或将它们放在外壳上的位置。)许多设计使用某种类型的显示器来提供这种反馈,即使是微波炉通常也有一个允许编辑设置和输入烹饪时间的小屏幕,虽然过多的“菜单潜水”访问晦涩的设置会影响用户体验,但菜单驱动的界面对于各种项目来说都是生活的事实。
用 C 或 C++ 为微控制器开发基于菜单的界面的软件框架通常具有陡峭的学习曲线,并且可能难以快速进行设计更改,因为通常一切都与其他一切相互作用。该项目的目标是使用 XOD 图形编程环境,使用拖放/所见即所得风格的界面,为兼容 Arduino 的微控制器项目提供快速原型菜单驱动界面的能力。生成的菜单结构的输出和输入参数是模块化和通用的,应该能够与各种输入源(开关、按钮、编码器)一起使用,并产生一系列纯文本输出,这些输出可以提供给广泛的支持 XOD 的各种显示类型,包括本示例中使用的多行文本 LCD 模块。
如果您不熟悉该项目使用的 XOD 环境,请先在 xod.io 查看该项目的教程。
下面是一个简单的激励示例草图的屏幕截图。我们将逐节浏览此 XOD 补丁图,以解释所有内容如何组合在一起。
- 菜单 控制器接口部分
在 XOD 中补丁编辑屏幕的右侧是四个以降序方式连接的节点。从上到下,第一个是模拟输入型节点,选择连接到 Arduino 的一个模拟输入端口。在我的测试中,我一直在使用带有 ATMega328 8 位处理器的 Arduino Uno,上面连接了一个 16x2 LCD/键盘屏蔽。屏蔽板上的键盘通过屏蔽引脚连接到 Arduino 的“A0”模拟输入,硬件产生不同电平的电压,以向 Arduino 发送信号,指示板上哪些按钮被按下。
除了键盘上不直接连接到 Arduino 草图的“重置”按钮之外,这种类型的显示板提供四个方向按钮 - 上、下、左和右,一个“选择”按钮。由模拟输入节点向下馈送的第二个节点包含解码与各个键对应的不同电压的代码,并根据按下的按钮输出脉冲型触发器。提供了一个“超时”输入,以便 XOD 开发人员可以调整 LCD 屏蔽键盘的去抖动超时,以避免误触发,调整到特定应用程序的按钮或开关类型。
向下的第三个节点是菜单控制器类型节点,它包含从控制面板接受脉冲类型触发器的代码,并处理用户在菜单树中导航和进行选择以生成菜单树状态更新的逻辑。
正如当前实现的那样,它接受单个数字类型输入,该输入可以是用户可以从外部控件更改的任何参数,例如电位计或控制面板上的刻度盘,代表某些可以更改的参数。当菜单控制器接收到“调用”输入的脉冲时,选择给定的叶型菜单时,在左侧的菜单树中,用户当前正在查看的屏幕节点将自行输出一个脉冲输出,并发送参数更改。还有两个字符串输入可用于在 Arduino 启动时在显示器上生成启动画面。
在该节点之后是来自 XOD 环境标准库的库存 16x2 LCD 控制器模块,但是模块可用的任何类型的显示器都可用于在此处显示输出文本。
- 菜单树部分
在草图屏幕截图的顶部是一个树状结构,当编译时,树的最终输出“根”被路由到接受它的菜单控制器输入,将自动生成一个可导航的菜单,如图所示图形设计师。当前实现的是三种类型的菜单树节点,一个“叶子”型菜单——一个最终的子菜单,没有橙色输入端口——这代表用户可以控制的一些动作或参数,一个“分支”型菜单输入和输出,用户可以在几个子菜单中进行选择,以及“concat”类型的菜单,其中子菜单组合在一起并输入分支类型菜单的输入,以形成一组选项。从图中可以看出如何连接这组节点。
在显示“分支”类型菜单时选择“调用”会下降到其关联的子菜单组,而不是像叶类型菜单那样生成输出。子子菜单,子子子菜单等都是可能的!可以实现复杂的结构,主要受限于特定 Arduino 型号处理器的可用 RAM 和闪存资源。
- 输出 部分
在这个例子中,输出部分是叶型菜单通过 Arduino 的输出引脚连接到外部硬件的地方。每个叶型菜单都有一个脉冲型输出,它通过总线连接到相应的触发器,以打开和关闭其关联的数字输出引脚。这种安排可以用来控制外部继电器或LED,但脉冲输出非常普遍,在访问叶子型菜单屏幕时选择“调用”时产生的输出脉冲可以用来做很多任务,例如更新内部 XOD 缓冲区类型节点,其中保留来自菜单控制器的参数类型输入端口的参数数据以备将来使用。
- 当前已知问题
这组节点已经过测试,应该可以按原样与 Arduino Uno 一起工作,但仍有一些问题在该项目的截止日期前未得到解决。目前,树中某处必须有一个分支类型的菜单才能编译草图,尽管大多数项目可能希望至少有一个。菜单控制器的“顶部”菜单输入,旨在一直返回到界面的标题屏幕,目前尚未实现,但应该是下一个版本的一个简单功能。
菜单控制器节点支持四行显示,但尚未编写具有四行文本输入的叶型菜单界面。已投入大量精力来减少此实用程序的内存开销,但 XOD 转译器当前存储常量字符串的方式对于非常低的 RAM 开销并不是最佳选择,并且基于菜单的界面往往包含大量文本。对于该项目,我们开发了一种变通方法,并在补丁中添加了一组闪存串类型节点,以确保较长的串不会消耗宝贵的程序 RAM。希望这将在 XOD 环境的更新中得到解决,但解决方法目前还可以。
使用 flash-string 类型节点并不太痛苦,但确实需要为存储在程序存储器中的每个新字符串复制补丁和代码,然后单击节点本身中包含的 C++ 代码来编辑输出字符串:
叶节点和分支节点的“ID”输入还没有函数。想法是让每组子菜单按顺序排列关联的 ID 号会很好,这样用户就可以跟踪他们在一组显示中的位置,但需要更多地考虑如何在 C++ 中进行编码自动发生。
- 继续工作
除了 AVR/ATmega 设备(如 ARM)之外,还应在其他 Arduino 设备上进行进一步的错误测试和测试。当前的菜单节点类型集有些限制,应该有更多种类的输入和输出。继续致力于减少 RAM 开销,也许是通过使用更多的编译时元编程并将尽可能多的数据存储在闪存中,而不是在运行时互连/连接树组件。
2/19/19 - 第二个例子。
第二个示例草图屏幕截图显示了如何使用菜单控制器将外部或内部值作为控制器的输入,在所需的菜单页面上显示当前和以前的值,以及选择一个新值并将其存储到缓冲区中。
在右侧,菜单控制器节点正在接收计数器的输出,由“时钟”节点提供。但这可以是任何类型的内部数据值,也可以是来自连接到模拟输入的电位计的外部值。计数器的输出也被发送到一个字符串格式化节点,并与一些显示文本连接,当菜单页面被调出时,在 LCD 的第二行显示控制器正在接收的当前值。
叶菜单“A”的“调用”和“参数”输出从 XOD 标准库发送到“缓冲区”节点。然后将缓冲区的输出路由回与之前类似的安排,除了“延迟”节点,它需要打破 XOD 草图中的任何反馈循环。存储在缓冲区中的值显示在 LCD 的第一行。
当菜单控制器节点接收到来自键盘控制器的“调用”触发脉冲时,A-out 节点输出来自那里的菜单控制器的参数输入值,在这种情况下是计数器当前值,以及“调用”触发器脉冲激活缓冲区的更新程序并将新参数存储在缓冲区中。然后显示会自动更新以反映新存储的值。
然后,缓冲区的输出端口也可以路由到任意数量的其他节点,以更改它们的行为以反映用户选择的新数据值:
代码
- XOD 菜单系统库
XOD 菜单系统库C/C++
https://xod.io/libs/bitrex/xod-menu-system-11从 XOD 环境中的 File -> Add Libraries... 选项将 bitrex/xod-menu-system 添加到草图库浏览器。
无预览(仅下载)。
示意图
使用XOD IDE直接打开 xodmenusystemrev1_1_4-1-19_fLVYrcSgbX.xodball制造工艺