#include <EEPROM.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//--Object data eeprom
struct DataEEPROM {
char password[50]; //--Max 8 character & 1 Data
int dataDistance[14]; //--Max 14 Data
int dataDelay[6]; //--Max 6 Data
bool isInitialized;
};
DataEEPROM dataEEPROM;
int index;
String inputData = ""; //--String to store entered characters
const byte maxInput1 = 8, maxInput2 = 3; //--Maximum input length
//-- Button Setting
char BUP = 'A'; //-- Button "Up"
char BDN = 'B'; //-- Button "Down"
char BOK = 'C'; //-- Button "Ok"
char BCK = '#'; //-- Button "Back"
//--Keypad Pin Configuration
char key;
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = { 25, 24, 23, 22 }; // Pins connected to R1, R2, R3, R4
byte colPins[COLS] = { 29, 28, 27, 26 }; // Pins connected to C1, C2, C3, C4
Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(57600);
lcd.init();
lcd.backlight();
EEPROM.get(0, dataEEPROM);
// Jika belum diinisialisasi, tetapkan nilai awal
if (!dataEEPROM.isInitialized) {
strcpy(dataEEPROM.password, "ELEKTRO_21"); // password default
dataEEPROM.dataDistance[0] = 360;
dataEEPROM.dataDistance[1] = 100;
dataEEPROM.dataDistance[2] = 200;
dataEEPROM.dataDistance[3] = 250;
dataEEPROM.dataDistance[4] = 210;
dataEEPROM.dataDistance[5] = 260;
dataEEPROM.dataDistance[6] = 200;
dataEEPROM.dataDistance[7] = 210;
dataEEPROM.dataDistance[8] = 100;
dataEEPROM.dataDistance[9] = 150;
dataEEPROM.dataDistance[10] = 110;
dataEEPROM.dataDistance[11] = 260;
dataEEPROM.dataDistance[12] = 100;
dataEEPROM.dataDistance[13] = 110;
dataEEPROM.dataDelay[0] = 10;
dataEEPROM.dataDelay[2] = 5;
dataEEPROM.dataDelay[3] = 10;
dataEEPROM.dataDelay[4] = 5;
dataEEPROM.dataDelay[5] = 3;
dataEEPROM.dataDelay[6] = 2;
dataEEPROM.isInitialized = true; // Tandai data telah diinisialisasi
EEPROM.put(0, dataEEPROM); // Simpan ke EEPROM
Serial.println("Data awal telah diinisialisasi ke EEPROM.");
}
lcd.setCursor(0, 0); lcd.print(" Welcome to");
lcd.setCursor(0, 1); lcd.print(" Water Matic v1.0");
delay(2000);
lcd.clear();
lcd.setCursor(5, 0); lcd.print("Click 'C'");
lcd.setCursor(2, 1); lcd.print("to set distance");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Input:");
}
void loop() {
saveData(2,0,5);
}
void saveData (byte selectData, byte startIndex, byte endIndex) {
static byte index = startIndex;
key = keypad.getKey();
if (selectData == 1) {
// lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setting Password:");
if (key) {
if (key == 'C') {
// Clear the input string
if (inputData.length() < sizeof(dataEEPROM.password)) {
inputData.toCharArray(dataEEPROM.password, sizeof(dataEEPROM.password));
EEPROM.put(0, dataEEPROM);
inputData = "";
clearLCD("Update Success");
}
}
else if (key == 'D') {
// Delete the last character
if (inputData.length() > 0) {
inputData.remove(inputData.length() - 1);
}
}
else {
// Add the key to the string if it's not full
if (inputData.length() < maxInput1) {
inputData += key;
} else {
displayMessage("Max Input");
}
}
printToLCD();
}
}
//--Save new distance
else if (selectData == 2) {
while (1) {
key = keypad.getKey();
if (key) {
//==========>Confirm to save data<==========
if (key == 'C') {
if (inputData.length() > 0) {
int value = inputData.toInt();
if (index >= startIndex && index <= endIndex) {
dataEEPROM.dataDistance[index] = value; // Simpan nilai ke array
EEPROM.put(0, dataEEPROM); // Simpan ke EEPROM
inputData = ""; // Reset buffer input
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(18, 0); lcd.print(index);
}
}
// Switch to next index
index++;
if (index > endIndex) {
index = startIndex; // Kembali ke indeks awal jika melebihi batas
clearLCD("Update Success");
settingMenu(1);
break;
}
}
//==========>Delete data<==========
else if (key == 'D') {
// Delete the last character
if (inputData.length() > 0) {
inputData.remove(inputData.length() - 1);
lcd.setCursor(inputData.length(),1);lcd.print(" ");
}
}
//==========>Add data<==========
else {
if (inputData.length() < maxInput2) {
inputData += key;
} else {
displayMessage("Max Input");
}
}
printToLCD();
}
if (index % 2 != 0) {
lcd.setCursor(0, 1); lcd.print("Distance > ");
} else {
lcd.setCursor(0, 1); lcd.print("Distance < ");
}
}
}
//--Save new delay
else if (selectData = 3) {
if (index == 0) {
lcd.setCursor(0, 0);
lcd.print("Setting distance:");
} else if (index == 1) {
lcd.setCursor(0, 0);
lcd.print("Setting jarak :");
} else {
lcd.setCursor(0, 0);
lcd.print("Setting bumi :");
}
if (key) {
//==========>Confirm to save data<==========
if (key == 'C') {
if (inputData.length() > 0) {
int value = inputData.toInt();
if (index >= startIndex && index <= endIndex) {
dataEEPROM.dataDelay[index] = value; // Simpan nilai ke array
EEPROM.put(0, dataEEPROM); // Simpan ke EEPROM
inputData = ""; // Reset buffer input
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(18, 0); lcd.print(index);
}
}
// Switch to next index
index++;
if (index > endIndex) {
index = startIndex; // Kembali ke indeks awal jika melebihi batas
displayMessage("Update Success");
}
}
//==========>Delete data<==========
else if (key == 'D') {
// Delete the last character
if (inputData.length() > 0) {
inputData.remove(inputData.length() - 1);
lcd.setCursor(inputData.length(), 1); lcd.print(" ");
}
}
//==========>Add data<==========
else {
if (inputData.length() < maxInput2) {
inputData += key;
} else {
displayMessage("Max Input");
}
}
printToLCD();
}
lcd.setCursor(18, 0); lcd.print(index);
}
}
void printToLCD() {
// lcd.clear();
lcd.setCursor(0, 1);
lcd.print(inputData);
}
void showData() {
lcd.setCursor(0, 0); lcd.print(dataEEPROM.password);
for (int i = 0; i < 14; i++) {
lcd.setCursor(0, 1);
Serial.print(dataEEPROM.dataDistance[i]);
if (i < 14) Serial.print("|");
}
Serial.println();
}
void displayMessage(const char *message) {
lcd.setCursor(0, 2);
lcd.print("Error: ");
lcd.print(message);
delay(2000); // Display the error message for 2 seconds
lcd.setCursor(0, 2);
lcd.print(" "); // Clear the error message
}
void clearLCD(const char *message) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(message);
delay(2000); // Display the clear message for 2 seconds
lcd.clear();
}