const int ldrPin = A1; // Pin sensor LDR
const int ledPin = 9; // Pin LED
const int potPin = A0; // Pin potensiometer
// Parameter PID
double Kp = 1; // Parameter proporsional
double Ki = 0.1; // Parameter integral
double Kd = 0.01; // Parameter derivatif
// Variabel global
double kecerahan = 0; // Variabel untuk menyimpan nilai pembacaan sensor LDR
double output = 0; // Variabel untuk menyimpan keluaran PID
double error = 0;
double errorlalu = 0;
double delerror = 0;
double interror = 0;
int setpoint = 0;
int input = 0 ;
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);
}
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
input = analogRead(ldrPin); //membaca nilai analog pada pin A0 dari sensor ldr
setpoint = analogRead(potPin);
error = setpoint - input;
interror += error;
delerror = error - errorlalu;
errorlalu = error;
output = Kp * error + Ki * interror + Kd * delerror;
int outint = int(output);
unsigned char outmap = map(outint, -1024, 1023, 0, 255);
// Atur kecerahan LED berdasarkan keluaran PID
analogWrite(ledPin, outmap);
Serial.print(" | Input PID: ");
Serial.print(input);
Serial.print(" | Setpoint PID: ");
Serial.print(setpoint);
Serial.print(" | Error PID: ");
Serial.print(error);
Serial.print(" | Output PID: ");
Serial.println(output);
Serial.print(" | Output int PID: ");
Serial.println(outmap);
}
// Tugas-tugas lain dapat dijalankan di sini
// delay(100); // Tidak perlu menggunakan delay dalam penggunaan millis()
}