#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PID_v1.h>
// Definir los pines y constantes
const int pressureSensorPin = A0; // Pin analógico para el sensor de presión
const int pumpPin = 10; // Pin digital para controlar la bomba
const int boton1 = 9; //Pin digital boton salir del loop
const int boton2 = 11; // Pin digital para control arduino
const int boton3 = 12; //Pin digital para control delonghi
// Definir las constantes del PID
double Setpoint = 6.0; // Valor deseado de presión (en bares)
double Kp = 6.0; // Ganancia proporcional
double Ki = 3.1; // Ganancia integral
double Kd = 0.01; // Ganancia derivativa
double pressureSensorInput; // Variable para la entrada del sensor de presión
double pumpOutput; // Variable para la salida de control de la bomba
// Crear objetos para el PID
PID myPID(&pressureSensorInput, &pumpOutput, &Setpoint, Kp, Ki, Kd, DIRECT);
// Inicializar la pantalla LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección I2C 0x27, 20 columnas y 4 filas
//Definir variables botones
int valorBoton1;
int valorBoton2;
int valorBoton3;
// Marcar que el cambio se ha realizado
boolean setpointChanged = false;
int modoTrabajo = 0;
//Variable tiempo
unsigned long tiempoInicio = 0;
unsigned long tiempoActual;
unsigned long duracionTotal;
void setup() {
// Inicializar el sensor de presión
pinMode(pressureSensorPin, INPUT);
//Iniciar botones
pinMode(boton1,INPUT);
digitalWrite(boton1, HIGH);
pinMode(boton2,INPUT);
digitalWrite(boton2, HIGH);
pinMode(boton3,INPUT);
// Inicializar la bomba
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, LOW);
// Inicializar la pantalla LCD
lcd.init();
lcd.backlight();
// Configurar el objeto PID
myPID.SetOutputLimits(0, 255); // Limitar la salida entre 0 y 255
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(100); // Tiempo de muestreo en milisegundos
// Iniciar el monitor serial
Serial.begin(9600);
// Inicializar el tiempo de inicio
tiempoInicio = millis();
// Mostrar información en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("1_Perfil [5/9bares]");
lcd.setCursor(0, 1);
lcd.print("2_Perfil [9bares]");
lcd.setCursor(2, 3);
lcd.print("Delonghi v1");
delay(1000);
}
void loop() {
//Lee el estado de los botones
valorBoton1 = digitalRead(boton1);
valorBoton2 = digitalRead(boton2);
if (valorBoton1 == 0) {
Setpoint = 9.0; // Cambiar el valor deseado a 9 bares
modoTrabajo = 1; //Habilita PID a 9 bares
}
if(valorBoton2 == 0 || modoTrabajo == 1){
modoTrabajo = 1;
if(duracionTotal >= 15 && !setpointChanged){
Setpoint = 9.0; // Cambiar el valor deseado a 9 bares
setpointChanged = true; // Marcar que el cambio se ha realizado
}
// Leer el valor actual del sensor de presión
int pressure = analogRead(pressureSensorPin);
// Escalar la lectura del sensor de presión de 0 a 1023 a 0 a 12 bares
double pressureInBars = map(pressure, 0, 1023, 0, 12);
// Actualizar la entrada del sensor de presión
pressureSensorInput = pressureInBars;
// Calcular la salida del PID
myPID.Compute();
// Escalar la salida del PID de 0 a 255 a 0 a 1023 para el control de voltaje
int pumpSpeed = map(pumpOutput, 0, 255, 0, 1023);
analogWrite(pumpPin, pumpSpeed);
// Mostrar información en la pantalla LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Presion (bares):");
lcd.setCursor(0, 1);
lcd.print(pressureInBars, 2); // Muestra 2 decimales
lcd.setCursor(0, 2);
lcd.print("Setpoint (bares):");
lcd.setCursor(0, 3);
lcd.print(Setpoint, 2); // Muestra 2 decimales
// Mostrar información en el monitor serial
Serial.print("Presión actual (bares): ");
Serial.println(pressureInBars);
Serial.print("Salida del PID: ");
Serial.println(pumpOutput);
// Calcular el tiempo transcurrido en segundos
tiempoActual = millis();
duracionTotal = (tiempoActual - tiempoInicio) / 1000;
delay(500); // Esperar un segundo antes de la siguiente iteración
}
}