martes, 7 de abril de 2026

Sistema: Control Automático de Humedad

 

/*

 * =========================================================

 * 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