Skip to content

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

License

Notifications You must be signed in to change notification settings

el-fuego/Arduino-progmem-menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 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