#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h> // Pustaka untuk kontrol Servo Motor
// Konfigurasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD 20x4
// Pin konfigurasi
const int coinButton = 8; // Tombol koin
const int itemButton1 = 9; // Tombol item 1
const int itemButton2 = 10; // Tombol item 2
const int itemButton3 = 11; // Tombol item 3
const int itemButton4 = A1; // Tombol item 4
const int itemButton5 = A2; // Tombol item 5
const int ledItem1 = 12; // LED untuk item 1
const int ledItem2 = 13; // LED untuk item 2
const int ledItem3 = A0; // LED untuk item 3
const int ledItem4 = A3; // LED untuk item 4
const int ledItem5 = 2; // LED untuk item 5
const int buzzer = 7; // Buzzer
const int servoPin = 6; // Pin untuk servo motor
// Variabel untuk jumlah koin
int coins = 0;
Servo itemServo; // Objek servo motor
// Variabel untuk menyimpan status tampilan sebelumnya
String lastLines[4] = {"", "", "", ""};
void setup() {
// Konfigurasi pin
pinMode(coinButton, INPUT_PULLUP); // Tombol koin menggunakan pull-up internal
pinMode(itemButton1, INPUT_PULLUP); // Tombol item 1
pinMode(itemButton2, INPUT_PULLUP); // Tombol item 2
pinMode(itemButton3, INPUT_PULLUP); // Tombol item 3
pinMode(itemButton4, INPUT_PULLUP); // Tombol item 4
pinMode(itemButton5, INPUT_PULLUP); // Tombol item 5
pinMode(ledItem1, OUTPUT); // LED item 1
pinMode(ledItem2, OUTPUT); // LED item 2
pinMode(ledItem3, OUTPUT); // LED item 3
pinMode(ledItem4, OUTPUT); // LED item 4
pinMode(ledItem5, OUTPUT); // LED item 5
pinMode(buzzer, OUTPUT); // Buzzer
// Inisialisasi LCD
lcd.init();
lcd.backlight();
updateLCD("Masukkan Koin...", "", "", "");
// Inisialisasi Servo
itemServo.attach(servoPin); // Menghubungkan pin servo ke objek servo
}
void loop() {
// Deteksi tombol koin
if (digitalRead(coinButton) == LOW) {
coins++;
tone(buzzer, 1000, 200); // Bunyi buzzer (1000 Hz selama 200 ms)
updateLCD("Coins: " + String(coins), "1-cola 2-aqua", "3-teh 4-fanta", "5-sprite");
delay(500); // Debounce tombol
}
// Periksa tombol untuk memilih item
if (coins > 0) {
if (digitalRead(itemButton1) == LOW) {
processItem(ledItem1, "cola-cola");
}
if (digitalRead(itemButton2) == LOW) {
processItem(ledItem2, "aqua");
}
if (digitalRead(itemButton3) == LOW) {
processItem(ledItem3, "teh botol");
}
if (digitalRead(itemButton4) == LOW) {
processItem(ledItem4, "fanta");
}
if (digitalRead(itemButton5) == LOW) {
processItem(ledItem5, "sprite");
}
} else {
updateLCD("Masukkan Koin!", "", "", "");
}
}
// Fungsi untuk memperbarui tampilan LCD jika ada perubahan
void updateLCD(String line1, String line2, String line3, String line4) {
String lines[4] = {line1, line2, line3, line4};
for (int i = 0; i < 4; i++) {
if (lines[i] != lastLines[i]) { // Periksa apakah baris berubah
lcd.setCursor(0, i);
lcd.print(" "); // Hapus baris
lcd.setCursor(0, i);
lcd.print(lines[i]);
lastLines[i] = lines[i]; // Simpan baris terbaru
}
}
}
// Fungsi untuk memproses item
void processItem(int ledPin, const char* itemName) {
if (coins > 0) {
coins--; // Kurangi jumlah koin
updateLCD(String(itemName), "Dispensing...", "", "");
digitalWrite(ledPin, HIGH); // Nyalakan LED item
tone(buzzer, 1500, 300); // Bunyi buzzer (1500 Hz selama 300 ms)
delay(1000); // Simulasi proses pengeluaran item
// Aktifkan servo untuk menjatuhkan item
itemServo.write(90); // Posisi servo untuk membuka atau menjatuhkan item
delay(1000); // Berikan waktu untuk servo bergerak
itemServo.write(0); // Kembalikan posisi servo ke posisi semula
digitalWrite(ledPin, LOW); // Matikan LED item
updateLCD("Coins: " + String(coins), "1-cola 2-aqua", "3-teh 4-fanta", "5-sprite");
delay(1000); // Berikan waktu untuk melihat status
} else {
updateLCD("Insert coin!", "", "", "");
delay(1000); // Berikan waktu untuk membaca pesan
}
delay(500); // Debounce tombol
}