#include <Keypad.h>
#include <Wire.h> // Library untuk I2C
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Inisialisasi Keypad
const byte ROWS = 4; // Jumlah baris pada keypad
const byte COLS = 4; // Jumlah kolom pada keypad
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Pin baris keypad
byte colPins[COLS] = {5, 4, 3, 2}; // Pin kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C dan ukuran LCD (16x2)
// Inisialisasi Servo
Servo myServo;
const int servoPin = 13;
// Ultrasonic Sensor
const int trigPin = A2; // Diubah dari A3 ke A2
const int echoPin = A3; // Diubah dari A4 ke A3
// Buzzer
const int buzzerPin = A0; // Diubah dari A5 ke A0
// Password
String password = "2304039"; // Password yang benar
String input_password = ""; // Variabel untuk menyimpan input password
const int passwordLength = 7; // Panjang password
bool accessGranted = false; // Status akses
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
myServo.attach(servoPin);
myServo.write(0); // Servo pada posisi awal (0 derajat)
lcd.init(); // Inisialisasi LCD I2C
lcd.backlight(); // Menyalakan lampu latar LCD
lcd.print("TUGAS UTS UAS"); // Tampilan awal
lcd.setCursor(0, 1);
lcd.print("TONG SAMPAH");
delay(3000); // Tampilkan pesan selama 3 detik
lcd.clear();
lcd.print("Enter Password:");
}
void loop() {
if (!accessGranted) {
char key = keypad.getKey(); // Membaca input dari keypad
if (key) {
if (key == '#') {
// Konfirmasi password
if (input_password == password) {
lcd.clear();
lcd.print("Access Granted!");
delay(2000);
accessGranted = true; // Set akses sebagai diterima
lcd.clear();
lcd.print("Mendetek Sampah...");
} else {
lcd.clear();
lcd.print("Access Denied!");
delay(2000);
// Reset input setelah pengecekan
input_password = "";
lcd.clear();
lcd.print("Enter Password:");
}
} else if (key == '*') {
// Reset input password
input_password = "";
lcd.clear();
lcd.print("Enter Password:");
} else {
// Tambahkan karakter ke input password
if (input_password.length() < passwordLength) {
input_password += key;
lcd.setCursor(0, 1); // Pindah ke baris kedua
lcd.print(input_password); // Tampilkan input password
}
}
}
} else {
pengukuranJarak(); // Proses pengukuran jarak dengan Ultrasonic
delay(500); // Penundaan antar pengukuran
}
}
// Fungsi untuk membuka servo
void bukaServo() {
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer sebelum servo terbuka
delay(2000); // Tunggu 2 detik
digitalWrite(buzzerPin, LOW); // Matikan buzzer
myServo.write(90); // Buka pintu servo ke posisi 90 derajat
delay(3000); // Tunggu 3 detik
myServo.write(0); // Kembali ke posisi awal
}
// Fungsi untuk pengukuran jarak dengan Ultrasonic
void pengukuranJarak() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = (duration * 0.034) / 2; // Konversi waktu ke jarak (cm)
if (distance >= 1 && distance <= 5) {
lcd.clear();
lcd.print("Distance:");
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.print(" cm");
delay(1000); // Tampilkan hasil selama 1 detik
lcd.clear();
lcd.print("Opening Servo...");
bukaServo(); // Buka servo jika jarak 1-5 cm
}
}