#include <PID_v2.h>
#include <Wire.h>
#include <PID_v1_bc.h>
#include <PID.h>
// Konstanta PID
double Kp = 2.0; // Konstanta Proporsional
double Ki = 0.1; // Konstanta Integral
double Kd = 1.0; // Konstanta Derivatif
// Nilai Set Point
double setPoint = 25.0; // Set Point Suhu dalam derajat Celsius
// Pin untuk Sensor Termistor
const int sensorPin = A0;
// Pin untuk Pemanas (Relay atau MOSFET)
const int heaterPin = 8;
// Pin untuk LED RGB
const int redPin = 9;
const int greenPin = 10;
// Interval Sample Time (dalam milidetik)
unsigned long sampleTime = 1000; // 1 detik
// Variabel PID
double input, output;
PID pid(&input, &output, &setPoint, Kp, Ki, Kd, DIRECT);
void setup() {
// Inisialisasi pin
pinMode(sensorPin, INPUT);
pinMode(heaterPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
// Inisialisasi PID
pid.SetMode(AUTOMATIC);
pid.SetSampleTime(sampleTime);
pid.SetOutputLimits(0, 255); // Output kendali terbatas antara 0 dan 255
}
void loop() {
// Baca nilai suhu dari sensor termistor
int rawValue = analogRead(sensorPin);
double temperature = map(rawValue, 0, 1023, 0, 100); // Konversi nilai analog ke suhu dalam derajat Celsius
input = temperature;
// Hitung output kendali PID
pid.Compute();
// Kendalikan pemanas berdasarkan output kendali PID
if (output > 0) {
digitalWrite(heaterPin, HIGH); // Aktifkan pemanas
} else {
digitalWrite(heaterPin, LOW); // Matikan pemanas
}
// Kendalikan warna LED RGB berdasarkan kondisi suhu
if (temperature < setPoint) {
// Suhu di bawah set point, LED hijau menyala
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
} else {
// Suhu di atas set point, LED merah menyala
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);
}
// Tunggu hingga sample time sebelum mengulang siklus
delay(sampleTime);
}