/****************************************************
* SISTEM PENYIRAMAN OTOMATIS BERBASIS PID
* Input : DHT22 (Kelembaban)
* Output : PWM LED (Simulasi Pompa)
* Board : ESP32
****************************************************/
#include <DHT.h>
#include <PID_v1_bc.h>
// =====================
// PIN KONFIGURASI
// =====================
#define DHTPIN 22 // Pin data DHT22
#define DHTTYPE DHT22
#define LED_PIN 18 // PWM LED (simulasi pompa)
// =====================
// OBJEK SENSOR
// =====================
DHT dht(DHTPIN, DHTTYPE);
// =====================
// VARIABEL PID
// =====================
double setpoint = 60.0; // Target kelembaban (%)
double input; // Kelembaban aktual
double output; // PWM output (0–255)
// Parameter PID (stabil, hasil tuning simulasi)
double Kp = 2.2;
double Ki = 0.45;
double Kd = 0.1;
// Objek PID
PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
// =====================
// SETUP
// =====================
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED_PIN, OUTPUT);
// Inisialisasi PID
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255); // PWM range
myPID.SetSampleTime(100); // 100 ms
Serial.println("=== SISTEM PENYIRAMAN OTOMATIS PID ===");
}
// =====================
// LOOP
// =====================
void loop() {
// Baca kelembaban dari DHT22
float humidity = dht.readHumidity();
// Validasi pembacaan sensor
if (isnan(humidity)) {
Serial.println("Gagal membaca DHT22!");
delay(1000);
return;
}
// Masukkan ke variabel PID
input = humidity;
// Hitung PID
myPID.Compute();
// Keluarkan PWM ke LED (simulasi pompa)
analogWrite(LED_PIN, (int)output);
// =====================
// SERIAL MONITOR
// =====================
Serial.print("Kelembaban: ");
Serial.print(input);
Serial.print(" % | PWM Pompa: ");
Serial.print(output);
Serial.print(" | Setpoint: ");
Serial.println(setpoint);
delay(500);
}