#include "PID_v1.h"
// Konstanta
#define SENSOR_NTC A0
#define LED_RED 11
#define LED_GREEN 10
const double SET_POINT = 27; //Suhu Nominal & Setpoint
const double NTC_NOMINAL = 10800; //Nilai Termistor pada 27 derajat C
const double BETA_COEF = 3950; //Koefisien beta termistor NTC
// Variabel PID
double setpoint = 27; // Suhu target dalam derajat Celsius
double input, output;
double Kp = 2, Ki = 3, Kd = 1; // Proposional = 2, Integral = 5, Derivative = 1
PID pidcs(&input, &output, &setpoint, Kp, Ki, Kd,P_ON_E, DIRECT);
void setup() {
Serial.begin(115200);
Serial.println(__FILE__);
//menetukan Outpul Limit PID
pidcs.SetOutputLimits(0, 100);
// Nyalakan PID
pidcs.SetMode(AUTOMATIC);
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_RED, LOW);
pinMode(LED_GREEN, OUTPUT);
digitalWrite(LED_GREEN, LOW);
}
// Print ke serial monitor
void report(void) {
static uint32_t last = 0;
const int interval = 1000; // interval proses pembacaan suhu (Sample Time) = 1000 ms = 1 s
if (millis() - last > interval) {
last += interval;
Serial.print("SP:");
Serial.print(setpoint);
Serial.print(" Suhu:");
Serial.print(input);
Serial.print(" Output PID:");
Serial.print(output);
Serial.print(' ');
Serial.println();
}
}
void loop() {
input = bacaSuhu();
pidcs.Compute();
// Kendalikan LED RGB berdasarkan output PID
analogWrite(LED_RED, abs(output));
analogWrite(LED_GREEN, 255 - abs(output));
report();
}
double bacaSuhu() {
//baca nilai analog sensor
int adcValue = analogRead(SENSOR_NTC);
//menghitung nilai resistansi NTC berdasarkan ADC (Analog to Digital Converter) dengan hukum Ohm
double resistance = NTC_NOMINAL / ((1023.0 / adcValue) - 1.0);
//menghitung suhu menggunakan rumus Steinhart-Hart (mengonversi resistansi ke suhu)
double temperature = 1.0 / ((log(resistance / NTC_NOMINAL) / BETA_COEF) + (1.0 / (SET_POINT + 273.15)));
//suhu di konversi dari kelvin ke celsius
temperature -= 273.15;
return temperature;
}