#include <Servo.h>
#include <PID_v1_bc.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define POT_PIN A0
#define RELAY_PIN 12
#define LCD_COLS 16
#define LCD_ROWS 2
#define LCD_ADDR 0x27
double setpoint, input, output;
double kp = 2.0, ki = 5.0, kd = 1.0;
unsigned long prev_time;
int min_val = 0, max_val = 1023;
Servo servo;
PID pid(&input, &output, &setpoint, kp, ki, kd, DIRECT);
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);
void setup() {
Serial.begin(9600);
servo.attach(9);
pid.SetMode(AUTOMATIC);
pid.SetOutputLimits(0, 255);
lcd.init();
lcd.backlight();
}
void loop() {
input = analogRead(POT_PIN);
input = map(input, min_val, max_val, 0, 255);
unsigned long curr_time = millis();
if (curr_time - prev_time > 100) {
pid.Compute();
prev_time = curr_time;
}
int servo_val = (int)output;
if (servo_val > 0) {
digitalWrite(RELAY_PIN, HIGH);
servo.write(servo_val);
} else {
digitalWrite(RELAY_PIN, LOW);
}
setpoint = analogRead(POT_PIN);
setpoint = map(setpoint, min_val, max_val, 0, 255);
lcd.setCursor(0, 0);
lcd.print("SP: ");
lcd.print(setpoint);
lcd.setCursor(0, 1);
lcd.print("PV: ");
lcd.print(input);
}