{"id":13958948,"url":"https://github.com/neu-rah/ArduinoMenu","last_synced_at":"2025-07-21T00:32:44.720Z","repository":{"id":19766253,"uuid":"23024191","full_name":"neu-rah/ArduinoMenu","owner":"neu-rah","description":"Arduino generic menu/interactivity system","archived":false,"fork":false,"pushed_at":"2024-11-04T08:23:33.000Z","size":9695,"stargazers_count":992,"open_issues_count":124,"forks_count":196,"subscribers_count":68,"default_branch":"master","last_synced_at":"2025-05-29T09:04:38.790Z","etag":null,"topics":["ansi","arduino","avr","buttons","control","encoder","esp8266","iot","keyboard","keys","lcd","menu","pcint","progmem","ram","static","system","tft","touch","web"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neu-rah.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"neu-rah"}},"created_at":"2014-08-16T18:17:48.000Z","updated_at":"2025-05-29T02:17:18.000Z","dependencies_parsed_at":"2024-09-24T13:44:47.062Z","dependency_job_id":"5fcabc0c-f84d-41b7-a3fc-969fed6301f9","html_url":"https://github.com/neu-rah/ArduinoMenu","commit_stats":{"total_commits":976,"total_committers":41,"mean_commits":"23.804878048780488","dds":0.07479508196721307,"last_synced_commit":"9ef1e267639140925add8a46dd8a12ec932d3b3d"},"previous_names":[],"tags_count":94,"template":false,"template_full_name":null,"purl":"pkg:github/neu-rah/ArduinoMenu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neu-rah%2FArduinoMenu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neu-rah%2FArduinoMenu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neu-rah%2FArduinoMenu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neu-rah%2FArduinoMenu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neu-rah","download_url":"https://codeload.github.com/neu-rah/ArduinoMenu/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neu-rah%2FArduinoMenu/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266221324,"owners_count":23894966,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi","arduino","avr","buttons","control","encoder","esp8266","iot","keyboard","keys","lcd","menu","pcint","progmem","ram","static","system","tft","touch","web"],"created_at":"2024-08-08T13:02:09.154Z","updated_at":"2025-07-21T00:32:39.710Z","avatar_url":"https://github.com/neu-rah.png","language":"C++","readme":"# ArduinoMenu 4\n\n**Generic menu/interactivity system for the arduino framework**\n\n[![License: LGPL-2.1+](https://img.shields.io/badge/License%20LGPL-2.1+-lightgrey.svg)](https://spdx.org/licenses/LGPL-2.1-or-later.html)\n[![Build Status](https://travis-ci.org/neu-rah/ArduinoMenu.svg?branch=master)](https://travis-ci.org/neu-rah/ArduinoMenu)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/ruihfazevedo)\n[![Join Gitter](https://img.shields.io/badge/GITTER-join%20chat-green.svg)](https://gitter.im/ArduinoMenu/Lobby)\n\n## Purpose\nFull automated or user code driven navigation system.\nWith this system you can define menus, submenus, input fields and other iteration objects that deal with all input/output and can call user defined handler as a result of user iteration.\nThe user function can be operated as a single action called on click/enter or as a event driven function responding to focus In/Out or Enter/Esc events.\nThe system is designed as a non blocking polling system, allowing concurrent task to run.\nOptionally the system can be operated in semi-automated mode, issuing navigation command from user code.\n\nSee the [wiki](https://github.com/neu-rah/ArduinoMenu/wiki)\n\n## Simple Example\n```c++\n#include \u003cmenu.h\u003e\n#include \u003cmenuIO/serialOut.h\u003e\n#include \u003cmenuIO/chainStream.h\u003e\n#include \u003cmenuIO/serialIn.h\u003e\n\nusing namespace Menu;\n\n#define LEDPIN LED_BUILTIN\n#define MAX_DEPTH 1\n\nunsigned int timeOn=10;\nunsigned int timeOff=90;\n\nMENU(mainMenu, \"Blink menu\", Menu::doNothing, Menu::noEvent, Menu::wrapStyle\n  ,FIELD(timeOn,\"On\",\"ms\",0,1000,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle)\n  ,FIELD(timeOff,\"Off\",\"ms\",0,10000,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle)\n  ,EXIT(\"\u003cBack\")\n);\n\nserialIn serial(Serial);\nMENU_INPUTS(in,\u0026serial);\n\nMENU_OUTPUTS(out,MAX_DEPTH\n  ,SERIAL_OUT(Serial)\n  ,NONE//must have 2 items at least\n);\n\nNAVROOT(nav,mainMenu,MAX_DEPTH,in,out);\n\nvoid setup() {\n  pinMode(LEDPIN, OUTPUT);\n  Serial.begin(115200);\n  while(!Serial);\n  Serial.println(\"Menu 4.x\");\n  Serial.println(\"Use keys + - * /\");\n  Serial.println(\"to control the menu navigation\");\n}\n\nbool blink(int timeOn,int timeOff) {return millis()%(unsigned long)(timeOn+timeOff)\u003c(unsigned long)timeOn;}\n\nvoid loop() {\n  nav.poll();\n  digitalWrite(LEDPIN, blink(timeOn,timeOff));\n}\n```\n\n## Features\n- Small footprint on RAM using PROGMEM on system where it is available.\n- Wide variety of input/output devices supported.\n- Easy to define menus (macros).\n- Minimalistic user code base.\n- Fields edit values hooked to existing program variables (references).\n- Editing text fields with per character validation.\n- Fields can edit numeric variables of any type (templates).\n- Reflexive fields, showing variable changes done outside the menu system.\n- Numerical field edit and range validation.\n- Enumerated fields for numeric and non-numeric types\n- Customizable (colors and cursors).\n- Able to work over Serial stream IO as a base level.\n- Supports multiple inputs and outputs in parallel.\n- static allocation of RAM, avoiding heap fragmentation, all RAM needed to define menu structure is allocated at program startup.\n- events available for menus and prompts\n- simply returns when no input available and no needed to draw.\n- lazy drawing, only draws when changed, avoiding time consumption and flicking.\n- sync/async navigation API functions\n- async navigation for stateless clients (as web)\n- web interface (experimental)\n- can be confined to a display area (numeric fields can still overflow the area, user should take account for them)\n- Tested on Arduino AVR's \u0026 ARM, Teensy, ESP8266, Esp32, nRF52, STM32\n\n## Videos\n[![IMAGE ALT TEXT](https://img.youtube.com/vi/wHv5sU-HXVI/2.jpg)](https://youtu.be/wHv5sU-HXVI \"Arduino menu 2.0 fields video\") [![IMAGE ALT TEXT](https://img.youtube.com/vi/W-TRCziF67g/2.jpg)](https://youtu.be/W-TRCziF67g \"Arduino menu basic features video\") [![IMAGE ALT TEXT](https://img.youtube.com/vi/27KEUTpCHfg/2.jpg)](https://youtu.be/27KEUTpCHfg \"Arduino menu 4.x\") [![IMAGE ALT TEXT](https://img.youtube.com/vi/ebOWG0ALUWI/2.jpg)](https://youtu.be/ebOWG0ALUWI)\n\n## Plugins\n\nPlugins are particular menu combinations or item customized behaviors and/or drawing.\n\nSome plugins might be platform specific or require some hardware.\n\n- barField - displays a bar for numeric field on LCD\n- cancelField - allows to restore previous numeric value on escape.\n- SDMenu - full automated SD Card file picker, using standard Arduino SD lib.\n- SdFatMenu - full automated SD Card file picker, using standard SdFat (https://github.com/greiman/SdFat).\n\n## Applications\n\nSome applications/tutorials using ArduinoMenu, (current and older versions).  \nDo you have another? please let me know on gitter or email me.\n\n**Arduino script for temperature sensor and timer.** It allows to turn on heater and light accordingly to schedule  \nhttps://github.com/vikulin/LCD_LAT\n\n**Project-GlassKilnController** electrically-heated kiln for making \"Warm Glass\"  \nhttps://arduinoinfo.mywikis.net/wiki/Project-GlassKilnController\n\n**ArduinoMenu demo TTGO T-Display** awesome tutorial.  \nhttps://sites.google.com/site/jmaathuis/arduino/lilygo-ttgo-t-display-esp32/arduinomenu-demo-ttgo-t-display\n\n**mvc-interface** ArduinoMenu tutorial  \nhttps://zaragozamakerspace.com/index.php/courses/mvc-interface/\n\n**Arduino Automatic Copper Tape Cutter**  \nhttps://www.thingiverse.com/thing:3557719\n\n**Reloading powder hopper level gauge and alarm**  \nhttps://github.com/nathandarnell/Reloading-Powder-Hopper-Level-Gauge-and-Alarm\n\n**ServoBox** Servo tester \u0026 monitor  \nhttps://github.com/jarkman/ServoBox\n\n**PANOBOT** A Panorama robot  \nhttps://github.com/RobertFach/panobot\n\n**teensy-midi-looper** Microcontroller-based midi performance sequencer  \nhttps://github.com/newdigate/teensy-midi-looper\n\n**AmplifierControl** Automate procedure to switch on/off amplifier and band decode of Kenwood  \nhttps://github.com/petrlab/AmplifierControl\n\n**spna** An Arduino Single Port Network Analyzer (SPNA)  \nhttps://github.com/tczerwonka/spna\n\n**LRDuino** In car multi gauge system - STM32, SSD1306, MAX31856, ADXL345, ELM327  \nhttps://github.com/BennehBoy/LRDuino\n\n**LRDuinoTD5** In car multi gauge system - STM32, SSD1306, MAX31856, ADXL345, L9637D, TD5 ECU  \nhttps://github.com/BennehBoy/LRDuinoTD5\n\n**thom-radio** Internet radio build  \nhttps://github.com/evfool/thom-radio\n\n**MIDI_drums** 7 chanel piezo MIDI drum box with menu on LCD  \nhttps://github.com/Sobollion/MIDI_drums\n\n**BalancingRobot**  \nhttps://github.com/SLBarker/BalancingRobot\n\n**swatili** 50l water meter with valve control, lcd, buttons, rtc and hall effect pulse reader  \nhttps://github.com/daniel-leonard-robinson/swatili\n\n**Fielduino** hardware PWM generator using menu to select frequency and dutty.  \nhttps://github.com/neu-rah/Fielduino\n\n**ArduinoMultiDesktop** MultiDesktop concept for hardware devices  \nhttps://github.com/dontsovcmc/ArduinoMultiDesktop\n\n**SmartGreenHouse**  \nhttps://github.com/dontsovcmc/SmartGreenHouse/tree/master/src\n\n**console.arduino** Portable serial debug console project using ILI9341  \nhttps://github.com/malachib/console.arduino\n\n## Platforms\nAtmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, Teensy, TI MSP430\n\n## Install\n\n**Arduino IDE** - Install using the library manager (ArduinoMenu library - Rui Azevedo)\n\n**Platformio** - http://platformio.org/lib/show/1468/ArduinoMenu%20library\n\n## IO devices\n### Output devices\n\n**Serial**\n\nhttps://www.arduino.cc/en/Reference/Serial\n\n- Serial monitor.\n\n**Standard arduino LCD library**\n\nhttps://www.arduino.cc/en/Reference/LiquidCrystal\n\n- hd44780\n\n**F Malpartida's LCDs**\n\nhttps://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home\n\n- HD44780 direct\n- HD44780 I2C\n- HD44780 SPI\n\n**Matthias Hertel PCF8574 driver**\n\nhttps://github.com/mathertel/LiquidCrystal_PCF8574\n\n- HD44780\n\n**Arduino TFT devices**\n\nhttps://www.arduino.cc/en/Guide/TFT\n\n**SSD1306Ascii**\n\nhttps://github.com/greiman/SSD1306Ascii\n\n- OLED Screens based on SSD1306 controller\n\n**TFT_eSPI**\n\nAn Arduino IDE compatible graphics and fonts library for ESP8266 and ESP32  \nhttps://github.com/Bodmer/TFT_eSPI\n\n- ILI9341, ILI9163, ST7735, S6D02A1, ILI9481, ILI9486, ILI9488, HX8357D, ST7789, ILI9486\n- Waveshare 2 and 3 colour SPI ePaper displays\n\n**TFT_HX8357 driver**\n\nhttps://github.com/Bodmer/TFT_HX8357\n\n- HX8357B, HX8357C, ILI9481 and ILI9486\n\n**Adafruit's GFX devices**\n\nhttps://github.com/adafruit/Adafruit-GFX-Library\n\n- RGBmatrixPanel, 16x32 and 32x32 RGB LED matrix panels.\n- Adafruit_TFTLCD, 2.8\" TFT LCD touchscreen breakout and TFT Touch Shield for Arduino.\n- Adafruit_HX8340B, 2.2\" TFT Display with microSD.\n- Adafruit_ST7735, 1.8\" TFT Display with microSD.\n- Adafruit_PCD8544, for the Nokia 5110/3310 monochrome LCD.\n- Adafruit-Graphic-VFD-Display-Library, for 128x64 Graphic VFD.\n- Adafruit-SSD1331-OLED-Driver-Library-for-Arduino for the 0.96\" 16-bit Color OLED w/microSD Holder.\n- Adafruit_SSD1306 for the Monochrome 128x64 and 128x32 OLEDs.\n\n**UTFT devices**\n\nhttp://www.rinkydinkelectronics.com/library.php?id=51\n\n- ITDB02 series - ITead Studio\n- TFT01 series - ElecFreaks\n- RGB LCD - NKC Electronics.\n\n**U8glib devices**\n\nhttps://github.com/olikraus/U8glib_Arduino\n\nSSD1306, 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, Virtual Screen Device\n\n**U8G2 and U8x8 devices**\n\nhttps://github.com/olikraus/U8g2_Arduino\n\nSSD1305 128X32_NONAME, SSD1305 128X32_NONAME, SSD1305 128X64_ADAFRUIT, SSD1305 128X64_ADAFRUIT, SSD1306 128X64_NONAME, SSD1306 128X64_VCOMH0, SSD1306 128X64_ALT0, SSD1306 128X64_NONAME, SSD1306 128X64_VCOMH0, SSD1306 128X64_ALT0, SH1106 128X64_NONAME, SH1106 128X64_VCOMH0, SH1106 128X64_WINSTAR, SH1106 128X64_NONAME, 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_NONAME, SSD1306 64X32_1F, SSD1306 64X32_NONAME, SSD1306 64X32_1F, SSD1306 96X16_ER, SSD1306 96X16_ER, SSD1309 128X64_NONAME2, SSD1309 128X64_NONAME2, SSD1309 128X64_NONAME0, SSD1309 128X64_NONAME0, 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_NONAME, 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, A2PRINTER 384X240\n\n**UCGLib devices**\n\nhttps://github.com/olikraus/Ucglib_Arduino\n\nST7735, ILI9163, ILI9325, ILI9341, ILI9486, LD50T6160, PCF8833, SEPS225, SSD1331, SSD1351, HX8352C\n\n**Serial ANSI terminal**\n\nhttps://github.com/neu-rah/AnsiStream\n\n- Unix terminal\n\n**Grove RGB LCD I2C 2x16**\n\nhttps://wiki.seeedstudio.com/Grove-LCD_RGB_Backlight/\n\n**Web browser**\n\n- ESP8266 (builtin)  \n\n**Web JSON**\n\n- ESP8266 (builtin)  \n\n**Websockets**\n\n- ESP8266 (builtin)  \n\n**note:** esp8266 will require a streaming library even if not using web interface, along with `#include \u003cmenuIO/esp8266Out.h\u003e`\n\ndepending on your output driver it may be one of (can install both)\n- https://github.com/neu-rah/streamFlow\n- https://github.com/scottdky/Streaming\n\n### Input devices\n\nSerial https://www.arduino.cc/en/Reference/Serial\n\nquadEncoder - Generic encoder using PCINT (builtin)  \n\nButtons - simple digital keyboard (builtin)\n\nGeneric keyboard (no PCINT) - configurable for digital or analog keyboards (builtin)\n\nAnalog Joystick\n\nClickEncoder https://github.com/0xPIT/encoder\n\nMatrix keypad   \nhttp://playground.arduino.cc/Code/Keypad\nhttps://github.com/Nullkraft/Keypad\n\nPCF8574 based i2c matrix keypad\nhttps://github.com/whatnick/i2ckeypad\n\nUser defined input calling menu navigation API\n\nWeb browser (experimental) when using ESP devices\n\n## Dependencies\nThis library depends on the following libraries:\n\n- streamFlow https://github.com/neu-rah/streamFlow (on debug mode)\n\nDepending on the type of input or output, other libraries might be needed. Essentially any library needed for your devices.\n\n## Limits\n\n- when using macros the menu is limited to 16 options (current macro limnit).\n- menus **must** have at least 2 options when built using macros.\n- maximum 127 options.\n- fast access (numeric keys) only supports 9 options (1 to 9)\n- prompts can overflow on panels with less than 4 characters width\n- menu system is character based, so choose monometric font to achieve best results, it will work with any font but the text can overflow.\n\n## Base\n\n- Character based information display.\n- Line based menu organization.\n- Stream IO + specializations.\n\n## info\n\nmore info at\n\n[wiki](https://github.com/neu-rah/ArduinoMenu/wiki) pages, [issues](https://github.com/neu-rah/ArduinoMenu/issues?utf8=%E2%9C%93\u0026q=) or [r-site.net](http://www.r-site.net/?lang=en\u0026at=//op%5B@id=%273090%27%5D)\n\n## Errors / Sugestions\n\nPlease report errors, problems or enhancement ideas, I apreciate the feedback. Thanks.\n\nOn issues report please specify the input and output drivers or devices as well as target platform.\n\n## notes\n\nencoder now needs begin() to be called on setup (2.x)\n\ninput is read from generic streams, included simple streams for encoders and keyboards\n\t- provided encoder driver uses internal pull-ups and reverse logic\n\nmultiple stream packing for input to mix encoder stream with encoder keyboard (usually 1 or 2 keys)\n\n## History\n\n### 4.0\n  - SdFat plugin and example\n  - EscControl examle\n  - support Bodmer/TFT_eSPI\n  - SDCard file picker plugin\n  - Allow virtual/dynamic data custom menus\n  - alternative key driver with explicit pin modes\n  - More examples\n  - Text edit fields with validation *\n  - Pad style menus (horizontal list)\n  - inline pad menus can input custom formats like IP/Date/Time, experimental and just for devices that can position a cursor\n  - Plugins, alternative menu items potentially device specific\n  - Allow multiple concurrent menus\n  - Support UCGLib displays\n  - Support U8x8 displays\n  - Support Arduino TFT\n  - Support PCF8574 I2C LCD\n  - Support Analog Joystick input\n  - Added input burst config option\n  - VALUEOBJ macro, user allocated values\n  - menuIn class for menu inputs (allows device field invertion) *\n  - some options have been distributed to some other classes\n  - allow dynamic menu construction (ram) even for AVR's\n\n#### * API changes\n\n##### Options\n\n\u003cdel\u003e**invertFieldKeys** option removed, invertion is now supported by specific menuIn objects.\u003c/del\u003e\n\n_regression: still needed to ease simple input cases._\n\n**numValueInput** moved to menuIn object\n\n**navRoot** extra options, previously on global options object\n```c++\nbool nav2D=false;//not used\nbool canExit=true;//v4.0 moved from global options\nbool useUpdateEvent=false;//if false, use enterEvent when field value is changed.\nidx_t inputBurst=1;//limit of inputs that can be processed before output\n```\n\n##### Serial input\n\nSerial is no longer accepted as an input directly, use serialIn instead\n\n##### prompt base API\n\nprintTo member function changed from:\n\n```c++\nUsed printTo(navRoot\u0026,bool,menuOut\u0026,idx_t,idx_t);\n```\n\nto\n\n```c++\nUsed printTo(navRoot\u0026,bool,menuOut\u0026,idx_t,idx_t,idx_t=0);\n```\n\n_this should only affect customized components_\n\ninputs are now from class menuIn, derived from Stream but including flag functions for field axis inversion per input class.\n\n### 3.0\n  - complete revision of menu control system\n\t- menu structure separated in ram objects and flash objects\n\t- using separate navigation control objects **navNode**\n\t- central navigation control object **navRoot**\n\t- using event for all menu objects (focus, blur, enter, exit).\n\t- multiple panels\n\t- color enumeration at base level\n\t- multiple output devices in parallel\n\t- define exit as regular option\n\t- limiting text width to prevent overflow\n\n### 2.4\n  - support for teensy (tested on 3.2)\n  - new field type SELECT\n  - reflexivity, fields reflect external changes to values\n  - store field strings to progmem\n  - automatic use of RAM on system without PROGMEM\n\n### 2.3\n\n  - action functions now need to return bool (only affects menus)\n\n  \u003e**false** = continue menu\n  \u003e\n  \u003e**true** = exit menu\n\n  - Support for U8GLib screens\n  - alternative use ClickEncoder\n  - using flash memory to store menu strings and lists (PROGMEM)\n\n### 2.0\n\n  - non-blocking menu main cycle\n  - Menufields as menu prompts with associated value\n    values can be:\n      numeric withing range\n      list of values toggled on click (for small lists)\n      list of values selected as submenu (for longer lists)\n  - PCINT now supports Mega/2560 and possibly others\n\n### 1.x\n  - basic menu functionality\n","funding_links":["https://github.com/sponsors/neu-rah","https://www.paypal.me/ruihfazevedo"],"categories":["硬件_其他"],"sub_categories":["网络服务_其他"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneu-rah%2FArduinoMenu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneu-rah%2FArduinoMenu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneu-rah%2FArduinoMenu/lists"}