ArduinoMenu 4
Arduino框架的通用菜单/交互系统
目的
全自动或用户代码驱动的导航系统。 使用此系统,你可以定义菜单、子菜单、输入字段和其他迭代对象,它们处理所有输入/输出,并可以根据用户迭代调用用户定义的处理程序。 用户函数可以作为单一动作在点击/输入时调用,也可以作为事件驱动函数响应焦点进入/离开或输入/退出事件。 该系统设计为非阻塞轮询系统,允许并发任务运行。 可选地,系统可以在半自动模式下操作,从用户代码发出导航命令。
查看wiki
简单示例
#include <menu.h>
#include <menuIO/serialOut.h>
#include <menuIO/chainStream.h>
#include <menuIO/serialIn.h>
using namespace Menu;
#define LEDPIN LED_BUILTIN
#define MAX_DEPTH 1
unsigned int timeOn=10;
unsigned int timeOff=90;
MENU(mainMenu, "闪烁菜单", Menu::doNothing, Menu::noEvent, Menu::wrapStyle
,FIELD(timeOn,"开启","毫秒",0,1000,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle)
,FIELD(timeOff,"关闭","毫秒",0,10000,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle)
,EXIT("<返回")
);
serialIn serial(Serial);
MENU_INPUTS(in,&serial);
MENU_OUTPUTS(out,MAX_DEPTH
,SERIAL_OUT(Serial)
,NONE//必须至少有2个项目
);
NAVROOT(nav,mainMenu,MAX_DEPTH,in,out);
void setup() {
pinMode(LEDPIN, OUTPUT);
Serial.begin(115200);
while(!Serial);
Serial.println("菜单 4.x");
Serial.println("使用键 + - * /");
Serial.println("来控制菜单导航");
}
bool blink(int timeOn,int timeOff) {return millis()%(unsigned long)(timeOn+timeOff)<(unsigned long)timeOn;}
void loop() {
nav.poll();
digitalWrite(LEDPIN, blink(timeOn,timeOff));
}
特性
- 在可用PROGMEM的系统上使用PROGMEM,对RAM占用小。
- 支持多种输入/输出设备。
- 易于定义菜单(宏)。
- 最小化用户代码基础。
- 字段编辑值与现有程序变量挂钩(引用)。
- 编辑文本字段时具有每个字符的验证。
- 字段可以编辑任何类型的数值变量(模板)。
- 反射字段,显示在菜单系统外部进行的变量更改。
- 数值字段编辑和范围验证。
- 数值和非数值类型的枚举字段。
- 可自定义(颜色和光标)。
- 能够在基本级别上通过串行流IO工作。
- 支持并行多个输入和输出。
- RAM静态分配,避免堆碎片化,定义菜单结构所需的所有RAM在程序启动时分配。
- 菜单和提示可用事件。
- 当没有可用输入且不需要绘制时简单返回。
- 延迟绘制,仅在更改时绘制,避免时间消耗和闪烁。
- 同步/异步导航API函数。
- 无状态客户端(如网页)的异步导航。
- 网页界面(实验性)。
- 可以限制在显示区域内(数值字段仍可能溢出区域,用户应考虑到这一点)。
- 在Arduino AVR和ARM、Teensy、ESP8266、Esp32、nRF52、STM32上测试通过。
视频
插件
插件是特定的菜单组合或项目自定义行为和/或绘制。
某些插件可能是特定平台或需要某些硬件。
- barField - 在LCD上显示数值字段的条形图
- cancelField - 允许在退出时恢复之前的数值。
- SDMenu - 完全自动化的SD卡文件选择器,使用标准Arduino SD库。
- SdFatMenu - 完全自动化的SD卡文件选择器,使用标准SdFat (https://github.com/greiman/SdFat)。
应用
一些使用ArduinoMenu的应用/教程(当前和旧版本)。
你有其他应用吗?请在gitter上告诉我或发邮件给我。
温度传感器和定时器的Arduino脚本。 它允许根据计划开启加热器和灯光
https://github.com/vikulin/LCD_LAT
Project-GlassKilnController 用于制作"温玻璃"的电热窑炉
https://arduinoinfo.mywikis.net/wiki/Project-GlassKilnController
ArduinoMenu演示TTGO T-Display 精彩教程。
https://sites.google.com/site/jmaathuis/arduino/lilygo-ttgo-t-display-esp32/arduinomenu-demo-ttgo-t-display
mvc-interface ArduinoMenu教程
https://zaragozamakerspace.com/index.php/courses/mvc-interface/
Arduino自动铜带切割机
https://www.thingiverse.com/thing:3557719
装药粉料斗水平仪和警报
https://github.com/nathandarnell/Reloading-Powder-Hopper-Level-Gauge-and-Alarm
ServoBox 舵机测试仪和监视器
https://github.com/jarkman/ServoBox
PANOBOT 全景机器人
https://github.com/RobertFach/panobot
teensy-midi-looper 基于微控制器的midi表演音序器
https://github.com/newdigate/teensy-midi-looper
AmplifierControl 自动化开/关功放和Kenwood波段解码的程序
https://github.com/petrlab/AmplifierControl
spna Arduino单端口网络分析仪 (SPNA)
https://github.com/tczerwonka/spna
LRDuino 车载多功能仪表系统 - STM32, SSD1306, MAX31856, ADXL345, ELM327 https://github.com/BennehBoy/LRDuino
LRDuinoTD5 车载多功能仪表系统 - STM32, SSD1306, MAX31856, ADXL345, L9637D, TD5 ECU https://github.com/BennehBoy/LRDuinoTD5
thom-radio 互联网收音机制作 https://github.com/evfool/thom-radio
MIDI_drums 7通道压电MIDI鼓机带LCD菜单 https://github.com/Sobollion/MIDI_drums
BalancingRobot https://github.com/SLBarker/BalancingRobot
swatili 50升水表,带阀门控制、LCD、按钮、RTC和霍尔效应脉冲读取器 https://github.com/daniel-leonard-robinson/swatili
Fielduino 硬件PWM发生器,使用菜单选择频率和占空比 https://github.com/neu-rah/Fielduino
ArduinoMultiDesktop 硬件设备的多桌面概念 https://github.com/dontsovcmc/ArduinoMultiDesktop
SmartGreenHouse https://github.com/dontsovcmc/SmartGreenHouse/tree/master/src
console.arduino 使用ILI9341的便携式串行调试控制台项目 https://github.com/malachib/console.arduino
平台
Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, Teensy, TI MSP430
安装
Arduino IDE - 使用库管理器安装(ArduinoMenu库 - Rui Azevedo)
Platformio - http://platformio.org/lib/show/1468/ArduinoMenu%20library
IO设备
输出设备
串口
https://www.arduino.cc/en/Reference/Serial
- 串口监视器
标准Arduino LCD库
https://www.arduino.cc/en/Reference/LiquidCrystal
- hd44780
F Malpartida的LCD库
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
- HD44780直接连接
- HD44780 I2C
- HD44780 SPI
Matthias Hertel PCF8574驱动
https://github.com/mathertel/LiquidCrystal_PCF8574
- HD44780
Arduino TFT设备
https://www.arduino.cc/en/Guide/TFT
SSD1306Ascii
https://github.com/greiman/SSD1306Ascii
- 基于SSD1306控制器的OLED屏幕
TFT_eSPI
兼容Arduino IDE的ESP8266和ESP32图形和字体库 https://github.com/Bodmer/TFT_eSPI
- ILI9341, ILI9163, ST7735, S6D02A1, ILI9481, ILI9486, ILI9488, HX8357D, ST7789, ILI9486
- Waveshare 2色和3色SPI电子纸显示器
TFT_HX8357驱动
https://github.com/Bodmer/TFT_HX8357
- HX8357B, HX8357C, ILI9481和ILI9486
Adafruit的GFX设备
https://github.com/adafruit/Adafruit-GFX-Library
- RGBmatrixPanel,16x32和32x32 RGB LED矩阵面板
- Adafruit_TFTLCD,2.8"TFT LCD触摸屏分线板和Arduino TFT触摸屏扩展板
- Adafruit_HX8340B,2.2"TFT显示器,带microSD
- Adafruit_ST7735,1.8"TFT显示器,带microSD
- Adafruit_PCD8544,用于Nokia 5110/3310单色LCD
- Adafruit-Graphic-VFD-Display-Library,用于128x64图形VFD
- Adafruit-SSD1331-OLED-Driver-Library-for-Arduino,用于0.96"16位彩色OLED,带microSD卡座
- Adafruit_SSD1306,用于单色128x64和128x32 OLED
UTFT设备
http://www.rinkydinkelectronics.com/library.php?id=51
- ITDB02系列 - ITead Studio
- TFT01系列 - ElecFreaks
- RGB LCD - NKC Electronics
U8glib设备
https://github.com/olikraus/U8glib_Arduino
SSD1306, 128x64, SSD1306, 128x32, SSD1306, 64x48, SSD1309, 128x64, SSD1322, 256x64, SSD1325, 128x64, SSD1327, 96x96, SH1106, 128x64, UC1601, 128x32, UC1608, 240x64, UC1610, 160x104, UC1611, 240x64, UC1611, 240x128, UC1701, 128x64, UC1701, 102x64, ST7565, 128x64, ST7565, 128x32, ST7920, 128x64, ST7920, 192x32, ST7920, 202x32, LD7032, 60x32, PCD8544, 84x48, TLS8204 , 84x48, PCF8812 , 96x65, KS0108 , 128x64, T6963, 128x64, T6963, 128x128, T6963, 240x64, T6963, 240x128, SBN1661, 122x32, LC7981, 160x80, LC7981, 240x64, LC7981, 240x128, LC7981, 320x64, SSD1351, HT1632, 24x16, Flipdisk, 28x14, 虚拟屏幕设备
U8G2和U8x8设备
https://github.com/olikraus/U8g2_Arduino SSD1305 128X32无名称,SSD1305 128X32无名称,SSD1305 128X64 ADAFRUIT,SSD1305 128X64 ADAFRUIT,SSD1306 128X64无名称,SSD1306 128X64 VCOMH0,SSD1306 128X64 ALT0,SSD1306 128X64无名称,SSD1306 128X64 VCOMH0,SSD1306 128X64 ALT0,SH1106 128X64无名称,SH1106 128X64 VCOMH0,SH1106 128X64 WINSTAR,SH1106 128X64无名称,SH1106 128X64 VCOMH0,SH1106 128X64 WINSTAR,SH1106 72X40 WISE,SH1106 72X40 WISE,SH1106 64X32,SH1106 64X32,SH1107 64X128,SH1107 64X128,SH1107 SEEED 96X96,SH1107 SEEED 96X96,SH1107 128X128,SH1107 128X128,SH1122 256X64,SH1122 256X64,SSD1306 128X32 UNIVISION,SSD1306 128X32 UNIVISION,SSD1306 64X48 ER,SSD1306 64X48 ER,SSD1306 48X64 WINSTAR,SSD1306 48X64 WINSTAR,SSD1306 64X32无名称,SSD1306 64X32 1F,SSD1306 64X32无名称,SSD1306 64X32 1F,SSD1306 96X16 ER,SSD1306 96X16 ER,SSD1309 128X64无名称2,SSD1309 128X64无名称2,SSD1309 128X64无名称0,SSD1309 128X64无名称0,SSD1325 NHD 128X64,SSD1325 NHD 128X64,SSD1326 ER 256X32,SSD1326 ER 256X32,SSD1327 SEEED 96X96,SSD1327 SEEED 96X96,SSD1327 MIDAS 128X128,SSD1327 MIDAS 128X128,SSD1329 128X96无名称,LD7032 60X32,LD7032 60X32,ST7920 192X32,ST7920 192X32,ST7920 192X32,ST7920 128X64,ST7920 128X64,ST7920 128X64,LS013B7DH03 128X128,UC1701 EA DOGS102,UC1701 MINI12864,PCD8544 84X48,PCF8812 96X65,HX1230 96X68,UC1604 JLX19264,UC1604 JLX19264,UC1608 ERC24064,UC1608 ERC24064,UC1608 ERC240120,UC1608 ERC240120,UC1608 240X128,UC1608 240X128,UC1638 160X128,UC1610 EA DOGXL160,UC1610 EA DOGXL160,UC1611 EA DOGM240,UC1611 EA DOGM240,UC1611 EA DOGXL240,UC1611 EA DOGXL240,UC1611 EW50850,UC1611 EW50850,ST7565 EA DOGM128,ST7565 64128N,ST7565 ZOLEN 128X64,ST7565 LM6059,ST7565 LX12864,ST7565 ERC12864,ST7565 NHD C12864,ST7565 JLX12864,ST7565 NHD C12832,UC1601 128X32,UC1601 128X32,ST7565 EA DOGM132,ST7567 PI 132X64,ST7567 JLX12864,ST7567 ENH DG128064,ST7567 ENH DG128064I,ST7588 JLX12864,ST7588 JLX12864,ST75256 JLX256128,ST75256 JLX256128,ST75256 JLX256160,ST75256 JLX256160,ST75256 JLX240160,ST75256 JLX240160,ST75256 JLX25664,ST75256 JLX25664,ST75256 JLX172104,ST75256 JLX172104,NT7534 TG12864R,IST3020 ERC19264,SBN1661 122X32,SED1520 122X32,KS0108 128X64,KS0108 ERM19264,LC7981 160X80,LC7981 160X160,LC7981 240X128,T6963 240X128,T6963 240X64,T6963 256X64,T6963 128X64,SSD1322 NHD 256X64,SSD1322 NHD 128X64,SSD1606 172X72,SSD1607 200X200,SSD1607 GD 200X200,IL3820 296X128,IL3820 V2 296X128,SED1330 240X128,RA8835 NHD 240X128,RA8835 320X240,MAX7219 32X8,A2打印机 384X240
UCGLib设备
https://github.com/olikraus/Ucglib_Arduino
ST7735, ILI9163, ILI9325, ILI9341, ILI9486, LD50T6160, PCF8833, SEPS225, SSD1331, SSD1351, HX8352C
串行ANSI终端
https://github.com/neu-rah/AnsiStream
- Unix终端
Grove RGB LCD I2C 2x16
https://wiki.seeedstudio.com/Grove-LCD_RGB_Backlight/
Web浏览器
- ESP8266(内置)
Web JSON
- ESP8266(内置)
Websockets
- ESP8266(内置)
注意: 即使不使用Web界面,ESP8266也需要流媒体库,并且需要包含 #include <menuIO/esp8266Out.h>
根据您的输出驱动程序,可能需要以下之一(可以同时安装两者)
输入设备
串行 https://www.arduino.cc/en/Reference/Serial
四相编码器 - 使用PCINT的通用编码器(内置)
按钮 - 简单数字键盘(内置)
通用键盘(无PCINT) - 可配置用于数字或模拟键盘(内置)
模拟摇杆
ClickEncoder https://github.com/0xPIT/encoder
矩阵键盘 http://playground.arduino.cc/Code/Keypad https://github.com/Nullkraft/Keypad
基于PCF8574的I2C矩阵键盘 https://github.com/whatnick/i2ckeypad
用户定义的输入调用菜单导航API
使用ESP设备时的Web浏览器(实验性)
依赖项
该库依赖于以下库:
根据输入或输出的类型,可能需要其他库。基本上是您的设备所需的任何库。
限制
- 使用宏时菜单选项限制为16个(当前宏限制)。
- 使用宏构建的菜单必须至少有2个选项。
- 最多127个选项。
- 快速访问(数字键)仅支持9个选项(1到9)。
- 提示可能在宽度小于4个字符的面板上溢出。
- 菜单系统基于字符,因此选择等宽字体以获得最佳效果,但它可以与任何字体一起使用,只是文本可能会溢出。
基础
- 基于字符的信息显示。
- 基于行的菜单组织。
- 流式IO + 专门化。
信息
更多信息请参阅
错误/建议
请报告错误、问题或改进想法,我很感谢反馈。谢谢。
在问题报告中,请指明输入和输出驱动程序或设备以及目标平台。
注意事项
编码器现在需要在setup中调用begin()(2.x)
从通用流读取输入,包括简单的编码器和键盘流 - 提供的编码器驱动程序使用内部上拉和反向逻辑
多个流打包用于输入,以混合编码器流和编码器键盘(通常1或2个键)
历史
4.0
- SdFat插件和示例
- EscControl示例
- 支持Bodmer/TFT_eSPI
- SDCard文件选择器插件
- 允许虚拟/动态数据自定义菜单
- 带有显式引脚模式的替代按键驱动程序
- 更多示例
- 带验证的文本编辑字段 *
- 平板风格菜单(水平列表)
- 内联平板菜单可以输入自定义格式,如IP/日期/时间,实验性的,仅适用于可以定位光标的设备
- 插件,可能是设备特定的替代菜单项
- 允许多个并发菜单
- 支持UCGLib显示器
- 支持U8x8显示器
- 支持Arduino TFT
- 支持PCF8574 I2C LCD
- 支持模拟操纵杆输入
- 添加输入突发配置选项
- VALUEOBJ宏,用户分配的值
- menuIn类用于菜单输入(允许设备字段反转) *
- 一些选项已分散到其他类中
- 允许动态菜单构建(RAM),甚至适用于AVR
* API更改
选项
invertFieldKeys选项已删除,反转现在由特定的menuIn对象支持。
回归:仍需要简化简单输入情况。
numValueInput移至menuIn对象
navRoot额外选项,之前在全局选项对象上
bool nav2D=false;//未使用
bool canExit=true;//v4.0从全局选项移动
bool useUpdateEvent=false;//如果为false,则在字段值更改时使用enterEvent。
idx_t inputBurst=1;//可以在输出之前处理的输入限制
串行输入
不再直接接受Serial作为输入,请使用serialIn代替
prompt基础API
printTo成员函数从:
Used printTo(navRoot&,bool,menuOut&,idx_t,idx_t);
更改为:
Used printTo(navRoot&,bool,menuOut&,idx_t,idx_t,idx_t=0);
这应该只影响自定义组件
输入现在来自menuIn类,派生自Stream,但包括每个输入类的字段轴反转标志函数。
3.0
- 菜单控制系统的完全修订
- 菜单结构分为RAM对象和flash对象
- 使用单独的导航控制对象navNode
- 中央导航控制对象navRoot
- 对所有菜单对象使用事件(焦点、模糊、进入、退出)
- 多个面板
- 基本级别的颜色枚举
- 并行多个输出设备
- 将退出定义为常规选项
- 限制文本宽度以防溢出
2.4
- 支持teensy(在3.2上测试)
- 新的字段类型SELECT
- 反射性,字段反映值的外部更改
- 将字段字符串存储到progmem
- 在没有PROGMEM的系统上自动使用RAM
2.3
- 动作函数现在需要返回bool(仅影响菜单)
false = 继续菜单
true = 退出菜单
- 支持U8GLib屏幕
- 可选使用ClickEncoder
- 使用闪存存储菜单字符串和列表(PROGMEM)
2.0
- 非阻塞菜单主循环
- 菜单字段作为具有关联值的菜单提示 值可以是: 范围内的数值 点击时切换的值列表(用于小列表) 作为子菜单选择的值列表(用于较长列表)
- PCINT现在支持Mega/2560和可能的其他型号
1.x
- 基本菜单功能