#include <PID_v1.h>
// Pin yang digunakan
const int ldrPin = A1; // Pin sensor LDR
const int ledPin = 9; // Pin LED
const int potPin = A0; // Pin potensiometer
// Parameter PID
double setpoint = 512; // Nilai target sensor LDR
double Kp = 1; // Parameter proporsional
double Ki = 0.1; // Parameter integral
double Kd = 0.01; // Parameter derivatif
// Variabel global
double sensorValue = 0; // Variabel untuk menyimpan nilai pembacaan sensor LDR
double output = 0; // Variabel untuk menyimpan keluaran PID
// Inisialisasi objek PID
PID myPID(&sensorValue, &output, &setpoint, Kp, Ki, Kd, DIRECT);
// Variabel global
unsigned long previousMillis = 0; // Waktu terakhir pembacaan sensor
// Interval pembacaan sensor (dalam milidetik)
const long interval = 1000;
void setup() {
// Set pin LED sebagai OUTPUT
pinMode(ledPin, OUTPUT);
// Mulai serial communication
Serial.begin(9600);
// Tuning PID (opsional)
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255);
}
void loop() {
// Periksa apakah sudah waktunya membaca sensor
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// Simpan waktu terakhir pembacaan
previousMillis = currentMillis;
// Baca nilai sensor LDR
sensorValue = analogRead(ldrPin);
// Baca nilai potensiometer (untuk manual tuning)
int potValue = analogRead(potPin);
Kp = map(potValue, 0, 1023, 0, 5); // Potensiometer untuk mengubah nilai Kp secara real-time
myPID.SetTunings(Kp, Ki, Kd);
// Jalankan kontrol PID
myPID.Compute();
// Atur kecerahan LED berdasarkan keluaran PID
analogWrite(ledPin, output);
// Tampilkan nilai-nilai pada serial monitor (opsional)
Serial.print("Sensor: ");
Serial.print(sensorValue);
Serial.print(" | Potentiometer: ");
Serial.print(potValue);
Serial.print(" | Setpoint: ");
Serial.print(setpoint);
Serial.print(" | Output PID: ");
Serial.println(output);
}
// Tugas-tugas lain dapat dijalankan di sini
// delay(100); // Tidak perlu menggunakan delay dalam penggunaan millis()
}