#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library untuk mengontrol LCD dengan I2C
#include <Servo.h> // Library untuk mengontrol motor servo
LiquidCrystal_I2C lcd(0x27, 16, 2); // Objek untuk LCD dengan alamat 0x27 dan ukuran 16x2
Servo myservo; // Objek untuk servo
const int trigPin = 11; // Pin untuk trigger sensor ultrasonik
const int echoPin = 10; // Pin untuk echo sensor ultrasonik
const int servoPin = 9; // Pin untuk servo
// Fungsi untuk membaca jarak dari sensor ultrasonik
int readDistance() {
digitalWrite(trigPin, LOW); // Set trigger ke LOW
delayMicroseconds(2); // Delay sejenak untuk memastikan tidak ada pulsa sebelumnya
digitalWrite(trigPin, HIGH); // Kirim pulsa HIGH
delayMicroseconds(10); // Tahan pulsa selama 10 mikrodetik
digitalWrite(trigPin, LOW); // Matikan trigger
long duration = pulseIn(echoPin, HIGH); // Mengukur durasi pulsa echo
int distance = duration * 0.034 / 2; // Menghitung jarak berdasarkan waktu pulsa
return distance; // Kembalikan hasil perhitungan jarak
}
// Fungsi untuk menghitung rata-rata jarak dari beberapa pembacaan
int getAverageDistance(int jumlahBaca) {
long total = 0; // Variabel untuk menyimpan total jarak
for (int i = 0; i < jumlahBaca; i++) { // Loop sebanyak jumlahBaca kali
total += readDistance(); // Menambahkan hasil pembacaan jarak
delay(50); // Jeda 50 milidetik antara pembacaan
}
return total / jumlahBaca; // Mengembalikan rata-rata jarak
}
// Fungsi untuk menampilkan teks yang digulir pada LCD
void scrollText(String line1, String line2, int scrollDelay = 100) {
int len1 = line1.length(); // Panjang teks pertama
int len2 = line2.length(); // Panjang teks kedua
int maxLen = max(len1, len2); // Panjang maksimal antara kedua teks
// Menambahkan spasi ekstra untuk memastikan teks dapat digulir dengan lancar
line1 += " ";
line2 += " ";
// Menampilkan teks secara bergulir
for (int i = 0; i < maxLen + 1; i++) { // Loop untuk menggeser teks
lcd.setCursor(0, 0); // Set cursor ke baris pertama
lcd.print(line1.substring(i, i + 16)); // Menampilkan 16 karakter pertama dari line1
lcd.setCursor(0, 1); // Set cursor ke baris kedua
lcd.print(line2.substring(i, i + 16)); // Menampilkan 16 karakter pertama dari line2
delay(scrollDelay); // Menunggu sesuai dengan delay scroll untuk kecepatan teks
}
}
void setup() {
Serial.begin(9600); // Inisialisasi komunikasi serial untuk monitor serial
pinMode(trigPin, OUTPUT); // Set trigPin sebagai output
pinMode(echoPin, INPUT); // Set echoPin sebagai input
myservo.attach(servoPin); // Menghubungkan servo ke pin yang telah ditentukan
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Menyalakan lampu latar LCD
// Menampilkan informasi praktikum dan anggota kelompok sebelum sistem dimulai
lcd.clear();
scrollText("PRAKTIKUM ATS MATA KULIAH SENSOR DAN TRANDUSER", ""); // Teks pertama
delay(1000); // Delay selama 1 detik
lcd.clear();
scrollText("KELOMPOK 8", "AFFRIN, M. HABIB, M. KADAFI"); // Teks kedua
delay(1000); // Delay selama 1 detik
lcd.clear(); // Bersihkan layar sebelum melanjutkan
}
void loop() {
int distance = getAverageDistance(5); // Mengambil rata-rata jarak dari 5 pembacaan
Serial.print("Jarak: "); // Menampilkan jarak pada monitor serial
Serial.println(distance);
lcd.clear(); // Bersihkan layar LCD untuk pembaruan
// Kondisi jika jarak lebih dari 100 cm
if (distance > 100) {
myservo.write(75); // Servo berada di posisi 90°
scrollText("SELAMAT DATANG", ""); // Menampilkan teks selamat datang
lcd.setCursor(0, 1); // Set cursor ke baris kedua
lcd.print("Jarak: ");
lcd.print(distance); // Menampilkan jarak
lcd.print(" cm");
}
// Kondisi jika jarak antara 50 dan 100 cm
else if (distance > 50 && distance <= 100) {
myservo.write(75); // Servo tetap di posisi 90°
scrollText("KENDARAAN TERDETEKSI SILAHKAN MELAMBAT", ""); // Menampilkan peringatan melambat
lcd.setCursor(0, 1); // Set cursor ke baris kedua
lcd.print("Jarak: ");
lcd.print(distance); // Menampilkan jarak
lcd.print(" cm");
}
// Kondisi jika jarak kurang dari atau sama dengan 50 cm
else if (distance > 0 && distance <= 50) {
myservo.write(0); // Membuka gerbang dengan memutar servo ke 0°
scrollText("GERBANG AKAN TERBUKA SILAHKAN LEWAT & BERHATI-HATI", ""); // Menampilkan peringatan gerbang terbuka
lcd.setCursor(0, 1); // Set cursor ke baris kedua
lcd.print("Jarak: ");
lcd.print(distance); // Menampilkan jarak
lcd.print(" cm");
}
delay(1000); // Delay 1 detik sebelum pembacaan berikutnya
}