#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// Input & Button Logic
const int numOfInputs = 4;
const int inputPins[numOfInputs] = {5, 4, 3, 2};
int inputState[numOfInputs];
int lastInputState[numOfInputs] = {LOW, LOW, LOW, LOW};
long lastDebounceTime[numOfInputs] = {0, 0, 0, 0};
long debounceDelay = 50; // Increase debounce delay for better stability
// LCD Menu Logic
const int numOfScreens = 5;
int currentScreen = 0;
String screens[numOfScreens][2] = {
{"Motor Extruder", "Rpm"},
{"Motor Penarik", "Rpm"},
{"Motor Pengarah", "Rpm"},
{"Motor Penggulung", "Rpm"},
{"Fan", "Secs"}
};
float parameters[numOfScreens];
bool screenChanged = true; // Flag to check if screen needs update
// Timing for parameter change
long lastParameterChangeTime[numOfInputs - 2] = {0, 0}; // Separate timing for increase/decrease
long parameterChangeInterval = 125; // 1 second interval
void setup() {
for (int i = 0; i < numOfInputs; i++) {
pinMode(inputPins[i], INPUT);
digitalWrite(inputPins[i], HIGH); // pull-up 20k
}
// Serial.begin(9600);
lcd.begin(16, 2);
printScreen(); // Initial screen display
}
void loop() {
setInputFlags();
resolveInputFlags();
}
void setInputFlags() {
for (int i = 0; i < numOfInputs; i++) {
int reading = digitalRead(inputPins[i]);
if (reading != lastInputState[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
if (reading != inputState[i]) {
inputState[i] = reading;
if (inputState[i] == HIGH) {
inputAction(i);
}
}
}
lastInputState[i] = reading;
}
}
void resolveInputFlags() {
unsigned long currentMillis = millis();
for (int i = 2; i < numOfInputs; i++) {
if (inputState[i] == LOW) { // Check if button is held down
if (currentMillis - lastParameterChangeTime[i - 2] >= parameterChangeInterval) {
parameterChange(i - 2); // Adjust parameter continuously every 1 second
lastParameterChangeTime[i - 2] = currentMillis; // Reset the timer
}
}
}
if (screenChanged) {
printScreen(); // Update screen only if there are changes
screenChanged = false; // Reset flag after updating
}
}
void inputAction(int input) {
if (input == 0) {
if (currentScreen == 0) {
currentScreen = numOfScreens - 1;
} else {
currentScreen --;
}
screenChanged = true; // Set flag to update screen
} else if (input == 1) {
if (currentScreen == numOfScreens - 1) {
currentScreen = 0;
} else {
currentScreen ++;
}
screenChanged = true; // Set flag to update screen
}
}
void parameterChange(int key) {
if (key == 0) {
parameters[currentScreen]+=0.05;
} else if (key == 1) {
parameters[currentScreen]-=0.05;
}
screenChanged = true; // Set flag to update screen
}
void printScreen() {
lcd.clear();
lcd.print(screens[currentScreen][0]);
lcd.setCursor(0, 1);
lcd.print(parameters[currentScreen]);
lcd.print(" ");
lcd.print(screens[currentScreen][1]);
}