#include <Wire.h>
#include <LiquidCrystal.h>
#include <DHT.h>
// Definiciones de pines
const int rs = 12;
const int en = 14;
const int d4 = 27;
const int d5 = 26;
const int d6 = 32;
const int d7 = 33;
const int dhtPin = 21; // Pin del sensor DHT11
const int ventilador1Pin = 5; // Pin PWM para el ventilador 1
const int ventilador2Pin = 18; // Pin PWM para el ventilador 2
const int fuenteCalorPin = 19; // Pin PWM para la fuente de calor
const int potenciometroPin = 25; // Pin analógico para el potenciómetro
// Definiciones para el sensor DHT11
DHT dht(dhtPin, DHT22);
// Variables para el control PID
double setpoint = 37.5; // Temperatura deseada por defecto
double input, output;
double Kp = 2.0, Ki = 5.0, Kd = 1.0;
double lastInput;
unsigned long lastTime;
double ITerm, lastOutput;
const double maxOutput = 255.0;
const double minOutput = 0.0;
// Variables para la pantalla LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// Inicialización de componentes
lcd.begin(20, 4);
dht.begin();
pinMode(ventilador1Pin, OUTPUT);
pinMode(ventilador2Pin, OUTPUT);
pinMode(fuenteCalorPin, OUTPUT);
// Inicialización de variables de control PID
lastInput = input;
ITerm = lastOutput = 0;
lastTime = millis();
}
void loop() {
// Lectura de temperatura y humedad
float humedad = dht.readHumidity();
float temperatura = dht.readTemperature();
// Lectura de la posición del potenciómetro
int potValue = analogRead(potenciometroPin);
setpoint = map(potValue, 0, 4095, 200, 390) / 10.0; // Mapea el valor del potenciómetro a un rango de 20.0 a 39.0 grados Celsius
// Control PID
unsigned long now = millis();
double timeChange = (double)(now - lastTime);
if (timeChange >= 1000) {
input = temperatura;
double error = setpoint - input;
ITerm += (Ki * error);
if (ITerm > maxOutput) ITerm = maxOutput;
else if (ITerm < minOutput) ITerm = minOutput;
output = Kp * error + ITerm - Kd * (input - lastInput);
if (output > maxOutput) output = maxOutput;
else if (output < minOutput) output = minOutput;
analogWrite(ventilador1Pin, output);
analogWrite(ventilador2Pin, output);
analogWrite(fuenteCalorPin, output);
lastOutput = output;
lastInput = input;
lastTime = now;
}
// Actualizar la pantalla LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" INCUBADORA");
lcd.setCursor(0, 1);
lcd.print("Temp Deseada: ");
lcd.print(setpoint, 1);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Temperatura: ");
lcd.print(temperatura, 1);
lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("Humedad: ");
lcd.print(humedad, 1);
lcd.print("%");
delay(1000);
}