#include <LiquidCrystal.h>
#include <Servo.h>
// LCD, pin
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttons[] = {6, 7, 8, 9, A1};
const int potPin = A0;
int money = 0;
// Harga, nama item
const int prices[] = {0, 15000, 12000, 10000, 17000, 20000};
const char *itemNames[] = {"None", "Obat Flu & Batuk", "Obat Sakit Pala", "Obat Sakit Perut", "Obat Nyeri Otot", "Obat Kesemutan"};
// Servo motor dan buzzer
Servo dispenserServo;
const int servoPin = 10, buzzerPin = 13;
const int openPos = 90, closePos = 0;
int selectedItem = 0;
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
// Serial Monitr
Serial.println("DAFTAR HARGA ITEM");
Serial.println("-----------------------------------");
for (int i = 1; i <= 5; i++) {
Serial.print(itemNames[i]);
Serial.print(" (");
switch (i) {
case 1: Serial.print("Merah"); break;
case 2: Serial.print("Ijo"); break;
case 3: Serial.print("Kuning"); break;
case 4: Serial.print("Biru"); break;
case 5: Serial.print("Abu"); break;
}
Serial.print("), ");
Serial.print(prices[i] / 1000);
Serial.println(" Ribu");
}
Serial.println("-----------------------------------");
for (int i = 0; i < 5; i++) pinMode(buttons[i], INPUT_PULLUP);
dispenserServo.attach(servoPin);
dispenserServo.write(closePos);
pinMode(buzzerPin, OUTPUT);
displayLoadingScreen();
lcd.clear();
lcd.print("Vending Machine");
lcd.setCursor(0, 1);
lcd.print("Masukkan Uang");
}
void loop() {
money = map(analogRead(potPin), 0, 1023, 0, 50000);
lcd.setCursor(0, 1);
lcd.print("Saldo: " + String(money) + " IDR ");
for (int i = 0; i < 5; i++) {
if (digitalRead(buttons[i]) == LOW) {
selectedItem = i + 1;
processTransaction(prices[selectedItem]);
break;
}
}
}
// Fungsi untuk menampilkan loading screen
void displayLoadingScreen() {
lcd.clear();
lcd.print(" Medicine ");
lcd.setCursor(0, 1);
lcd.print("Vending Machine");
delay(1000);
lcd.clear();
lcd.print("Loading...");
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.print((char)255);
delay(200);
}
delay(500);
}
// Fungsi untuk proses transaksi
void processTransaction(int price) {
lcd.clear();
lcd.print(itemNames[selectedItem]);
if (money >= price) {
int change = money - price;
money -= price;
lcd.setCursor(0, 1);
lcd.print("Memuat Item...");
dispenserServo.write(openPos);
playBuzzerMelody();
delay(2000);
dispenserServo.write(closePos);
delay(3000);
if (change > 0) {
lcd.clear();
lcd.print("Kembalian: " + String(change) + " IDR");
delay(3000);
}
} else {
lcd.setCursor(0, 1);
lcd.print("SALDO TAK CUKUP");
delay(2000);
lcd.clear();
lcd.print("Harga: " + String(price) + " IDR");
lcd.setCursor(0, 1);
lcd.print("Saldo Kurang");
delay(3000);
}
resetDisplay();
}
// Fungsi buzzr
void playBuzzerMelody() {
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523},
noteDurations[] = {200, 200, 200, 200, 200, 200, 200, 200};
for (int i = 0; i < 8; i++) {
tone(buzzerPin, melody[i], noteDurations[i]);
delay(noteDurations[i] * 1.3);
}
noTone(buzzerPin);
}
void resetDisplay() {
lcd.clear();
lcd.print("Vending Machine");
lcd.setCursor(0, 1);
lcd.print("Saldo: " + String(money) + " IDR ");
}