//Nama : Ella Dzakirah Afanin
//NPM : 203510572
//Simulasi Palang Pintu Kereta Api
//mendefiniskan sebagai nilai tetap untuk nomor pin yang digunakan dalam rangkaian
#define ECHO_PIN 3
#define TRIG_PIN 2
#define pinBuzzer 5
//Mengimpor library 'Servo' yang menyediakan fungsi-fungsi untuk mengendalikan motor servo
#include <Servo.h>
//Deklarasi objek dan variabel
Servo myservo; //membuat objek dari kelas 'Servo'
int rotasi = 90; //Menyimpan posisi servo
int interval = 0; //Penggunaan waktu
//Mengukur jarak dari sensor ultrasonik dan mengembalikan nilai dalam cm
float readDistanceCM(){
//Menetapkan sinyal pada pin TRIG_PIN menjadi LOW (rendah), menandakan awal dari pengukuran.
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);//Memberikan jeda selama 2 mikrodetik setelah menetapkan sinyal LOW.
//Menaikkan sinyal pada pin TRIG_PIN menjadi HIGH (tinggi) untuk memicu pengiriman gelombang ultrasonik.
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);//Menunggu selama 10 mikrodetik sebelum mematikan sinyal pengirim ultrasonik.
//Mematikan sinyal pada pin TRIG_PIN untuk menghentikan pengiriman gelombang ultrasonik.
digitalWrite(TRIG_PIN, LOW);
//Mengukur durasi atau waktu yang dibutuhkan untuk pulsa yang dikirimkan kembali (echo) ke pin ECHO_PIN
//Fungsi pulseIn() akan mengembalikan waktu dalam mikrodetik.
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034/2; //Mengonversi waktu yang diukur menjadi jarak dalam centimeter.
}
//Mengontrol bunyi dari buzzer tergantung pada nilai dari 'interval'
void soundBuzzer(){
if(interval < 500){
tone(pinBuzzer, 250);
}else
if(interval > 500){
tone(pinBuzzer, 100,800);
};
}
//Dieksekusi sekali pada saat arduino pertama kali dijalankan
void setup() {
pinMode(TRIG_PIN, OUTPUT); //Mengatur pin sebagai output
pinMode(ECHO_PIN, INPUT); //Mengatur pin sebagai input
Serial.begin(115200); //Memulai komunikasi serial untuk debugging jika diperlukan
pinMode(pinBuzzer, OUTPUT);
myservo.attach(9); //Menghubungkan motor servo ke pin 9
myservo.write(90); //Mengatur posisi awal servo pada sudut 90 derajat
}
//Menggerakkan motor servo untuk menutup
void tutup(){
if(rotasi <= 90){
myservo.write(rotasi); //mengatur posisi motor servo sesuai dengan nilai rotasi
delay(100); //Jeda selama 100 milidetik
rotasi--; //Mengurangi nilai rotasi
//menurunkan posisi servo secara perlahan agar palang dapat ditutup secara bertahap
}
if(rotasi <= 0 ) rotasi = 0; //mencegah rotasi turun ke nilai negatif yang tidak diinginkan
}
//Menggerakkan motor servo untuk membuka
void buka(){
if(rotasi <= 90){
myservo.write(rotasi);
delay(100);
rotasi+=4; //Menambah nilai rotasi sebesar 4 setiap kali fungsi di panggil
}
if(rotasi >= 90 ) rotasi = 90;
}
//Fungsi untuk mengukur jarak, memutuskan apakah harus menutup atau membuka palang
//dan memainkan bunyi pada buzzer
void tutupPalang(){
float jarak = readDistanceCM();
if(jarak > 0 && jarak < 100 ){
soundBuzzer();
tutup();
}else{
buka();
noTone(pinBuzzer);
}
}
void loop() {
tutupPalang();//Memeriksa jarak dan mengontrol palang
interval +=100;
if(interval>1000) interval = 0;
}