// #include <Servo.h>
// #include <LiquidCrystal_I2C.h>
// #define ECHO_PIN 11
// #define TRIG_PIN 12
// // LiquidCrystal_I2C.h digunakan untuk mengontrol LCD menggunakan protokol I2C.
// // ECServo.h digunakan untuk mengontrol servo motor.
// // ECHO_PIN dan TRIG_PIN didefinisikan sebagai pin untuk sensor ultrasonik.
// Servo myservo;
// LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
// // Servo myservo digunakan untuk mengontrol servo motor.
// // LiquidCrystal_I2C lcd(0x27, 16, 2) inisialisasi objek LCD dengan alamat
// // I2C 0x27, ukuran 16x2.
// int rotasi = 90;
// int interval = 0;
// int ledH = 7;
// int pinBuzzer = 5;
// int redLED = 8; // Pin untuk LED merah
// int greenLED = 9; // Pin untuk LED hijau
// // rotasi menyimpan posisi saat ini dari servo motor.
// // interval digunakan untuk mengatur interval dalam loop utama.
// // pinBuzzer, redLED, dan greenLED adalah pin untuk buzzer, LED merah, dan LED hijau.
// float readDistanceCM() {
// digitalWrite(ledH, LOW);
// digitalWrite(TRIG_PIN, LOW);
// delayMicroseconds(2);
// digitalWrite(TRIG_PIN, HIGH);
// delayMicroseconds(10);
// digitalWrite(TRIG_PIN, LOW);
// int duration = pulseIn(ECHO_PIN, HIGH);
// return duration * 0.034/2;
// }
// // Fungsi ini menggunakan sensor ultrasonik untuk mengukur jarak dan mengembalikan
// // nilai dalam satuan sentimeter.
// void soundBuzzer() {
// if (interval < 500) {
// tone(pinBuzzer, 300);
// } else if (interval > 500) {
// tone(pinBuzzer, 250, 800);
// }
// }
// // Fungsi ini menghasilkan suara pada buzzer berdasarkan nilai interval.
// void setup() {
// pinMode(TRIG_PIN, OUTPUT);
// pinMode(ECHO_PIN, INPUT);
// pinMode(ledH, OUTPUT);
// pinMode(pinBuzzer, OUTPUT);
// pinMode(redLED, OUTPUT);
// pinMode(greenLED, OUTPUT);
// lcd.backlight();
// lcd.begin(16, 2);
// lcd.print("Palang Otomatis");
// Serial.begin(115200);
// myservo.attach(10);
// myservo.write(90);
// }
// // Inisialisasi pin, LCD, Serial, dan posisi awal servo pada saat program dimulai.
// void loop() {
// tutupPalang();
// digitalWrite(ledH, LOW);
// interval += 100;
// if (interval > 1000) interval = 0;
// }
// // Loop utama yang memanggil fungsi-fungsi untuk mengontrol palang, menonaktifkan,
// // membuka.
// void tutupPalang() {
// float jarak = readDistanceCM();
// if (jarak > 0 && jarak < 15) {
// soundBuzzer();
// tutup();
// digitalWrite(redLED, HIGH);
// digitalWrite(greenLED, LOW);
// lcd.setCursor(0, 1);
// lcd.print("Palang tertutup ");
// } else {
// buka();
// digitalWrite(redLED, LOW);
// digitalWrite(greenLED, HIGH);
// lcd.setCursor(0, 1);
// lcd.print("Palang terbuka ");
// noTone(pinBuzzer);
// }
// }
// // Menonaktifkan palang selama 5 detik dan membukanya kembali jika sudah tertutup.
// void tutup() {
// if (rotasi <= 90) {
// myservo.write(rotasi);
// delay(50);
// rotasi--;
// digitalWrite(ledH, LOW);
// }
// if (rotasi <= 0) rotasi = 0;
// }
// //Menggerakkan servo motor untuk menutup palang.
// void buka() {
// if (rotasi <= 90) {
// myservo.write(rotasi);
// delay(100);
// rotasi += 4;
// }
// if (rotasi >= 90) rotasi = 90;
// }
// // Menggerakkan servo motor untuk membuka palang.
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// Servo.h: Library untuk mengendalikan servo motor.
// LiquidCrystal_I2C.h: Library untuk mengendalikan LCD dengan koneksi I2C.
#define ECHO_PIN 11
#define TRIG_PIN 12
// ECHO_PIN dan TRIG_PIN adalah pin yang digunakan untuk sensor ultrasonik.
Servo myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
// myservo: Objek untuk mengendalikan servo motor.
// lcd: Objek untuk mengendalikan LCD.
int rotasi = 90;
int interval = 0;
int ledH = 7;
int pinBuzzer = 7;
int redLED = 8;
int greenLED = 9;
// rotasi : Posisi awal servo motor.
// interval: Variabel yang digunakan untuk mengatur interval suara buzzer.
// pinBuzzer, redLED, greenLED: Pin untuk buzzer dan LED merah dan hijau.
float readDistanceCM() {
digitalWrite(ledH, LOW);
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034/2;
}
// Fungsi untuk mengukur jarak menggunakan sensor ultrasonik dan
// mengembalikan nilai dalam satuan sentimeter.
void soundBuzzer() {
if (interval < 300) {
tone(pinBuzzer, 300);
} else if (interval > 500) {
tone(pinBuzzer, 230, 800);
}
}
// Fungsi ini menghasilkan suara buzzer sesuai
// dengan kondisi interval tertentu.
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(ledH, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
lcd.backlight();
lcd.begin(16, 2);
lcd.print("Palang Otomatis");
Serial.begin(115200);
myservo.attach(10);
myservo.write(90);
}
// Fungsi inisialisasi yang dijalankan hanya sekali saat Arduino pertama kali dinyalakan.
// Mengatur mode pin, mengaktifkan backlight LCD, dan menampilkan pesan awal di LCD.
// Deklarasi fungsi
void nonAktifkanDanBuka();
void loop() {
tutupPalang();
nonAktifkanDanBuka(); // Tambahkan panggilan ke fungsi ini
digitalWrite(ledH, LOW);
interval += 100;
if (interval > 1000) interval = 0;
}
// Fungsi utama yang dijalankan secara berulang.
// Memanggil fungsi tutupPalang dan nonAktifkanDanBuka.
void nonAktifkanDanBuka() {
//Fungsi untuk menonaktifkan palang selama 5 detik dan membukanya kembali
// Cek apakah palang sedang terbuka
if (rotasi == 0) {
delay(5000); // Tunggu selama 5 detik
buka(); // Buka palang setelah 5 detik
}
}
// Fungsi untuk membaca jarak menggunakan sensor ultrasonik.
// Jika jarak kurang dari 25 cm, palang ditutup, dan suara buzzer dan LED merah diaktifkan.
// Jika jarak lebih dari 25 cm, palang dibuka, dan LED hijau diaktifkan.
void tutupPalang() {
float jarak = readDistanceCM();
if (jarak > 0 && jarak < 25) {
soundBuzzer();
tutup();
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
lcd.setCursor(0, 1);
lcd.print("Palang tertutup ");
} else {
buka();
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
lcd.setCursor(0, 1);
lcd.print("Palang terbuka ");
noTone(pinBuzzer);
}
}
// Fungsi untuk menutup palang dengan menggerakkan servo motor secara perlahan.
void tutup() {
if (rotasi <= 90) {
myservo.write(rotasi);
delay(30);
rotasi--;
digitalWrite(ledH, LOW);
}
if (rotasi <= 0) rotasi = 0;
}
void buka() {
if (rotasi <= 90) {
myservo.write(rotasi);
delay(50);
rotasi += 4;
}
if (rotasi >= 90) rotasi = 90;
}
// Fungsi untuk membuka palang dengan menggerakkan servo motor secara perlahan.
// Fungsi-fungsi utama yang mengendalikan logika operasi palang otomatis dan
// interaksi dengan sensor serta perangkat keluaran lainnya.