const int ldrPin = A1; // Pin sensor LDR
const int ledPin = 9; // Pin LED
const int potPin = A0; // Pin potensiometer
double Kp, Ki, Kd; // Parameter proporsional, integral, derivatif
// double Kp = 1; // Parameter proporsional
// double Ki = 0.1; // Parameter integral
// double Kd = 0.01; // Parameter derivatif
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 ;
const float GAMMA = 0.7; //nilai ketetapan gama untuk mencari tingkat kecerahan(lux)
const float RL10 = 50; //nilai ketetapan gama untuk mencari tingkat kecerahan(lux)
unsigned long previousMillis = 0; // Waktu terakhir pembacaan sensor
const long interval = 1000;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
input = analogRead(ldrPin); //membaca nilai analog pada pin A0 dari sensor ldr
float voltase = input / 1024. * 5; //rumus mengubah nilai sinyal analog dari ldr menjadi nilai voltase
float resistansi = 2000 * voltase / (1 - voltase / 5); //rumus mencari nilai resistansi dari nilai voltase sebelumnya
float inputt = pow(RL10 * 1e3 * pow(10, GAMMA) / resistansi, (1 / GAMMA)); //rumus mencari nilai tingkat kecerahan (lux)
setpoint = analogRead(potPin);
error = setpoint - inputt;
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);
analogWrite(ledPin, outmap);
Serial.print("Input PID: ");
Serial.print(inputt);
Serial.print(" | Setpoint PID: ");
Serial.print(setpoint);
Serial.print(" | Error PID: ");
Serial.print(error);
Serial.print(" | Output int PID: ");
Serial.println(outmap);
}
}