lcdMenu/README.md

6.3 KiB

lcdMenu

A micropython library, which supports vertical and horizontal scrolling through menu items on both 2x16 and 4x20 liquid crystal displays

This project is the completely rewritten successor of my old (and now archived) ProgramChooser library.

It is now production-ready (tested on 2x16 displays only at the moment.) ToDo: Make the README.md also seem production ready!

Roadmap

  • forward, backward and select button
  • support for horizontal and vertical scrolling
  • support for both 2x16 and 4x20 LCDs
  • a reliable order of the menu items
  • good documentation for all of this (maybe through examples)
  • show an exit screen when a specific exit code is returned by a callback function
  • make the menu itself exitable (to enable stuff like submenus, etc.)
  • make the project a valid python package

Here are some of examples of how a lcdMenu will look, and to get those, simply append the Code column's contents to the following (considering you have the library "installed" as explained before. All the examples below use a 2x16 display.

from lcdMenu import lcdMenu
from machine import Pin, I2C
from PCF8574T import I2C_LCD

prev_btn = Pin(13, Pin.IN, Pin.PULL_DOWN)  # input of the first btn
next_btn = Pin(14, Pin.IN, Pin.PULL_DOWN)  # input of the second btn
ok_btn   = Pin(15, Pin.IN, Pin.PULL_DOWN)  # input of switch

LCD = I2C_LCD(I2C(0, sda=Pin(8), scl=Pin(9), freq=400000),0x27,2, 16)

def first():
    print("first() called! 1")
def second():
    print("second() called! 2")
def third():
    print("third() called! 3")
    return True


menuItems = [("first item", first),
             ("second item", second),
             ("third item", third)]
button_mappings = {"prev_btn":prev_btn, "next_btn": next_btn, "ok_btn": ok_btn}
Cycling Title shown Scroll direction Initial selection Result Code
yes no vertical first No title, first item & cycling on -> up & down, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=True, hide_menu_name=True)
menu.setup(menuItems)
menu.run()
no no vertical first No title, first item & no cycling -> only down, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True)   # <- change of cycle to False!
menu.setup(menuItems)
menu.run()
no no vertical middle No title, middle item -> up & down, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True
menu.setup(menuItems, start_selection=1)  # <- change of the initial selection
menu.run()
no no vertical last No title, last item & no cycling -> only up, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=True)
menu.setup(menuItems, start_selection=2)  # <- set initial selection to the last element
menu.run()
no yes vertical no options (first and last) With title, only one option, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="No options!")  # now with a title
menu.setup([("Only option", lambda: print("Only option chosen!"))])  # now with only one option (ignoring menuItems!)
menu.run()
no yes vertical first With title, first item & no cycling -> only down, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="No options!")
menu.setup(menuItems)  # now with menuItems again
menu.run()
no yes vertical middle With title, middle item -> up & down, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="lcdMenu!")
menu.setup(menuItems, start_selection=1)  # now with an index again
menu.run()
no yes vertical last With title, last item & no cycling -> only up, vertical scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=False, cycle=False, hide_menu_name=False, name="lcdMenu!")
menu.setup(menuItems, start_selection=2)  # <- set initial selection to the last element
menu.run()
yes yes horizontal first With title, middle item -> forward and backward, horizontal scrolling
menu = lcdMenu(LCD, button_mappings, scroll_direction=True, cycle=True, hide_menu_name=False, name="lcdMenu!")
menu.setup(menuItems)
menu.run()

License

This project is licensed under the GPL-v3-or-later. A copy can be found here.