#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const uint8_t BARIS = 4;
const uint8_t KOLOM = 4;
char keys[BARIS][KOLOM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
uint8_t colPins[KOLOM] = {16, 4, 2, 15};
uint8_t barPins[BARIS] = {19, 18, 5, 17};
Keypad keypad = Keypad(makeKeymap(keys), barPins, colPins, BARIS, KOLOM);
int cursorPosition = 0; // Posisi kursor di halaman
int parameterPage = 0; // Halaman parameter saat ini (0: SpeedNoz/SpeedTab, 1: Tbenda/HitungMundur, 2: Tambahan/Mulai)
int selectedMenu = -1; // Menyimpan pilihan menu
bool inMenu = false; // Apakah sedang di dalam halaman menu
int SN; // Untuk SpeedNoz
int SpeedTabValue; // Untuk SpeedTab
int TbendaValue; // Untuk Tbenda
int HitungMundurValue; // Untuk HitungMundur
int TambahanValue; // Untuk Tambahan
int MulaiValue; // Untuk Mulai
void setup() {
lcd.init();
lcd.backlight();
// Menampilkan "HALLO" selama 2 detik
lcd.setCursor(0, 0);
lcd.print("HALLO");
delay(2000); // Tahan selama 2 detik
lcd.clear(); // Bersihkan LCD sebelum masuk ke loop
}
void loop() {
if (MulaiValue > 0) {
startProcess(MulaiValue); // Mulai proses berdasarkan nilai MulaiValue
MulaiValue = 0; // Reset nilai setelah memulai untuk menghindari pemanggilan berulang
}
if (inMenu) {
// Jika di dalam menu, tampilkan halaman yang dipilih dan tunggu tombol "D"
displaySelectedMenu(selectedMenu);
char key = keypad.getKey();
if (key == 'D') {
// Jika tombol D ditekan, kembali ke halaman parameter
inMenu = false;
lcd.clear(); // Bersihkan layar sebelum kembali ke tampilan parameter
}
return; // Keluar dari loop agar tidak melanjutkan ke logika halaman parameter
}
// Tampilkan halaman parameter berdasarkan halaman saat ini
displayParameterPage();
// Cek tombol yang ditekan
char key = keypad.getKey();
if (key == 'A') { // Tombol A untuk bergerak ke atas
cursorPosition = 0; // Kembali ke baris pertama
} else if (key == 'B') { // Tombol B untuk bergerak ke bawah
cursorPosition = 1; // Pindah ke baris kedua
} else if (key == 'C') { // Tombol C untuk berpindah halaman
parameterPage = (parameterPage + 1) % 3; // Berpindah ke halaman berikutnya, kembali ke halaman 1 setelah halaman 3
lcd.clear(); // Bersihkan layar saat berpindah halaman
} else if (key == '#') { // Tombol # sebagai tombol "Enter"
lcd.clear();
// Atur pilihan menu berdasarkan halaman dan posisi kursor
if (parameterPage == 0 && cursorPosition == 0) {
selectedMenu = 0; // SpeedNoz
} else if (parameterPage == 0 && cursorPosition == 1) {
selectedMenu = 1; // SpeedTab
} else if (parameterPage == 1 && cursorPosition == 0) {
selectedMenu = 2; // Tbenda
} else if (parameterPage == 1 && cursorPosition == 1) {
selectedMenu = 3; // HitungMundur
} else if (parameterPage == 2 && cursorPosition == 0) {
selectedMenu = 4; // Tambahan
} else if (parameterPage == 2 && cursorPosition == 1) {
selectedMenu = 5; // Mulai
}
inMenu = true; // Masuk ke halaman menu yang dipilih
}
// Bersihkan kursor dari baris yang sebelumnya
lcd.setCursor(15, (cursorPosition == 0) ? 1 : 0);
lcd.print(" "); // Hapus kursor dari baris yang lain
delay(200); // Delay untuk debounce tombol
}
void displayParameterPage() {
// Menampilkan halaman parameter berdasarkan parameterPage dan cursorPosition
if (parameterPage == 0) {
lcd.setCursor(0, 0);
lcd.print("SpeedNoz"); // Halaman 1: "SpeedNoz"
lcd.setCursor(0, 1);
lcd.print("SpeedTab"); // Halaman 1: "SpeedTab"
} else if (parameterPage == 1) {
lcd.setCursor(0, 0);
lcd.print("Tbenda"); // Halaman 2: "Tbenda"
lcd.setCursor(0, 1);
lcd.print("HitungMundur"); // Halaman 2: "HitungMundur"
} else if (parameterPage == 2) {
lcd.setCursor(0, 0);
lcd.print("Tambahan"); // Halaman 3: "Tambahan"
lcd.setCursor(0, 1);
lcd.print("Mulai"); // Halaman 3: "Mulai"
}
// Tampilkan kursor "<" di samping teks yang dipilih
lcd.setCursor(15, cursorPosition); // 15 adalah posisi kolom untuk kursor
lcd.print("<"); // Tampilkan simbol kursor
}
void displaySelectedMenu(int menu) {
lcd.clear();
switch (menu) {
case 0:
lcd.setCursor(0, 0);
lcd.print("SpeedNoz dipilih");
lcd.setCursor(0, 1);
lcd.print("Speed: ");
inputNumberFromKeypad(0); // Panggil input untuk SpeedNoz
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("SpeedTab dipilih");
lcd.setCursor(0, 1);
lcd.print("Speed: ");
inputNumberFromKeypad(1); // Panggil input untuk SpeedTab
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Tbenda dipilih");
lcd.setCursor(0, 1);
lcd.print("Tinggi: ");
inputNumberFromKeypad(2); // Panggil input untuk Tbenda
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("HitungMundur dipilih");
lcd.setCursor(0, 1);
lcd.print("Timer: ");
inputNumberFromKeypad(3); // Panggil input untuk HitungMundur
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("Tambahan dipilih");
inputNumberFromKeypad(4); // Panggil input untuk Tambahan
break;
case 5:
lcd.setCursor(0, 0);
lcd.print("Mulai dipilih");
inputNumberFromKeypad(5); // Panggil input untuk Mulai
break;
}
}
void inputNumberFromKeypad(int menu) {
String input = ""; // Variabel untuk menyimpan input dari keypad
char key = keypad.getKey(); // Baca input dari keypad
while (key != '#') { // '#' sebagai tombol enter
if (key) {
if (key >= '0' && key <= '9') { // Jika tombol yang ditekan adalah angka
input += key; // Tambahkan angka ke variabel input
lcd.setCursor(7, 1); // Posisikan di kolom 7 baris kedua untuk menulis angka
lcd.print(input); // Tampilkan input yang sudah ditambahkan
} else if (key == '*') { // '*' sebagai tombol clear
input = ""; // Reset input
lcd.setCursor(7, 1);
lcd.print(" "); // Bersihkan area input di LCD
}
}
key = keypad.getKey(); // Baca input selanjutnya
}
// Ketika '#' ditekan, simpan input ke variabel yang sesuai
if (menu == 0) {
SN = input.toInt(); // Simpan untuk SpeedNoz
} else if (menu == 1) {
SpeedTabValue = input.toInt(); // Simpan untuk SpeedTab
} else if (menu == 2) {
TbendaValue = input.toInt(); // Simpan untuk Tbenda
} else if (menu == 3) {
HitungMundurValue = input.toInt(); // Simpan untuk HitungMundur
} else if (menu == 4) {
TambahanValue = input.toInt(); // Simpan untuk Tambahan
} else if (menu == 5) {
MulaiValue = input.toInt(); // Simpan untuk Mulai
}
lcd.setCursor(0, 1);
lcd.print("Input selesai"); // Tampilkan pesan input selesai
delay(1000); // Tunggu sebentar sebelum kembali
inMenu = false;
lcd.clear();
}
void startProcess(int mulaiValue) {
// Kumpulkan nilai dalam format yang diinginkan
String output = "[" + String(SN) + "] [1] [" + String(TbendaValue) + "] [" + String(SN) + "] [" + String(HitungMundurValue) + "]";
// Tampilkan output di Serial Monitor
Serial.println(output);
}