Skip to content

el-fuego/Arduino-progmem-menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Arduino-progmem-menu

Arduino Menu Library for a limited RAM usage devices or heavy menus.

Library are using Progmem Memory to store texts, so the RAM is used for behaviour execution only.

Out of the box:

  • Small RAM usage
  • Friendly menu configs
  • Nested submenus support
  • Number formatting helpers
  • Number field editing with limits and step
  • Text field editing
  • Actions support
  • Base classes for the custom inputs and outputs

Demo

PCD8544:

How it works

16x2 LCD display using I2C:

[missed ::cry::]

How to start?

cd ~/Documents/Arduino/libraries/ git clone git@github.com:el-fuego/Arduino-progmem-menu.git

..or download, unpack and place Arduino-progmem-menu folder at libraries manually.

Install additional drivers for the LCD screen support:

Code example:

// Setup Library and devices: #include <Arduino-progmem-menu.h> #include "outputs/lcd-hd44780/LcdHd44780Output.h" #include "inputs/analog-joystick/AnalogJoystick.h" hd44780_I2Cexp lcd(0x3F); Menu::AnalogJoystickInput menuInput(A6, A7); Menu::LcdHd44780Output menuOutput(&lcd); // Setup variables to edit: int firstAreaSqure = 124; int secondAreaSqure = 546; char text[] = "abc324"; // Setup action handlers: void turnLedOn() { digitalWrite(LED_BUILTIN, HIGH); } // Create menu to be nested: MENU(squareArea, "Area sett.", (Menu::MENU_STYLE::NAME_HIDDEN_FOR_CHILD_LIST | Menu::MENU_STYLE::HORIZONTAL_CHILD_LIST) ,NUMBER_FIELD(firstAreaSqureMenu, "from ", firstAreaSqure, Menu::to3Digits, " m^2", 0, 1000, 10) ,NUMBER_FIELD(secondAreaSqureMenu, "to ", secondAreaSqure, Menu::to3Digits, " m^2", 0, 1000, 1) ); // Create main menu: MENU(main, "My Settings", (0 | Menu::MENU_STYLE::NAME_HIDDEN_FOR_CHILD_LIST) ,SUBMENU(squareArea) // nested submenu ,TEXT_FIELD(myTextField, "Text Field '", text, "'") // Editable text ,ACTION(turnLedOnAction, "Turn LED ON", turnLedOn) // Function call ); // Initialize and display menu: void setup() { lcd.init(); lcd.backlight(); Menu::controller->init(&mainMenu, &menuInput, &menuOutput); } void loop() { Menu::controller->update(); }

See more:

DOCUMENTATION:

MENU() macros - creates new menu:

MENU(id, String text, Menu::MENU_STYLE styles, MENU_ITEMS...);

Styles available:

  • NAME_HIDDEN_FOR_CHILD_LIST - Name visibility for child list
  • HORIZONTAL_CHILD_LIST - Child place style (horizontal or vertical)
  • INLINE_CHILD_LIST - Style at parent list (inline or nested)

Usage example:

MENU( myMenu, // id "Cool Menu Name", // Text Menu::MENU_STYLE::NAME_HIDDEN_FOR_CHILD_LIST | Menu::MENU_STYLE::HORIZONTAL_CHILD_LIST, // Styles // Menu items: NUMBER_FIELD(...), SUBMENU(...) );

..add , BLANK() after the action if menu should display 1 item only:

MENU(..., // Menu items: NUMBER_FIELD(...), // Single item BLANK() // need to add BLANK() item );

SUBMENU() macros - adds nested menu:

SUBMENU(submenuId)

Usage example:

MENU(..., SUBMENU(myMenu));

ACTION() macros - creates menu-item to fire function:

ACTION(id, String text, void (*onEnter)())

Usage example:

MENU(..., ACTION( mySave, // id "Save", // Text doSave // Callback ) )

NUMBER_FIELD() macros - creates menu-item for number edit:

NUMBER_FIELD( id, const char* textBefore, unsigned int* value, char* (*formatValue)(unsigned int value), const char* textAfter, const unsigned int minValue, const unsigned int maxValue, const unsigned int valueStep )

Formatters available:

- toTime - "01:00AM" for 60 (minutes) - toTime24 - "01:00" for 60 (minutes) - toPeriod - "01m" for < 60 (minutes) | "01h" for > 60 - toNumber - "1" for 1 - to2Digits - "01" - to3Digits - "001" - to4Digits - "0001" - to5Digits - "00001" - to6Digits - "000001" - to7Digits - "0000001" - to8Digits - "00000001" - to9Digits - "000000001" - to10Digits - "0000000001"

Usage example:

MENU(..., NUMBER_FIELD( distance, // id "Distance ", // Text before distanceValue, // Variable to change toNumber, // Value formatter " m.", // Text after 0, // min 50, // max 1 // step ) )

TEXT_FIELD() macros - creates menu-item for text edit:

TEXT_FIELD( id, const char* textBefore, char* value, const char* textAfter )

Usage example:

MENU(..., TEXT_FIELD( message, // id "Edit: '", // Text before messageText, // Variable to change "'" // Text after ) )

BLANK() macros - creates empty menu-item:

Use it in if menu should display 1 item only.

MENU(..., // Menu items: NUMBER_FIELD(...), // Single item BLANK() // need to add BLANK() item );

Default symbols:

Define symbol in your code to override default value.

#define SELECTED_LINE_START_SYMBOL ">" #define UNSELECTED_LINE_START_SYMBOL " " #define SELECTED_VALUE_START_SYMBOL ">" #define UNSELECTED_VALUE_START_SYMBOL " " #define ACTIVE_VALUE_START_SYMBOL " " #define UNACTIVE_VALUE_START_SYMBOL " " #define MENU_NAME_END_SYMBOL ":" #define OUTPUT_LINES_COUNT 255

About

Small arduino menu, what used program memory to store data.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published