#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición de pines
#define TEMP_SENSOR_PIN A0
#define SETPOINT_PIN A1
#define OUTPUT_PIN 9
// Inicialización del LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables del PID
double Kp = 2.0, Ki = 5.0, Kd = 1.0;
double setpoint = 0;
double input = 0;
double output = 0;
double lastError = 0;
double integral = 0;
unsigned long lastTime = 0;
void setup() {
pinMode(TEMP_SENSOR_PIN, INPUT);
pinMode(SETPOINT_PIN, INPUT);
pinMode(OUTPUT_PIN, OUTPUT);
Serial.begin(9600); // Opcional
lcd.init();
lcd.backlight();
}
void loop() {
unsigned long now = millis();
double timeChange = (now - lastTime) / 1000.0;
if (timeChange >= 0.1) { // Cada 0.1 segundos
// Leer entradas
int rawSetpoint = analogRead(SETPOINT_PIN);
setpoint = map(rawSetpoint, 0, 1023, 0, 100); // Escala 0-100°C
int rawTemp = analogRead(TEMP_SENSOR_PIN);
input = map(rawTemp, 0, 1023, 0, 100); // Escala 0-100°C
// Cálculo PID
double error = setpoint - input;
integral += error * timeChange;
double derivative = (error - lastError) / timeChange;
output = Kp * error + Ki * integral + Kd * derivative;
output = constrain(output, 0, 255); // Limitar a rango PWM
// Aplicar salida
analogWrite(OUTPUT_PIN, output);
// Actualizar variables
lastError = error;
lastTime = now;
// Mostrar en pantalla
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Actual:");
lcd.print(input, 0);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Setpoint:");
lcd.print(setpoint, 0);
lcd.print(" C");
}
}