// Nama : Muhammad Hamzamir 
// Nim  : 2204005010001
// otomasi pompa menggunakan sensor ultrasonik dengan arduino dan
// penjelasan dari otomasi tersebut dan penjelasan program

// Jika jarak kurang dari 10 cm, servo/Pompa akan aktif dan berputar ke 180 derajat dan
// relay akan diaktifkan untuk menghidupkan pompa. Jika jarak lebih dari
// 10 cm, servo akan kembali ke 0 derajat dan relay dimatikan untuk
// mematikan pompa.

#include <Servo.h> // Mengimpor library Servo untuk mengendalikan servo motor

Servo myservo; // Membuat objek Servo bernama myservo
int trigPin = 2; // Pin Trig sensor ultrasonik
int echoPin = 3; // Pin Echo sensor ultrasonik
int relayPin = 4; // Pin relay yang mengontrol pompa
long duration; // Variabel untuk menyimpan durasi getaran dari Echo sensor
int distance; // Variabel untuk menyimpan jarak yang diukur oleh sensor ultrasonik
int servoAngle = 0; // Variabel untuk mengendalikan sudut servo

void setup() {
  myservo.attach(5); // Menghubungkan servo dengan pin 5 pada Arduino
  pinMode(trigPin, OUTPUT); // Mengatur pin Trig sebagai OUTPUT
  pinMode(echoPin, INPUT); // Mengatur pin Echo sebagai INPUT
  pinMode(relayPin, OUTPUT); // Mengatur pin relay sebagai OUTPUT
  digitalWrite(relayPin, LOW); // Mematikan relay (pompa dimatikan) pada awalnya
  Serial.begin(10000); // Memulai komunikasi serial dengan kecepatan 10000 bps
}

void loop() {
  digitalWrite(trigPin, LOW); // Mengirim sinyal ultrasonik yang rendah selama 2 mikrodetik
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); // Mengirim sinyal ultrasonik yang tinggi selama 200 mikrodetik
  delayMicroseconds(200);
  digitalWrite(trigPin, LOW); // Menghentikan pengiriman sinyal

  duration = pulseIn(echoPin, HIGH); // Mengukur durasi getaran dari Echo sensor (waktu pantulan balik)
  distance = duration * 0.034 / 2; // Menghitung jarak berdasarkan waktu pantulan

  Serial.print("Jarak: ");
  Serial.print(distance);
  Serial.println(" cm");

  // Mengatur servo berdasarkan jarak
  if (distance < 10) { // Jika jarak kurang dari 10 cm
    servoAngle = 180; // Putar servo ke 180 derajat
    digitalWrite(relayPin, HIGH); // Aktifkan relay (hidupkan pompa)
  }
   else {
    servoAngle = 0; // Putar servo ke 0 derajat
    digitalWrite(relayPin, LOW); // Matikan relay (matikan pompa)
  }

  myservo.write(servoAngle); // Menggerakkan servo sesuai sudut yang telah diatur
  delay(200); // Tunggu 200 milidetik sebelum pengukuran berikutnya
}