// Final Project - 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
// Deklarasi pin untuk komponen
#define red_LED_pin 42 // Pin untuk LED merah
#define yellow_LED_pin 41 // Pin untuk LED kuning
#define green_LED_pin 40 // 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
long distance; // Jarak yang dihitung dari durasi
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(yellow_LED_pin, OUTPUT);
pinMode(green_LED_pin, OUTPUT);
// Menyiapkan pin untuk sensor ultrasonik
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
// Menyiapkan servo motor
myservo.attach(servo_pin);
// Inisialisasi LCD
mylcd.init();
// Menyalakan backlight pada LCD
mylcd.backlight();
}
void loop() {
// Menyalakan LED hijau selama 500 ms
digitalWrite(red_LED_pin, LOW);
digitalWrite(yellow_LED_pin, LOW);
digitalWrite(green_LED_pin, HIGH);
delay(500);
// Menyalakan LED kuning selama 200 ms
digitalWrite(red_LED_pin, LOW);
digitalWrite(yellow_LED_pin, HIGH);
digitalWrite(green_LED_pin, LOW);
delay(200);
// Menyalakan LED merah selama 400 ms
digitalWrite(red_LED_pin, HIGH);
digitalWrite(yellow_LED_pin, LOW);
digitalWrite(green_LED_pin, LOW);
delay(400);
// Mematikan semua LED
digitalWrite(red_LED_pin, LOW);
digitalWrite(yellow_LED_pin, LOW);
digitalWrite(green_LED_pin, LOW);
// Mengirimkan sinyal trigger pada sensor ultrasonik
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
// Membaca durasi pantulan sinyal dari sensor ultrasonik
duration = pulseIn(echo_pin, HIGH);
// Menghitung jarak berdasarkan durasi (kecepatan suara dalam udara ~340 m/s)
distance = duration * 0.034 / 2; // Faktor konversi untuk mendapatkan jarak dalam cm
// Menggerakkan servo berdasarkan jarak
if (distance <= 60) {
myservo.write(90); // Jika jarak <= 60 cm, servo bergerak ke posisi 90 derajat
} else {
myservo.write(0); // Jika jarak > 60 cm, servo kembali ke posisi 0 derajat
}
// Menampilkan pesan di LCD
mylcd.setCursor(16, 0); // Mengatur posisi kursor LCD ke kolom ke-17, baris ke-1
mylcd.print("Selamat"); // Menampilkan teks "Selamat"
mylcd.setCursor(16, 1); // Mengatur posisi kursor LCD ke kolom ke-17, baris ke-2
mylcd.print("UPRAK"); // Menampilkan teks "UPRAK"
// Membuat efek teks berjalan dari kanan ke kiri
for (int i = 0; i < 32; i++) {
mylcd.scrollDisplayLeft();
delay(200);
}
// Mereset tampilan pada LCD
mylcd.clear();
}