/*
Basic Menu
https://lcdmenu.forntoh.dev/examples/basic
*/
#include <ItemSubMenu.h>
#include <ItemToggle.h>
#include <ItemCommand.h>
#include <ItemInput.h>
#include <LiquidCrystal_I2C.h>
#include <LcdMenu.h>
#include <utils/commandProccesors.h>
#define LCD_ROWS 2
#define LCD_COLS 16
#define I2C_ADDR 0x27
extern MenuItem* settingsMenu[];
extern MenuItem* fillTankMenu[];
void fillTank();
void normalOp();
void pumpState(uint16_t isOn);
void valvesMoving();
void returnState();
void relayControl();
bool pumpSwitch;
int currentMode;
int prevMode;
unsigned long time;
unsigned long opTime;
unsigned long valvesTime;
unsigned long valvesMovedT;
// Configure keyboard keys (ASCII)
int UP = 7; // NUMPAD 8
int DOWN = 8; // NUMPAD 2
int ENTER = 9; // NUMPAD 5
int BACK = 2; // NUMPAD 7
// Initialize the main menu items
MAIN_MENU(
ITEM_COMMAND("Normal Op", normalOp),
ITEM_SUBMENU("Fill From EXT", fillTankMenu),
ITEM_BASIC("Blink SOS"),
ITEM_SUBMENU("Settings", settingsMenu)
);
/**
* Create the submenu and precise its parent
*/
SUB_MENU(settingsMenu, mainMenu,
ITEM_TOGGLE("Pump State", "Run", "Off", pumpState),
ITEM_BASIC("Contrast")
);
SUB_MENU(fillTankMenu, mainMenu,
ITEM_COMMAND("Connect Tank to", fillTank),
ITEM_COMMAND("EXT & Click", fillTank)
);
// Construct the LcdMenu
LcdMenu menu(LCD_ROWS, LCD_COLS);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLS, LCD_ROWS); // construct lcd text
void setup() {
pinMode(UP, INPUT_PULLUP);
pinMode(DOWN, INPUT_PULLUP);
pinMode(ENTER, INPUT_PULLUP);
pinMode(BACK, INPUT_PULLUP);
pinMode(13, OUTPUT);
Serial.begin(9600);
pumpSwitch = 0;
currentMode = "Normal";
lcd.init(); //initialise lcd without using menu
lcd.setCursor(0, 0); // set lcd cursor pos
// Initialize LcdMenu with the menu items
menu.setupLcdWithMenu(0x27, mainMenu);
lcd.backlight(); // turn on lcd backlight to stop flickering on startup.
}
void loop() {
time = millis();
if (!digitalRead(UP)) {
menu.up();
while(millis() < time+200);
while (!digitalRead(UP));
}
if (!digitalRead(DOWN)) {
menu.down();
while(millis() < time+200);
while (!digitalRead(DOWN));
}
if (!digitalRead(ENTER)) {
menu.enter();
while(millis() < time+200);
while (!digitalRead(ENTER));
}
if (!digitalRead(BACK)) {
menu.back();
while(millis() < time+200);
while (!digitalRead(BACK));
}
}
void normalOp() {
prevMode = currentMode;
currentMode = 1;
relayControl();
lcd.clear();
menu.show();
}
void fillTank() {
// Single run code
}
void pumpState(uint16_t isOn) { //Working Toggle Code
pumpSwitch = !pumpSwitch;
if (pumpSwitch == true) {
digitalWrite(13, HIGH);
}
else {
digitalWrite(13, LOW);
}
}
void normalOpResumed(){
opTime = millis();
lcd.setCursor(0, 1);
lcd.print("Can Be Resumed");
lcd.setCursor(0, 0);
lcd.print("Normal Operation");
while(millis() < opTime + 10000){
}
}
void returnState(){
currentMode = prevMode;
Serial.println("Returning state");
lcd.clear();
lcd.print("Please Wait...");
lcd.setCursor(0, 1);
lcd.print("Valves Returning");
valvesMovedT = (millis() - valvesTime) + millis();
while(millis() < valvesMovedT){
}
lcd.clear();
}
void valvesMoving(){
menu.hide();
valvesTime = millis();
lcd.print("Please Wait...");
lcd.setCursor(0, 1);
lcd.print("Valves Moving");
while(millis() < valvesTime + 20000){
if(!digitalRead(BACK)){
Serial.println("Interrupted Move");
returnState();
break;
}
}
}
void relayControl(){
switch (currentMode) {
case 1:
Serial.println("Normal Mode Activated");
valvesMoving();
}
}