#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// Mengatur Alamat LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin sensor ultrasonik
const int trigPin = 9;
const int echoPin = 10;
// Servo
Servo servoMotor;
const int servoPin = 6;
// Buzzer
const int buzzerPin = 8;
// Variabel jarak
long duration;
int distance;
// Jarak maksimum untuk mendeteksi gelas (dalam cm)
const int detectionThreshold = 10;
// Status untuk mendeteksi gelas baru
bool isGlassPresent = false;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("KRAN DISPENSER");
lcd.setCursor(4, 1);
lcd.print("OTOMATIS");
delay(5000); // Waktu tunda
// Inisialisasi serial monitor
Serial.begin(9600);
// Inisialisasi pin sensor ultrasonik
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Inisialisasi servo
servoMotor.attach(servoPin);
servoMotor.write(45); // Servo dalam posisi awal (off)
// Tampilkan pesan awal pada LCD
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Letakkan Gelas");
lcd.setCursor(2, 1);
lcd.print("Dibawah Kran");
}
void loop() {
// Mengukur jarak dengan sensor ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Membaca hasil pantulan
duration = pulseIn(echoPin, HIGH);
distance = duration * 343 / 2;
// Debug jarak di serial monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Jika ada gelas di dekat sensor dan belum terdeteksi sebelumnya
if (distance > 0 && distance <= detectionThreshold && !isGlassPresent) {
isGlassPresent = true; // Tandai gelas telah terdeteksi
Serial.println("Gelas terdeteksi! Mengaktifkan servo.");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gelas Terdeteksi");
lcd.setCursor(0, 1);
lcd.print("Proses Pengisian");
servoMotor.write(0); // Servo bergerak ke posisi aktif
delay(2000); // Tunggu 2 detik
servoMotor.write(90); // Servo kembali ke posisi awal
Serial.println("Servo berhenti.");
// Gelas penuh, aktifkan alarm
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Gelas Terisi ");
lcd.setCursor(0, 1);
lcd.print("Pindahkan Gelas ");
while (isGlassPresent) {
tone(buzzerPin, 1000); // Frekuensi nada 1000 Hz
delay(500); // Durasi nada
noTone(buzzerPin); // Matikan nada
delay(500); // Jeda sebelum nada berikutnya
// Periksa ulang apakah gelas masih ada
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
// Jika gelas diangkat, keluar dari loop alarm
if (distance > detectionThreshold) {
isGlassPresent = false; // Siap mendeteksi gelas baru
noTone(buzzerPin); // Pastikan buzzer mati
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Letakkan Gelas");
lcd.setCursor(2, 1);
lcd.print("Dibawah Kran");
Serial.println("Gelas diangkat. Menunggu gelas baru.");
}
}
}
delay(5000); // Delay untuk pembacaan berikutnya
}