#include <LiquidCrystal.h>
#include <Servo.h>
// Inisialisasi LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Pin untuk tombol
const int button1 = 6;
const int button2 = 7;
const int button3 = 8;
const int button4 = 9;
// Potensiometer
const int potPin = A0; // Pin potensiometer
int money = 0; // Jumlah uang yang dimasukkan
// Harga setiap item
const int price1 = 15000; // Obat Flu & Batuk
const int price2 = 12000; // Obat Sakit Kepala
const int price3 = 10000; // Obat Sakit Perut
const int price4 = 17000; // Obat Nyeri Otot
// Nama setiap item
const char *itemNames[] = {
"None",
"Obat Flu & Batuk",
"Obat Sakit Kepala",
"Obat Sakit Perut",
"Obat Nyeri Otot"
};
// Servo motor
Servo dispenserServo; // Servo untuk pelepasan item
const int servoPin = 10;
const int openPosition = 90; // Posisi servo terbuka
const int closePosition = 0; // Posisi servo tertutup
// Buzzer
const int buzzerPin = 13; // Pin untuk buzzer
// Variabel untuk menyimpan item yang dipilih
int selectedItem = 0;
void setup() {
// Inisialisasi LCD
lcd.begin(16, 2);
// Inisialisasi tombol sebagai input
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
// Inisialisasi servo
dispenserServo.attach(servoPin);
dispenserServo.write(closePosition);
// Inisialisasi buzzer
pinMode(buzzerPin, OUTPUT);
// Tampilkan loading screen
displayLoadingScreen();
// Tampilkan pesan awal
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vending Machine");
lcd.setCursor(0, 1);
lcd.print("Masukkan Uang");
}
void loop() {
// Baca nilai potensiometer
int potValue = analogRead(potPin);
money = map(potValue, 0, 1023, 0, 50000); // Konversi ke nilai uang (0 - 50,000 IDR)
// Tampilkan jumlah uang di LCD
lcd.setCursor(0, 1);
lcd.print("Saldo: ");
lcd.print(money);
lcd.print(" IDR ");
// Cek tombol yang ditekan
if (digitalRead(button1) == LOW) {
selectedItem = 1;
processTransaction(price1);
} else if (digitalRead(button2) == LOW) {
selectedItem = 2;
processTransaction(price2);
} else if (digitalRead(button3) == LOW) {
selectedItem = 3;
processTransaction(price3);
} else if (digitalRead(button4) == LOW) {
selectedItem = 4;
processTransaction(price4);
}
}
// Fungsi untuk menampilkan loading screen
void displayLoadingScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Medicine ");
lcd.setCursor(0, 1);
lcd.print("Vending Machine");
// Animasi progress bar
delay(1000); // Tunggu 1 detik sebelum progress bar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loading...");
lcd.setCursor(0, 1);
// Gambar progress bar
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.print((char)255); // Karakter penuh untuk progress bar
delay(200); // Delay per langkah progress
}
delay(500); // Tunggu sebentar setelah selesai
}
// Fungsi untuk memproses transaksi
void processTransaction(int price) {
lcd.clear();
lcd.setCursor(0, 0);
// Tampilkan nama item di LCD
lcd.print(itemNames[selectedItem]); // Nama item pada baris pertama
if (money >= price) {
// Uang cukup, proses pelepasan item
int change = money - price; // Hitung kembalian
money -= price; // Kurangi saldo dengan harga item
lcd.setCursor(0, 1);
lcd.print("Memuat Item...");
// Buka servo
dispenserServo.write(openPosition);
// Mainkan irama pada buzzer
playBuzzerMelody();
// Simulasikan waktu pelepasan
delay(2000);
// Tutup servo setelah pelepasan
dispenserServo.write(closePosition);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Silahkan Diambil!");
lcd.setCursor(0, 1);
lcd.print("Terima Kasih!");
delay(3000);
// Tampilkan kembalian
if (change > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kembalian:");
lcd.setCursor(0, 1);
lcd.print(change);
lcd.print(" IDR");
delay(3000);
}
} else {
// Uang tidak cukup
lcd.setCursor(0, 1);
lcd.print("SALDO TAK CUKUP");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Harga: ");
lcd.print(price);
lcd.print(" IDR");
lcd.setCursor(0, 1);
lcd.print("Saldo Kurang");
delay(3000);
}
// Reset tampilan
resetDisplay();
}
// Fungsi untuk memainkan irama pada buzzer
void playBuzzerMelody() {
// Nada sederhana (frekuensi dalam Hz)
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523}; // Nada Do, Re, Mi, Fa, Sol, La, Si, Do
int noteDurations[] = {200, 200, 200, 200, 200, 200, 200, 200}; // Durasi masing-masing nada dalam ms
for (int i = 0; i < 8; i++) {
tone(buzzerPin, melody[i], noteDurations[i]); // Mainkan nada
delay(noteDurations[i] * 1.3); // Beri jeda antar nada
}
noTone(buzzerPin); // Matikan buzzer setelah melodi selesai
}
// Fungsi untuk mereset tampilan utama
void resetDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vending Machine");
lcd.setCursor(0, 1);
lcd.print("Saldo: ");
lcd.print(money);
lcd.print(" IDR ");
}