#include <Wire.h>
//-- Inisialisasi LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//-- Inisialisasi Ultrasonic Sensor
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //-- RX, TX
unsigned char data[4] = {}; //-- Senosr Value
//-- Inisialisasi Keypad 4x4
#include <Keypad.h>
const byte ROWS = 4; //-- Jumlah baris
const byte COLS = 4; //-- Jumlah kolom
char key;
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}; //-- Pin baris R1, R2, R3, R4
byte colPins[COLS] = {29, 28, 27, 26}; //-- Pin kolom C1, C2, C3, C4
Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//-- Button Setting
char BUP = 'A'; //-- Button "Up"
char BDN = 'B'; //-- Button "Down"
char BOK = 'C'; //-- Button "Ok"
char DEL = 'D'; //-- Button "Delete"
char BCK = '#'; //-- Button "Back"
#include <EEPROM.h>
//--Data to be saved
struct DataEEPROM {
char password[50];
int dataDistance[14];
int dataDelay[6];
bool isInitialized;
};
DataEEPROM dataEEPROM; //--Object data eeprom
byte index;
String inputData, inputPassword, dataPass = ""; //--String to store entered characters
const byte maxInput1 = 8, maxInput2 = 3; //--Maximum input length
//-- Inisialisasi GPIO Tower Lamp Indicator
#define LTRUCK 37
#define L50KL 36
#define L20KL 35
#define LPUMP 34
//-- Inisialisasi GPIO Electrical Water Pump
#define VALVE 33
#define ACC 32
#define START 31
//-- Inisialiasi Voltage Divider (50v max)
int VoltDiv = A0;
float vin = 0.0;
float result = 0.0;
float R1 = 7500.0; //-- Resistor 7.5K
float R2 = 68000.0; //-- Resistor 68K
int value = 0;
const byte crankingValue = 13;
//-- Truck Variable
byte TruckChoice, count_20KL, count_50KL;
const int Delay = 150;
int ledState, starterState = LOW;
int distance;
//-- Time Delay with Millis
unsigned long startMillis1, startMillis2, startMillis3, startMillis4;
unsigned long currentMillis, currentPassMillis, currentLedMillis, currentStarterMillis, delayMillis, serialMillis;
unsigned long previousMillis, previousLedMillis, previousStarterMillis, previousSerialMillis;
unsigned long elapsedSeconds1, elapsedSeconds2;
unsigned long displayStartTime;
//--Logic Variable
bool state, Mode20KL, Mode50KL;
bool inMenu = false;
//-- Restart After Setup
void(* reset) (void) = 0;
const char* messagesDistance[] = {
"Detect No Truck : ",
"DistanceHopper 20KL:",
"Water Empty 20KL: ",
"Water Full 20KL : ",
"DistanceHopper 50KL:",
"Water Empty 50KL: ",
"Water Full 50KL : "
};
const char* messagesDelay[] = {
"Delay Parking 20KL :",
"Delay Leave 20KL : ",
"Delay Parking 50KL :",
"Delay Leave 50KL : ",
"Delay Crangking : ",
"Delay Led Truck : "
};
void setup() {
Serial.begin(115200);
mySerial.begin(9600);
lcd.init();
lcd.backlight();
//-- Pin Input
pinMode(VoltDiv, INPUT);
//-- Pin Output
pinMode(LTRUCK, OUTPUT);
pinMode(L50KL, OUTPUT);
pinMode(L20KL, OUTPUT);
pinMode(LPUMP, OUTPUT);
pinMode(VALVE, OUTPUT);
pinMode(ACC, OUTPUT);
pinMode(START, OUTPUT);
//-- Status Output
digitalWrite(LTRUCK, LOW);
digitalWrite(L50KL, LOW);
digitalWrite(L20KL, LOW);
digitalWrite(LPUMP, LOW);
digitalWrite(VALVE, LOW);
digitalWrite(ACC, LOW);
digitalWrite(START, LOW);
//-- Status Truck
state = false;
Mode20KL = false;
Mode50KL = false;
EEPROM.get(0, dataEEPROM);
//--If not initialized, set initial value
if (!dataEEPROM.isInitialized) {
strcpy(dataEEPROM.password, "12345678"); //--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[1] = 5;
dataEEPROM.dataDelay[2] = 10;
dataEEPROM.dataDelay[3] = 5;
dataEEPROM.dataDelay[4] = 3;
dataEEPROM.dataDelay[5] = 2;
dataEEPROM.isInitialized = true; // Mark data as initialized
EEPROM.put(0, dataEEPROM); // Save to EEPROM
}
dataPass = dataEEPROM.password;
//-- Welcome Text
lcd.setCursor(4, 0); lcd.print("Welcome to");
lcd.setCursor(2, 1); lcd.print("Water Matic v2.0");
delay(3000); lcd.clear();
lcd.setCursor(2, 0); lcd.print("Press 'C' Button");
lcd.setCursor(2, 1); lcd.print("to Menu Setting");
delay(2000);
lcd.clear();
}
void loop() {
currentMillis = millis();
if (currentMillis - previousMillis >= Delay) {
previousMillis = currentMillis;
mainLogic();
inMenu = true;
}
if (inMenu) {
key = keypad.getKey();
if (key == BOK) {
passMenu();
inMenu = false;
}
}
serialMillis = millis();
if (serialMillis - previousSerialMillis >= 1000) {
previousSerialMillis = serialMillis;
sendDataString();
}
/*Led Condition*/
if (count_50KL == 0) {
digitalWrite(L50KL, LOW);
} else if (count_50KL == 1) {
ledBlink(36);
} else if (count_50KL == 2) {
digitalWrite(L50KL, HIGH);
}
if (count_20KL == 0) {
digitalWrite(L20KL, LOW);
} else if (count_20KL == 1) {
ledBlink(35);
} else if (count_20KL == 2) {
digitalWrite(L20KL, HIGH);
}
}