This example demonstrates the how to build a menu system.
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include "Button.h"
const byte LCD_RS = 12;
const byte LCD_E = 11;
const byte LCD_D4 = 5;
const byte LCD_D5 = 4;
const byte LCD_D6 = 3;
const byte LCD_D7 = 2;
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
const bool pullup = true;
Button left(A0, pullup);
Button right(7, pullup);
Button up(8, pullup);
Button down(9, pullup);
Button enter(10, pullup);
const byte pin6 = 6;
byte pin6_level = 0;
const byte pinA4 = A4;
byte pinA4_value = 0;
const byte pinA5 = A5;
byte pinA5_value = 0;
unsigned short sample_period = 2;
char* input_saved;
char* output_saved;
enum FunctionTypes {
increase = 1,
decrease = 2,
};
LiquidMenu main_menu(lcd, welcome_screen, io_screen, 1);
LiquidLine pin6_line(0, 0,
"Pin 6: ", pin6_level);
LiquidLine oSave_line(0, 0,
"Save", output_saved);
LiquidMenu outputs_menu(lcd, pin6_screen, oSecondary_screen);
LiquidLine pinA4_line(0, 0,
"Pin A4: ", pinA4_value);
LiquidLine pinA5_line(0, 1,
"Pin A5: ", pinA5_value);
LiquidLine iSample_line(0, 0,
"Sample: ", sample_period,
"s");
LiquidScreen iSecondary_screen(iSample_line, iSave_line, back_line);
LiquidMenu inputs_menu(lcd, pinsA4_A5_screen, iSecondary_screen);
LiquidSystem menu_system(main_menu, outputs_menu, inputs_menu);
void buttonsCheck() {
if (right.check() == LOW) {
menu_system.next_screen();
}
if (left.check() == LOW) {
menu_system.previous_screen();
}
if (up.check() == LOW) {
menu_system.call_function(increase);
}
if (down.check() == LOW) {
menu_system.call_function(decrease);
}
if (enter.check() == LOW) {
menu_system.switch_focus();
}
}
void go_back() {
menu_system.change_menu(main_menu);
}
void goto_outputs_menu() {
menu_system.change_menu(outputs_menu);
}
void goto_inputs_menu() {
menu_system.change_menu(inputs_menu);
}
void increase_pin6() {
if (pin6_level < 225) {
pin6_level += 25;
} else {
pin6_level = 250;
}
analogWrite(pin6, pin6_level);
output_saved = (char*)" ";
}
void decrease_pin6() {
if (pin6_level > 25) {
pin6_level -= 25;
} else {
pin6_level = 0;
}
analogWrite(pin6, pin6_level);
output_saved = (char*)" ";
}
void save_input() {
EEPROM.put(11, sample_period);
input_saved = (char*)" *";
}
void save_output() {
EEPROM.put(9, pin6_level);
output_saved = (char*)" *";
}
void increase_samplePeriod() {
if (sample_period < 10) {
sample_period++;
input_saved = (char*)" ";
}
}
void decrease_samplePeriod() {
if (sample_period > 0) {
sample_period--;
input_saved = (char*)" ";
}
}
void setup() {
Serial.begin(250000);
pinMode(pin6, OUTPUT);
EEPROM.get(9, pin6_level);
EEPROM.get(11, sample_period);
analogWrite(pin6, pin6_level);
lcd.begin(16, 2);
back_line.set_focusPosition(Position::LEFT);
back_line.attach_function(1, go_back);
back_line.attach_function(2, go_back);
outputs_line.attach_function(1, goto_outputs_menu);
outputs_line.attach_function(2, goto_outputs_menu);
inputs_line.attach_function(1, goto_inputs_menu);
inputs_line.attach_function(2, goto_inputs_menu);
pin6_line.attach_function(increase, increase_pin6);
pin6_line.attach_function(decrease, decrease_pin6);
oSave_line.attach_function(1, save_output);
oSave_line.attach_function(2, save_output);
iSave_line.attach_function(1, save_input);
iSave_line.attach_function(2, save_input);
iSample_line.attach_function(increase, increase_samplePeriod);
iSample_line.attach_function(decrease, decrease_samplePeriod);
input_saved = (char*)" *";
output_saved = (char*)" *";
menu_system.update();
}
void loop() {
buttonsCheck();
static unsigned long lastMillis_sample = 0;
if (millis() - lastMillis_sample > (sample_period * 1000)) {
lastMillis_sample = millis();
pinA4_value = analogRead(pinA4);
pinA5_value = analogRead(pinA5);
menu_system.update();
}
}