#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C 0x27, LCD 20x4
const byte ROWS = 4; // Jumlah baris pada keypad
const byte COLS = 4; // Jumlah kolom pada keypad
// Keypad mapping
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte rowPins[ROWS] = { 9, 8, 7, 6 }; // Pin baris pada keypad
byte colPins[COLS] = { 5, 4, 3, 2 }; // Pin kolom pada keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
enum menu_state { MAIN_MENU,
REGIST,
REFILLING,//belum
MASTER,//belum
REGIST_PASSCODE,
REGIST_SCAN,//belum
REGIST_VEHICLE_TYPE_0,
REGIST_VEHICLE_TYPE_1,
REGIST_VEHICLE_TYPE_2,
REGIST_VEHICLE_TYPE_3,
REGIST_VEHICLE_NUMBER,
REGIST_VEHICLE_QUOTA,
REGIST_VEHICLE_PASSCODE,
REGIST_VEHICLE_CONFIRMATION }; // Enum untuk status menu
menu_state current_state = MAIN_MENU; // Status menu awal
//Variable REGIST_PASSCODE STRING
int REGIST_PASSCODE_DATA = 123;
String regist_passcode_input = ""; //hasil input akhir
String regist_passcode_progress_input = ""; // Input yang sedang berlangsung
//Variable REGIST_VEHICLE_TYPE_X
String vehicle_type_data = ""; //Hasil pemilihan tipe kendaraan
String regist_vehicle_type_input = ""; // Input sementara pemilihan tipe kendaraan
//Variable REGIST_VEHICLE_NUMBER
int vehicle_number_data;
String regist_vehicle_number_input = "";
String regist_vehicle_number_progress_input = "";
//Variable REGIST_VEHICLE_QUOTA
int vehicle_quota_data;
String regist_vehicle_quota_input = "";
String regist_vehicle_quota_progress_input = "";
//Variable REGIST_VEHICLE_QUOTA
int vehicle_passcode_data;
String regist_vehicle_passcode_input = "";
String regist_vehicle_passcode_progress_input = "";
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
}
void loop() {
char key = keypad.getKey(); // Membaca tombol yang ditekan
// Handler untuk setiap status menu
switch (current_state) {
case MAIN_MENU:
{
lcd.setCursor(0, 0);
lcd.print("MAIN MENU:");
lcd.setCursor(0, 1);
lcd.print("A.REGISTRATION");
lcd.setCursor(0, 2);
lcd.print("B.REFILLING");
lcd.setCursor(0, 3);
lcd.print("C.MASTER");
if (key) {
switch (key) {
case 'A':
lcd.clear();
current_state = REGIST;
break;
case 'B':
lcd.clear();
break;
case 'C':
lcd.clear();
break;
default:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INPUT SALAH");delay(500);
lcd.clear();
break;
}
}
break;
}
case REGIST:
{
lcd.setCursor(0, 0);
lcd.print("ADMIN ONLY");
lcd.setCursor(0, 2);
lcd.print("Press A to CONTINUE");
lcd.setCursor(0, 3);
lcd.print("Press B to BACK");
if (key) {
switch (key) {
case 'A':
lcd.clear();
current_state = REGIST_PASSCODE;
break;
case 'B':
lcd.clear();
current_state = MAIN_MENU;
break;
}
}
break;
}
case REGIST_PASSCODE:
{
int passcode = 0;
lcd.setCursor(0, 0);
lcd.print("Enter Passcode");
lcd.setCursor(0, 1);
lcd.print("A.ENTER | D.DELETE");
lcd.setCursor(0, 2);
lcd.print("B.BACK");
lcd.setCursor(0, 3);
lcd.print("P:");
lcd.setCursor(3, 3);
lcd.print(regist_passcode_progress_input); // Menampilkan input yang sedang berlangsung
if (key != NO_KEY) {
if (key == 'D') {
// Menghapus konten LCD dan reset input
lcd.clear();
regist_passcode_progress_input = "";
regist_passcode_input = "";
passcode = 0;
} else if (key == 'A') {
// Tombol enter
lcd.clear();
passcode = regist_passcode_input.toInt();
if (passcode == REGIST_PASSCODE_DATA) {
lcd.setCursor(0, 0);
lcd.print("PASSCODE CORRECT");
delay(900);
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_0;
//current_state = REGIST_SCAN;
} else {
lcd.setCursor(0, 0);
lcd.print("PASSCODE FALSE");
delay(900);
}
regist_passcode_input = ""; // reset input setelah tombol enter ditekan
regist_passcode_progress_input = "";
delay(100); // delay untuk menghindari input ganda
} else if (key == 'B') {
lcd.clear();
current_state = REGIST;
regist_passcode_progress_input = "";
regist_passcode_input = "";
passcode = 0;
} else {
// Menambahkan karakter ke regist_passcode_progress_input
lcd.clear();
regist_passcode_progress_input += key;
regist_passcode_input += key; // Menambahkan karakter ke regist_passcode_input saat tombol ditekan
}
}
break;
}
case REGIST_VEHICLE_TYPE_0:
{
lcd.setCursor(0, 0);
lcd.print("CHOOSE VEHICLE TYPE:");
lcd.setCursor(0, 1);
lcd.print("Press NUM to CHOOSE");
lcd.setCursor(0, 2);
lcd.print("A.CONTINUE & NEXT");
lcd.setCursor(0, 3);
lcd.print("B.BACK & PREVIOUS");
if (key) {
switch (key) {
case 'A':
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_1; //Go to vehicle type page
break;
case 'B':
lcd.clear();
current_state = REGIST_PASSCODE; //Back to regist passcode page
break;
}
}
break;
}
case REGIST_VEHICLE_TYPE_1:
{
lcd.setCursor(0, 0);
lcd.print("CHOOSE VEHICLE TYPE:");
lcd.setCursor(0, 1);
lcd.print("1.CRANE");
lcd.setCursor(0, 2);
lcd.print("2.DOZER");
lcd.setCursor(0, 3);
lcd.print("3.DUMP TRUCK");
if (key) {
switch (key) {
case '1':
//Admin choose number 1
lcd.clear();
//go to next state
regist_vehicle_type_input = "CRANE";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case '2':
//Admin choose number 2
lcd.clear();
//go to next state
regist_vehicle_type_input = "DOZER";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case '3':
//Admin choose number 3
lcd.clear();
//go to next state
regist_vehicle_type_input = "DUMP TRUCK";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case 'A':
//Next page
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_2;
break;
case 'B':
//Back to VEHICLE TYPE MENU INFORMATION
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_0;
break;
}
}
break;
}
case REGIST_VEHICLE_TYPE_2:
{
lcd.setCursor(0, 0);
lcd.print("CHOOSE VEHICLE TYPE:");
lcd.setCursor(0, 1);
lcd.print("4.EXCAVATOR");
lcd.setCursor(0, 2);
lcd.print("5.LOADER");
lcd.setCursor(0, 3);
lcd.print("6.MANHAULER");
if (key) {
switch (key) {
case '4':
//Admin choose number 4
lcd.clear();
//go to next state
regist_vehicle_type_input = "EXCAVATOR";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case '5':
//Admin choose number 5
lcd.clear();
//go to next state
regist_vehicle_type_input = "LOADER";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case '6':
//Admin choose number 6
lcd.clear();
//go to next state
regist_vehicle_type_input = "MANHAULER";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case 'A':
//Next page
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_3;
break;
case 'B':
//Back to VEHICLE TYPE MENU INFORMATION
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_1;
break;
}
}
break;
}
case REGIST_VEHICLE_TYPE_3:
{
lcd.setCursor(0, 0);
lcd.print("CHOOSE VEHICLE TYPE:");
lcd.setCursor(0, 1);
lcd.print("7.SCRAPPER");
lcd.setCursor(0, 2);
lcd.print("8.WATER TRUCK");
if (key) {
switch (key) {
case '7':
//Admin choose number 7
lcd.clear();
//go to next state
regist_vehicle_type_input = "SCRAPPER";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case '8':
//Admin choose number 8
lcd.clear();
//go to next state
regist_vehicle_type_input = "WATER TRUCK";
vehicle_type_data = regist_vehicle_type_input;
regist_vehicle_type_input = "";
current_state = REGIST_VEHICLE_NUMBER;
break;
case 'A':
//Next page
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("END OF PAGE");
delay(500);
break;
case 'B':
//Back to VEHICLE TYPE MENU INFORMATION
lcd.clear();
current_state = REGIST_VEHICLE_TYPE_2;
break;
}
}
break;
}
case REGIST_VEHICLE_NUMBER:
{
lcd.setCursor(0, 0);
lcd.print("Enter Vehicle Number");
lcd.setCursor(0, 1);
lcd.print("A.ENTER | C.CHECK");
lcd.setCursor(0, 2);
lcd.print("B.BACK | D.DELETE");
lcd.setCursor(0, 3);
lcd.print("VN:");
lcd.setCursor(3, 3);
lcd.print(regist_vehicle_number_progress_input); // Menampilkan input yang sedang berlangsung
if (key != NO_KEY) {
if (key == 'A') {
// Tombol enter
lcd.clear();
vehicle_number_data = regist_vehicle_number_input.toInt();
regist_vehicle_number_input = ""; // reset input setelah tombol enter ditekan
regist_vehicle_number_progress_input = "";
current_state = REGIST_VEHICLE_QUOTA;
delay(100); // delay untuk menghindari input ganda
} else if (key == 'B') {
lcd.clear();
regist_vehicle_number_progress_input = "";
regist_vehicle_number_input = "";
vehicle_number_data = 0;
current_state = REGIST_VEHICLE_TYPE_0;
} else if (key == 'C') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TYPE :");
lcd.setCursor(7, 0);
lcd.print(vehicle_type_data);
delay(1000);
} else if (key == 'D') {
// Menghapus konten LCD dan reset input
lcd.clear();
regist_vehicle_number_progress_input = "";
regist_vehicle_number_input = "";
vehicle_number_data = 0;
} else {
// Menambahkan karakter ke regist_vehicle_number_progress_input
lcd.clear();
regist_vehicle_number_progress_input += key;
regist_vehicle_number_input += key; // Menambahkan karakter ke regist_vehicle_number_input saat tombol ditekan
}
}
break;
}
case REGIST_VEHICLE_QUOTA:
{
lcd.setCursor(0, 0);
lcd.print("Enter Vehicle Quota");
lcd.setCursor(0, 1);
lcd.print("A.ENTER | C.CHECK");
lcd.setCursor(0, 2);
lcd.print("B.BACK | D.DELETE");
lcd.setCursor(0, 3);
lcd.print("VQ:");
lcd.setCursor(3, 3);
lcd.print(regist_vehicle_quota_progress_input); // Menampilkan input yang sedang berlangsung
if (key != NO_KEY) {
if (key == 'A') {
// Tombol enter
lcd.clear();
vehicle_quota_data = regist_vehicle_quota_input.toInt();
regist_vehicle_quota_input = ""; // reset input setelah tombol enter ditekan
regist_vehicle_quota_progress_input = "";
current_state = REGIST_VEHICLE_PASSCODE;
delay(100); // delay untuk menghindari input ganda
} else if (key == 'B') {
lcd.clear();
regist_vehicle_quota_progress_input = "";
regist_vehicle_quota_input = "";
vehicle_quota_data = 0;
current_state = REGIST_VEHICLE_NUMBER;
} else if (key == 'C') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TYPE :");
lcd.setCursor(7, 0);
lcd.print(vehicle_type_data);
lcd.setCursor(0, 1);
lcd.print("NUMBER:");
lcd.setCursor(7, 1);
lcd.print(vehicle_number_data);
delay(1000);
} else if (key == 'D') {
// Menghapus konten LCD dan reset input
lcd.clear();
regist_vehicle_quota_progress_input = "";
regist_vehicle_quota_input = "";
vehicle_quota_data = 0;
} else {
// Menambahkan karakter ke regist_vehicle_quota_progress_input
lcd.clear();
regist_vehicle_quota_progress_input += key;
regist_vehicle_quota_input += key; // Menambahkan karakter ke regist_vehicle_quota_input saat tombol ditekan
}
}
break;
}
case REGIST_VEHICLE_PASSCODE:
{
lcd.setCursor(0, 0);
lcd.print("Enter Vehicle Pass");
lcd.setCursor(0, 1);
lcd.print("A.ENTER | C.CHECK");
lcd.setCursor(0, 2);
lcd.print("B.BACK | D.DELETE");
lcd.setCursor(0, 3);
lcd.print("VP:");
lcd.setCursor(3, 3);
lcd.print(regist_vehicle_passcode_progress_input); // Menampilkan input yang sedang berlangsung
if (key != NO_KEY) {
if (key == 'A') {
// Tombol enter
lcd.clear();
vehicle_passcode_data = regist_vehicle_passcode_input.toInt();
regist_vehicle_passcode_input = ""; // reset input setelah tombol enter ditekan
regist_vehicle_passcode_progress_input = "";
current_state = REGIST_VEHICLE_CONFIRMATION;
delay(100); // delay untuk menghindari input ganda
} else if (key == 'B') {
lcd.clear();
regist_vehicle_passcode_progress_input = "";
regist_vehicle_passcode_input = "";
vehicle_passcode_data = 0;
current_state = REGIST_VEHICLE_QUOTA;
} else if (key == 'C') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TYPE :");
lcd.setCursor(7, 0);
lcd.print(vehicle_type_data);
lcd.setCursor(0, 1);
lcd.print("NUMBER:");
lcd.setCursor(7, 1);
lcd.print(vehicle_number_data);
lcd.setCursor(0, 2);
lcd.print("QUOTA :");
lcd.setCursor(7, 2);
lcd.print(vehicle_quota_data);
delay(1000);
} else if (key == 'D') {
// Menghapus konten LCD dan reset input
lcd.clear();
regist_vehicle_passcode_progress_input = "";
regist_vehicle_passcode_input = "";
vehicle_passcode_data = 0;
} else {
// Menambahkan karakter ke regist_vehicle_passcode_progress_input
lcd.clear();
regist_vehicle_passcode_progress_input += key;
regist_vehicle_passcode_input += key; // Menambahkan karakter ke regist_vehicle_passcode_input saat tombol ditekan
}
}
break;
}
case REGIST_VEHICLE_CONFIRMATION:
{
lcd.setCursor(0, 0);
lcd.print("CONFIRM VEHICLE DATA");
lcd.setCursor(0, 1);
lcd.print("A.NEXT & SAVE");
lcd.setCursor(0, 2);
lcd.print("B.BACK | C.CHECK");
if (key) {
switch (key) {
case 'A':
{
//Isi dengan program yang menyimpan data-data
break;
}
case 'B':
{
lcd.clear();
current_state = REGIST_VEHICLE_PASSCODE;
break;
}
case 'C':
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TYPE :");
lcd.setCursor(7, 0);
lcd.print(vehicle_type_data);
lcd.setCursor(0, 1);
lcd.print("NUMBER:");
lcd.setCursor(7, 1);
lcd.print(vehicle_number_data);
lcd.setCursor(0, 2);
lcd.print("QUOTA :");
lcd.setCursor(7, 2);
lcd.print(vehicle_quota_data);
delay(1000);
break;
}
}
}
}
}
}