Aplikasi menu arduino memang menarik namun tidak mudah untuk dibuat. Arduino menggunakan menu merupakan aplikasi yang menampilkan sejumlah pilihan sehingga pengguna bisa memilih/merubah pilihannya.
Menu interaktif lebih cocok digunakan apabila sejumlah pilihan tidak bisa ditampilkan dalam satu halaman. Misalnya menampilkan menu pada LCD karakter 16×2 yang hanya bisa menampung 16 karakter setiap barisnya.
Salah satu menu yang sering digunakan adalah menu-menu makanan dan minuman pada penerapan restoran yang menggunakan sistem digital terkoneksi.
Kelebihan Menu I2C LCD Arduino ini adalah:
- Tampilan interaktif bergilir setiap 1 detik dan tampil 5 detik ketika hendak dipilih.
- Menggunakan keypad 4×4 sehingga lebih lega.
Video menu interaktif arduino:
Dalam perancangan berbasis arduino ini digunakan komponen berikut :
- Arduino Uno
- LCD 1602 + I2C
- Keypad 4×4
skema menu arduino LCD dan keypad:
koding/sketch menu keypad arduino:
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {4, 5, 6, 7};
byte colPins[COLS] = {8, 9, 10, 11};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x3F, 16, 2);
struct daftarMenu {
char strMenu[17];
uint32_t harga;
bool pilihan;
};
char menuUtama[][17] = {
"0..9 - Pilih ",
"* - Pilih ",
"# - Batal ",
"A - Makanan ",
"B - Minuman ",
"C - Total/Pesan ",
"D - Batal ",
};
daftarMenu menuMakanan[] = {
{"1 Nasi Goreng ", 13000L, false},
{"2 Mie Goreng ", 8000L, false},
{"3 Bihun Goreng ", 8000L, false},
{"4 Mie Rebus ", 6000L, false},
{"5 Gado-gado ", 13000L, false},
{"6 Soto Padang ", 15000L, false},
{"7 Sate Padang ", 18000L, false},
};
daftarMenu menuMinuman[] = {
{"1 Es Campur ", 6000L, false},
{"2 Es Tebak ", 7500L, false},
{"3 Es Kosong ", 2000L, false},
{"4 Jus Jeruk ", 6000L, false},
{"5 Jus Pokat ", 6500L, false},
{"6 Kopi ", 4000L, false},
{"7 Teh Panas ", 4000L, false},
{"8 Teh Telur ", 8000L, false},
};
int8_t indexMenu = -1;
byte menuLevel = 0;
byte menuLevelSebelumnya = -1;
enum ModeMenu {
modeMenuMakanan,
modeMenuMinuman,
};
ModeMenu modeMenu;
#define standarWaktuTampil 1000L
#define LihatWaktuTampil 5000L
#define jumlahMakanan sizeof(menuMakanan)/sizeof(menuMakanan[0])
#define jumlahMinuman sizeof(menuMinuman)/sizeof(menuMinuman[0])
uint16_t waktuTampil;
unsigned long millisMulai;
void setup()
{
Serial.begin(9600);
Serial.println("Menu LCD Arduino dengan keypad");
Serial.println("https://www.project.semesin.com/");
Wire.begin();
Wire.beginTransmission(0x3F);
if (Wire.endTransmission())
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
lcd.begin ();
lcd.backlight();
// tampilanDepan();
millisMulai = millis();
resetPilihan();
}
void loop()
{
char key = keypad.getKey();
if (key) {
Serial.println(key);
switch (key)
{
case 'A':
menuLevel = 1;
indexMenu = -1;
modeMenu = modeMenuMakanan;
break;
case 'B':
menuLevel = 1;
indexMenu = -1;
modeMenu = modeMenuMinuman;
break;
case 'C':
menuLevel = 2;
updateMenu();
break;
case 'D':
resetPilihan();
menuLevel = 0;
indexMenu = -1;
updateMenu();
break;
case '*':
if (menuLevel == 2)
{
pesananMasuk();
}
else
{
if (waktuTampil == LihatWaktuTampil)
{
if (modeMenu == modeMenuMakanan)
{
menuMakanan[indexMenu].pilihan = true;
}
else if (modeMenu == modeMenuMinuman)
{
menuMinuman[indexMenu].pilihan = true;
}
updateMenu();
}
else
{
waktuTampil = LihatWaktuTampil;
millisMulai = millis();
}
}
break;
case '#':
if (menuLevel == 2)
{
menuLevel = 1;
}
else
{
if (waktuTampil == LihatWaktuTampil)
{
if (modeMenu == modeMenuMakanan)
{
menuMakanan[indexMenu].pilihan = false;
}
else if (modeMenu == modeMenuMinuman)
{
menuMinuman[indexMenu].pilihan = false;
}
updateMenu();
}
else
{
waktuTampil = LihatWaktuTampil;
millisMulai = millis();
}
}
break;
default:
indexMenu = key - '1';
updateMenu();
millisMulai = millis();
waktuTampil = LihatWaktuTampil;
break;
}
}
if (millis() - millisMulai > waktuTampil)
{
millisMulai = millis();
waktuTampil = standarWaktuTampil;
indexMenu++;
updateMenu();
menuLevelSebelumnya = menuLevel;
}
}
void pesananMasuk()
{
//Aksi pesanan masuk
lcd.setCursor(0, 0);
lcd.println(" Terima Kasih ");
lcd.setCursor(0, 1);
lcd.println("Silahkan tunggu ");
delay(3000);
Serial.println("Pesanan masuk!!!");
menuLevel = 0;
indexMenu = -1;
}
void updateMenu()
{
if (menuLevel == 0)
{
if (indexMenu == sizeof(menuUtama) / sizeof(menuUtama[0]))
{
indexMenu = 0;
}
if (menuLevelSebelumnya != menuLevel)
{
lcd.clear();
lcd.print("Selamat Datang");
}
tampilMenuUtama(indexMenu);
}
else if (menuLevel == 2)
{
lcd.setCursor(0, 0);
lcd.print("Rp. ");
formatStrHarga(totalPilihan());
lcd.setCursor(0, 1);
lcd.print("* Ya # kembali");
}
else if (modeMenu == modeMenuMakanan)
{
if (indexMenu >= jumlahMakanan)
{
indexMenu = 0;
}
tampilMenuMakanan(indexMenu);
}
else if (modeMenu == modeMenuMinuman)
{
if (indexMenu >= jumlahMinuman)
{
indexMenu = 0;
}
tampilMenuMinuman(indexMenu);
}
}
void resetPilihan()
{
for (byte i = 0; i < jumlahMakanan; i++)
{
menuMakanan[i].pilihan = false;
}
for (byte i = 0; i < jumlahMinuman; i++)
{
menuMinuman[i].pilihan = false;
}
}
uint32_t totalPilihan()
{
uint32_t total = 0;
for (byte i = 0; i < jumlahMakanan; i++)
{
if (menuMakanan[i].pilihan)
{
total += menuMakanan[i].harga;
}
}
for (byte i = 0; i < jumlahMinuman; i++)
{
if (menuMinuman[i].pilihan)
{
total += menuMinuman[i].harga;
}
}
return total;
}
void tampilMenuUtama(byte index)
{
lcd.setCursor(0, 1);
lcd.print(menuUtama[index]);
}
void tampilMenuMakanan(byte index)
{
lcd.setCursor(0, 0);
lcd.print(menuMakanan[index].strMenu);
lcd.setCursor(0, 1);
lcd.print("Rp. ");
formatStrHarga(menuMakanan[index].harga);
if (menuMakanan[index].pilihan)
{
lcd.setCursor(15, 1);
lcd.print("*");
}
}
void tampilMenuMinuman(byte index)
{
lcd.setCursor(0, 0);
lcd.print(menuMinuman[index].strMenu);
lcd.setCursor(0, 1);
lcd.print("Rp. ");
formatStrHarga(menuMinuman[index].harga);
if (menuMinuman[index].pilihan)
{
lcd.setCursor(15, 1);
lcd.print("*");
}
}
void formatStrHarga(uint32_t harga)
{
String strHarga = String(harga);
uint8_t panjangStr = strHarga.length();
uint8_t offset = 3 - (panjangStr % 3);
for (byte i = 0; i < strHarga.length(); i++)
{
lcd.print(strHarga[i]);
if (!((strHarga.length() + i - offset + 1) % 3))
{
if (i != strHarga.length() - 1)
{
lcd.print('.');
}
}
}
for (byte i = 0; i < 16 - 5 - strHarga.length(); i++)
{
lcd.print(' ');
}
}
Library: