#include "PID_v1.h"
#define PWM_PIN 3
#define INPUT_PIN A1
#define SETPOINT_PIN A0
#define LED_GREEN 6
#define LED_RED 7
//definisi variabel kebutuhan PID
double Kp = 20, Ki = 5, Kd = 2;
double setpoint, input, output;
PID pidcs(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println(__FILE__); //kebutuhan di workwi
//set PID limit (pwm range)
pidcs.SetOutputLimits(-4, 255);
//nayalakan PID
pidcs.SetMode(AUTOMATIC);
//set pin output LED
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
//membaca ADC dari analognya sensor
//untuk bisa re-mapping maka digunakan map
input = map(analogRead(INPUT_PIN), 115.0, 511.2, 80, 25); //kebalik karena pakai NTC
//define setpoint awal
setpoint = map(analogRead(SETPOINT_PIN), 0, 1023, 16, 80);
}
//function yang mencetak nilai ke layar monitor
//akan mencetak nilai dengan rentang 1 detik sekali
void report(void){
static uint32_t last = 0;
const int interval = 1000;
if(millis() - last > interval) {
//do action
last += interval;
if(output > 0) {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
} else {
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
}
Serial.print(" SP:"); //setpoint
Serial.print(setpoint);
Serial.print(" PV:"); //hasil pembacaan sensor
Serial.print(input);
Serial.print(" CV:");
Serial.print(output);
Serial.print(" ");
Serial.println();
}
}
void loop() {
// put your main code here, to run repeatedly:
input = map(analogRead(INPUT_PIN), 115.0, 511.2, 80, 25);
if (pidcs.Compute()) {
analogWrite(PWM_PIN, (int)output); //output nilai perhitungan di PID ada di pin 3
//lalu nilai output yang awalnya ouble dicasting jadi interger
setpoint = map(analogRead(SETPOINT_PIN), 0, 1023, 16, 80);
}
report();
}
80
SetPoint
16