#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h> // Include the EEPROM library
// MENU ARRAYS
String menuOption[] = {"Setting 1", "Setting 2", "Setting 3", "Setting 4", "Setting 5"};
String measurementType[] = {"[Item1]", "[Item1]", "[Item1]", "[Item1]", "[item5]"};
// PINS ON THE ARDUINO.
const int leftButtonPin = 22;
const int rightButtonPin = 23;
const int upButtonPin = 24;
const int downButtonPin = 25;
const int enterButtonPin = 26;
const int clearButtonPin = 27;
// NUMBER COUNT OF BUTTON PRESSES AND COUNTER UNITS.
int setting1Counter = 0;
int setting2Counter = 0;
int setting3Counter = 0;
int setting4Counter = 0;
int setting5Counter = 0;
int directionPush = 0;
int upPressCount = 0;
int downPressCount = 0;
// BUTTON PRESS STATES FOR EACH FUNCTION, ALL SET TO "LOW".
boolean buttonStateLeft = LOW;
boolean lastButtonStateLeft = LOW;
boolean currentButtonStateLeft = LOW;
boolean buttonStateRight = LOW;
boolean lastButtonStateRight = LOW;
boolean currentButtonStateRight = LOW;
boolean buttonStateUp = LOW;
boolean lastButtonStateUp = LOW;
boolean currentButtonStateUp = LOW;
boolean buttonStateDown = LOW;
boolean lastButtonStateDown = LOW;
boolean currentButtonStateDown = LOW;
boolean buttonStateEnter = LOW;
boolean lastButtonStateEnter = LOW;
boolean currentButtonStateEnter = LOW;
boolean buttonStateClear = LOW;
boolean lastButtonStateClear = LOW;
boolean currentButtonStateClear = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int setting1Address = 0;
const int setting2Address = sizeof(int);
const int setting3Address = 2 * sizeof(int);
const int setting4Address = 3 * sizeof(int);
const int setting5Address = 4 * sizeof(int);
void setup() {
lcd.backlight();
lcd.init();
lcd.clear();
pinMode(leftButtonPin, INPUT);
pinMode(rightButtonPin, INPUT);
pinMode(upButtonPin, INPUT);
pinMode(downButtonPin, INPUT);
pinMode(enterButtonPin, INPUT);
pinMode(clearButtonPin, INPUT);
delay(1000);
setting1Counter = EEPROM.read(setting1Address);
setting2Counter = EEPROM.read(setting2Address);
setting3Counter = EEPROM.read(setting3Address);
setting4Counter = EEPROM.read(setting4Address);
setting5Counter = EEPROM.read(setting5Address);
}
void loop() {
int unitSetting[] = {setting1Counter, setting2Counter, setting3Counter, setting4Counter, setting5Counter};
lcd.setCursor(0, 0);
lcd.print(menuOption[directionPush]);
lcd.setCursor(0, 1);
lcd.print(unitSetting[directionPush]);
lcd.setCursor(5, 1);
lcd.print(measurementType[directionPush]);
currentButtonStateLeft = digitalRead(leftButtonPin);
currentButtonStateRight = digitalRead(rightButtonPin);
currentButtonStateUp = digitalRead(upButtonPin);
currentButtonStateDown = digitalRead(downButtonPin);
currentButtonStateEnter = digitalRead(enterButtonPin);
currentButtonStateClear = digitalRead(clearButtonPin);
if (currentButtonStateLeft != lastButtonStateLeft || currentButtonStateRight != lastButtonStateRight || currentButtonStateUp != lastButtonStateUp || currentButtonStateDown != lastButtonStateDown || currentButtonStateEnter != lastButtonStateEnter) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentButtonStateLeft != buttonStateLeft) {
buttonStateLeft = currentButtonStateLeft;
if (buttonStateLeft == LOW) {
directionPush--;
upPressCount = 0;
downPressCount = 0;
}
if (directionPush < 0) {
directionPush = 4;
}
lcd.clear();
}
if (currentButtonStateRight != buttonStateRight) {
buttonStateRight = currentButtonStateRight;
if (buttonStateRight == LOW) {
directionPush++;
upPressCount = 0;
downPressCount = 0;
}
if (directionPush > 4) {
directionPush = 0;
}
lcd.clear();
}
if (currentButtonStateUp != buttonStateUp) {
buttonStateUp = currentButtonStateUp;
if (buttonStateUp == LOW && directionPush == 0) {
upPressCount++;
downPressCount = 0;
setting1Counter++;
if (upPressCount > 5) {
setting1Counter = setting1Counter + 4;
}
if (setting1Counter > 999) {
setting1Counter = 999;
}
lcd.clear();
EEPROM.write(setting1Address, setting1Counter);
}
if (buttonStateUp == LOW && directionPush == 1) {
upPressCount++;
downPressCount = 0;
setting2Counter++;
if (upPressCount > 5) {
setting2Counter = setting2Counter + 4;
}
if (setting2Counter > 999) {
setting2Counter = 999;
}
lcd.clear();
EEPROM.write(setting2Address, setting2Counter);
}
if (buttonStateUp == LOW && directionPush == 2) {
upPressCount++;
downPressCount = 0;
setting3Counter++;
if (upPressCount > 5) {
setting3Counter = setting3Counter + 4;
}
if (setting3Counter > 999) {
setting3Counter = 999;
}
lcd.clear();
EEPROM.write(setting3Address, setting3Counter);
}
if (buttonStateUp == LOW && directionPush == 3) {
upPressCount++;
downPressCount = 0;
setting4Counter++;
if (upPressCount > 5) {
setting4Counter = setting4Counter + 4;
}
if (setting4Counter > 999) {
setting4Counter = 999;
}
lcd.clear();
EEPROM.write(setting4Address, setting4Counter);
}
if (buttonStateUp == LOW && directionPush == 4) {
upPressCount++;
downPressCount = 0;
setting5Counter++;
if (upPressCount > 5) {
setting5Counter = setting5Counter + 4;
}
if (setting5Counter > 999) {
setting5Counter = 999;
}
lcd.clear();
EEPROM.write(setting5Address, setting5Counter);
}
}
if (currentButtonStateDown != buttonStateDown) {
buttonStateDown = currentButtonStateDown;
if (buttonStateDown == LOW && directionPush == 0) {
downPressCount++;
upPressCount = 0;
setting1Counter--;
if (downPressCount > 5) {
setting1Counter = setting1Counter - 4;
}
if (setting1Counter < -999) {
setting1Counter = -999;
}
lcd.clear();
EEPROM.write(setting1Address, setting1Counter);
}
if (buttonStateDown == LOW && directionPush == 1) {
downPressCount++;
upPressCount = 0;
setting2Counter--;
if (downPressCount > 5) {
setting2Counter = setting2Counter - 4;
}
if (setting2Counter < -999) {
setting2Counter = -999;
}
lcd.clear();
EEPROM.write(setting2Address, setting2Counter);
}
if (buttonStateDown == LOW && directionPush == 2) {
downPressCount++;
upPressCount = 0;
setting3Counter--;
if (downPressCount > 5) {
setting3Counter = setting3Counter - 4;
}
if (setting3Counter < 0) {
setting3Counter = 0;
}
lcd.clear();
EEPROM.write(setting3Address, setting3Counter);
}
if (buttonStateDown == LOW && directionPush == 3) {
downPressCount++;
upPressCount = 0;
setting4Counter--;
if (downPressCount > 5) {
setting4Counter = setting4Counter - 4;
}
if (setting4Counter < 0) {
setting4Counter = 0;
}
lcd.clear();
EEPROM.write(setting4Address, setting4Counter);
}
if (buttonStateDown == LOW && directionPush == 4) {
downPressCount++;
upPressCount = 0;
setting5Counter--;
if (downPressCount > 5) {
setting5Counter = setting5Counter - 4;
}
if (setting5Counter < 0) {
setting5Counter = 0;
}
lcd.clear();
EEPROM.write(setting5Address, setting5Counter);
}
}
}
if (currentButtonStateEnter != buttonStateEnter) {
buttonStateEnter = currentButtonStateEnter;
if (buttonStateEnter == LOW && directionPush == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 1 PRICE.");
lcd.setCursor(0, 1);
lcd.print("IS SAVED");
delay(2000);
}
if (buttonStateEnter == LOW && directionPush == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 2 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS SAVED");
delay(2000);
}
if (buttonStateEnter == LOW && directionPush == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 3 PRICE.");
lcd.setCursor(0, 1);
lcd.print("IS SAVED");
delay(2000);
}
if (buttonStateEnter == LOW && directionPush == 3) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 4 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS SAVED");
delay(2000);
}
if (buttonStateEnter == LOW && directionPush == 4) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 5 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS SAVED");
delay(2000);
}
lcd.clear();
}
if (currentButtonStateClear != buttonStateClear) {
buttonStateClear = currentButtonStateClear;
if (buttonStateClear == LOW && directionPush == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 1 PRICE.");
lcd.setCursor(0, 1);
lcd.print("IS CLEARED");
setting1Counter = 0;
downPressCount = 0;
upPressCount = 0;
delay(2000);
EEPROM.write(setting1Address, setting1Counter);
}
if (buttonStateClear == LOW && directionPush == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 2 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS CLEARED");
setting2Counter = 0;
downPressCount = 0;
upPressCount = 0;
delay(2000);
EEPROM.write(setting2Address, setting2Counter);
}
if (buttonStateClear == LOW && directionPush == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 3 PRICE.");
lcd.setCursor(0, 1);
lcd.print("IS CLEARED");
setting3Counter = 0;
downPressCount = 0;
upPressCount = 0;
delay(2000);
EEPROM.write(setting3Address, setting3Counter);
}
if (buttonStateClear == LOW && directionPush == 3) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 4 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS CLEARED");
setting4Counter = 0;
downPressCount = 0;
upPressCount = 0;
delay(2000);
EEPROM.write(setting4Address, setting4Counter);
}
if (buttonStateClear == LOW && directionPush == 4) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ITEM 5 PRICE");
lcd.setCursor(0, 1);
lcd.print("IS CLEARED");
setting5Counter = 0;
downPressCount = 0;
upPressCount = 0;
delay(2000);
EEPROM.write(setting5Address, setting5Counter);
}
lcd.clear();
}
lastButtonStateLeft = currentButtonStateLeft;
lastButtonStateRight = currentButtonStateRight;
lastButtonStateUp = currentButtonStateUp;
lastButtonStateDown = currentButtonStateDown;
lastButtonStateEnter = currentButtonStateEnter;
lastButtonStateClear = currentButtonStateClear;
}