/*
*
=========================================================
*
COLEGIO GIMNASIO BILINGÜE MARIE CURIE
*
Proyecto de Tecnología y Automatización
*
Sistema: Control Automático de Humedad
*
Desarrollado por: Centro Prisma
*
Versión: 1.0 (Lazo cerrado ON/OFF + Kp en tiempo, sin PWM)
*
Fecha: 23 de Febrero de 2026
*
=========================================================
*
*
¿QUÉ HACE ESTE SISTEMA?
*
*
Este programa controla automáticamente la humedad del aire.
*
*
Funciona así:
*
1) Mide la humedad con un sensor.
*
2) La compara con un valor deseado llamado SETPOINT.
*
3) Calcula cuánto "falta" para llegar a ese valor.
*
4) Enciende o apaga el humidificador.
*
5) Ajusta la velocidad de reacción sin usar PWM.
*
*
Esto es un sistema de LAZO CERRADO porque:
* Mide → Compara → Actúa → Vuelve a medir.
*
*/
//
=========================================================
// LIBRERÍAS
//
=========================================================
#include <Wire.h> // Permite comunicación I2C
#include <Adafruit_SHT31.h> // Librería del sensor SHT31
// ================= SENSOR
=================
// Creamos el objeto del sensor.
// Es como decir: "Vamos a usar este
sensor de humedad".
Adafruit_SHT31 sensorHumedad =
Adafruit_SHT31();
// ================= PIN =================
// Pin donde está conectado el
humidificador.
const int PIN_HUMIDIFICADOR = 25;
// ================= CONTROL
=================
// SETPOINT = humedad deseada.
// En este caso queremos llegar al 85%.
const float SETPOINT = 85.0;
// KP controla qué tan rápido reacciona el
sistema.
// Entre mayor sea, más fuerte será la
reacción.
const float KP = 1.0;
// ================= TIEMPOS
=================
// Tiempo base de espera entre mediciones.
const int TIEMPO_BASE = 1000;
// Tiempo mínimo permitido (para que no
sea demasiado rápido).
const int TIEMPO_MIN = 200;
// Tiempo máximo permitido (para que no
sea demasiado lento).
const int TIEMPO_MAX = 3000;
// ================= VARIABLES
=================
// Aquí se guarda la humedad medida por el
sensor.
float humedadActual = 0.0;
// Aquí se guarda cuánto falta para llegar
al setpoint.
// Nunca será negativo.
float error = 0.0;
// Tiempo que el sistema esperará antes de
volver a medir.
int tiempoEspera = TIEMPO_BASE;
//
=================================================
// FUNCIONES
// =================================================
//
-------------------------------------------------
// MIDE LA HUMEDAD DEL AIRE
//
-------------------------------------------------
void medirHumedad() {
//
Le pedimos al sensor que mida la humedad.
humedadActual = sensorHumedad.readHumidity();
//
Seguridad: si por alguna razón el valor es menor que 0,
//
lo corregimos a 0%.
if
(humedadActual < 0) {
humedadActual = 0;
}
//
Seguridad: si supera 100%, lo corregimos.
if
(humedadActual > 100) {
humedadActual = 100;
}
}
//
-------------------------------------------------
// CALCULA CUÁNTO FALTA PARA LLEGAR AL
SETPOINT
//
-------------------------------------------------
void calcularError() {
//
Restamos: meta menos humedad actual.
error = SETPOINT - humedadActual;
//
Si ya estamos por encima del setpoint,
//
no hay "falta", entonces el error es 0.
if
(error < 0) {
error = 0;
}
}
//
-------------------------------------------------
// ENCIENDE EL HUMIDIFICADOR
//
-------------------------------------------------
void encenderHumidificador() {
digitalWrite(PIN_HUMIDIFICADOR, HIGH);
Serial.println("HUMIDIFICADOR: ENCENDIDO");
}
//
-------------------------------------------------
// APAGA EL HUMIDIFICADOR
//
-------------------------------------------------
void apagarHumidificador() {
digitalWrite(PIN_HUMIDIFICADOR, LOW);
Serial.println("HUMIDIFICADOR: APAGADO");
}
//
-------------------------------------------------
// DECIDE SI ENCENDER O APAGAR
//
-------------------------------------------------
void decidirAccion() {
//
Si estamos por debajo del setpoint, encendemos.
if
(humedadActual < SETPOINT) {
encenderHumidificador();
}
//
Si estamos por encima del setpoint, apagamos.
if
(humedadActual > SETPOINT) {
apagarHumidificador();
}
}
//
-------------------------------------------------
// AJUSTA LA VELOCIDAD DE REACCIÓN (SIN
PWM)
// -------------------------------------------------
void calcularVelocidadReaccion() {
//
Empezamos con el tiempo base.
tiempoEspera = TIEMPO_BASE;
//
Si hay error, ajustamos el tiempo.
if
(error > 0) {
// Entre más grande sea el error,
// más rápido reaccionará el sistema.
tiempoEspera = TIEMPO_BASE - (int)(KP * error * 20);
}
//
Evitamos que el tiempo sea demasiado pequeño.
if
(tiempoEspera < TIEMPO_MIN) {
tiempoEspera = TIEMPO_MIN;
}
//
Evitamos que sea demasiado grande.
if
(tiempoEspera > TIEMPO_MAX) {
tiempoEspera = TIEMPO_MAX;
}
}
//
-------------------------------------------------
// MUESTRA TODA LA INFORMACIÓN EN PANTALLA
//
-------------------------------------------------
void mostrarDatos() {
Serial.println("=================================");
Serial.print("Humedad actual: ");
Serial.print(humedadActual);
Serial.println(" %");
Serial.print("Setpoint: ");
Serial.print(SETPOINT);
Serial.println(" %");
Serial.print("Error (Falta): ");
Serial.println(error);
}
//
-------------------------------------------------
// ESPERA ANTES DE VOLVER A MEDIR
//
-------------------------------------------------
void esperar() {
delay(tiempoEspera);
}
// =================================================
// SETUP (SE EJECUTA UNA SOLA VEZ)
//
=================================================
void setup() {
Serial.begin(115200);
//
Iniciamos comunicación I2C
Wire.begin(21, 22);
//
Encendemos el sensor
sensorHumedad.begin(0x44);
//
Configuramos el pin del humidificador como salida
pinMode(PIN_HUMIDIFICADOR, OUTPUT);
//
Comenzamos con el humidificador apagado
digitalWrite(PIN_HUMIDIFICADOR, LOW);
Serial.println("CONTROL DE HUMEDAD INICIADO");
}
//
=================================================
// LAZO CERRADO (SE REPITE SIEMPRE)
//
=================================================
void loop() {
//
1️⃣ Medir la humedad
medirHumedad();
// 2️⃣ Calcular cuánto falta
calcularError();
//
3️⃣ Decidir si encender o apagar
decidirAccion();
//
4️⃣ Ajustar velocidad de reacción
calcularVelocidadReaccion();
//
5️⃣ Mostrar información
mostrarDatos();
//
6️⃣ Esperar antes de repetir
esperar();
}
No hay comentarios:
Publicar un comentario