#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
#include <Tone.h> // Library untuk menghasilkan suara dengan buzzer
// Inisialisasi Stepper Motor
const int stepsPerRevolution = 200; // Jumlah langkah per revolusi motor stepper
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); // Pin stepper motor: IN1, IN2, IN3, IN4
// Inisialisasi Sensor Ultrasonik
const int trigPin = 12;
const int echoPin = 13;
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C mungkin berbeda, Anda dapat mencari alamat yang benar dengan menggunakan program I2C scanner
// Inisialisasi Buzzer
const int buzzerPin = 7; // Pin untuk buzzer
Tone buzzer; // Objek buzzer
// Variabel boolean untuk mengontrol putaran motor, status portal, dan suara buzzer
bool motorRotated = false;
bool portalTerbuka = false;
void setup() {
// Inisialisasi pin trigPin dan echoPin untuk sensor ultrasonik
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi Buzzer
buzzer.begin(buzzerPin);
// Set kecepatan motor stepper (opsional)
myStepper.setSpeed(60); // Kecepatan dalam langkah per detik (tergantung pada motor dan driver motor)
}
void loop() {
long duration, distance;
// Mengirim sinyal trigger ke sensor ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Membaca durasi pantulan gelombang ultrasonik
duration = pulseIn(echoPin, HIGH);
// Menghitung jarak berdasarkan durasi
distance = (duration / 2) / 29.1; // Rumus: Kecepatan suara (343 m/s) / 2
// Cek apakah ada objek yang terdeteksi dalam jarak tertentu (misalnya 200 cm) dan motor belum berputar
if (distance < 200 && !motorRotated) {
// Putar motor stepper searah jarum jam 90 derajat jika ada objek
myStepper.step(90);
motorRotated = true; // Set variabel boolean agar motor tidak berputar lagi
portalTerbuka = true; // Portal terbuka
// Menghasilkan suara buzzer saat portal terbuka
buzzer.play(NOTE_C5, 1000); // Frekuensi dan durasi suara
}
// Cek jika jarak melebihi 200 cm dan motor sudah berputar sebelumnya
if (distance >= 200 && motorRotated) {
// Putar motor stepper berlawanan arah jarum jam 90 derajat
myStepper.step(-90);
motorRotated = false; // Set variabel boolean agar motor dapat berputar lagi jika ditemukan objek
portalTerbuka = false; // Portal tertutup
}
// Menampilkan status portal pada LCD
lcd.setCursor(0, 0);
lcd.print("Portal: ");
if (portalTerbuka) {
lcd.print("Terbuka ");
} else {
lcd.print("Tertutup ");
}
lcd.setCursor(0, 1);
lcd.print("Jarak: ");
lcd.print(distance);
lcd.print(" cm");
delay(1000); // Tunggu 1 detik sebelum mengukur lagi
}