#include <Servo.h>
#define TRIG_PIN 2 // Pin untuk Trigger pada sensor ultrasonik
#define ECHO_PIN 3 // Pin untuk Echo pada sensor ultrasonik
#define SERVO_PIN 9 // Pin PWM untuk Servo Motor
Servo myServo;
// Parameter PID
float Kp = 2.0; // Proportional gain
float Ki = 0.5; // Integral gain
float Kd = 1.0; // Derivative gain
float setPoint = 20.0; // Jarak yang diinginkan (dalam cm)
float previousError = 0;
float integral = 0;
long duration;
float distance;
void setup() {
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Attach servo motor ke pin yang sudah ditentukan
myServo.attach(SERVO_PIN);
// Inisialisasi komunikasi serial untuk debugging
Serial.begin(115200);
}
void loop() {
// Mengukur jarak menggunakan sensor ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration * 0.034) / 2; // Menghitung jarak dalam cm
// Menghitung output PID
float error = setPoint - distance;
integral += error;
float derivative = error - previousError;
float output = Kp * error + Ki * integral + Kd * derivative;
// Mengatur posisi servo motor berdasarkan output PID
float servoPosition = constrain(output, 0, 180); // Batasi posisi servo antara 0 dan 180 derajat
myServo.write(servoPosition);
// Tampilkan jarak dan posisi servo untuk debugging
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm, Servo: ");
Serial.println(servoPosition);
// Simpan error sebelumnya untuk perhitungan derivative
previousError = error;
// Jeda 100 ms sebelum pengukuran berikutnya
delay(100);
}