// Final Project 2 - LED, Servo, Ultrasonic, and LCD in ESP32
// By fuadmqds
#include <ESP32Servo.h> // Library untuk mengontrol servo dengan ESP32
#include <LiquidCrystal_I2C.h> // Library untuk mengontrol LCD I2C
#include <Wire.h> // Library untuk mengontrol perangkat I2C
// Deklarasi pin untuk komponen
#define red_LED_pin 42 // Pin untuk LED merah
#define green_LED_pin 41 // Pin untuk LED hijau
#define servo_pin 39 // Pin untuk servo motor
#define trig_pin 38 // Pin trigger untuk sensor ultrasonik
#define echo_pin 37 // Pin echo untuk sensor ultrasonik
// Deklarasi objek servo dengan nama 'myservo'
Servo myservo;
// Deklarasi LCD (I2C) alamat 0x27 dan ukuran 16x2 dengan nama 'mylcd'
LiquidCrystal_I2C mylcd(0x27, 16, 2);
// Variabel untuk pembacaan sensor ultrasonik
long duration; // Durasi sinyal ultrasonik (dalam mikrodetik)
long distance; // Jarak yang dihitung dari durasi (dalam cm)
void setup() {
// Memulai komunikasi serial untuk debugging
Serial.begin(115200);
// Menampilkan pesan pada serial monitor saat program dimulai
Serial.println("Hello, ESP32-S2!");
// Menyiapkan pin LED sebagai output
pinMode(red_LED_pin, OUTPUT);
pinMode(green_LED_pin, OUTPUT);
// Menyiapkan pin untuk sensor ultrasonik
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
// Menyiapkan servo motor pada pin yang telah didefinisikan
myservo.attach(servo_pin);
// Menyiapkan pin pada LCD (SDA, SCL)
Wire.begin(8, 9);
// Inisialisasi LCD
mylcd.init();
// Menyalakan backlight pada LCD
mylcd.backlight();
}
void loop() {
// Mengirim sinyal ultrasonik
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
// Membaca waktu pantulan sinyal ultrasonik
duration = pulseIn(echo_pin, HIGH);
// Menghitung jarak berdasarkan durasi sinyal (kecepatan suara dalam udara ~340 m/s)
distance = duration / 50; // Faktor konversi untuk mendapatkan jarak dalam cm
// Jika jarak kurang dari atau sama dengan 200 cm
if (distance <= 200) {
digitalWrite(red_LED_pin, LOW); // Matikan LED merah
digitalWrite(green_LED_pin, HIGH); // Nyalakan LED hijau
myservo.write(90); // Gerakkan servo ke sudut 90 derajat (buka)
// Menampilkan teks "Lampu Hijau" dan "Servo Terbuka" pada LCD
mylcd.setCursor(16, 0); // Mengatur posisi kursor ke baris pertama
mylcd.print("Lampu Hijau");
mylcd.setCursor(16, 1); // Mengatur posisi kursor ke baris kedua
mylcd.print("Servo Terbuka");
// Membuat teks berjalan dari kanan ke kiri pada LCD
for (int i = 0; i < 40; i++) {
mylcd.scrollDisplayLeft();
delay(200);
}
mylcd.clear(); // Menghapus tampilan LCD setelah scrolling selesai
} else {
// Jika jarak lebih dari 200 cm
digitalWrite(red_LED_pin, HIGH); // Nyalakan LED merah
digitalWrite(green_LED_pin, LOW); // Matikan LED hijau
myservo.write(0); // Kembalikan servo ke posisi 0 derajat (tutup)
// Menampilkan teks "Lampu Merah" dan "Servo Tertutup" pada LCD
mylcd.setCursor(16, 0); // Mengatur posisi kursor ke baris pertama
mylcd.print("Lampu Merah");
mylcd.setCursor(16, 1); // Mengatur posisi kursor ke baris kedua
mylcd.print("Servo Tertutup");
// Membuat teks berjalan dari kanan ke kiri pada LCD
for (int i = 0; i < 40; i++) {
mylcd.scrollDisplayLeft();
delay(200);
}
mylcd.clear(); // Menghapus tampilan LCD setelah scrolling selesai
}
}