Proyecto Final 3

Calidad del aire del salón

 

¡Prepárate para un nuevo desafío centrado en la seguridad y la salud! En este proyecto, te sumergirás en el mundo de la monitorización ambiental para proteger los espacios que habitamos. Diseñarás y construirás una "Central de Calidad del Aire", aprendiendo a gestionar un sistema de alerta multisensorial y registrar datos críticos, todo con tecnología de precisión.

Tu misión principal será implementar un sistema de detección autónomo cuyo corazón es el versátil sensor de gas MQ-2. Este sensor se encargará de controlar el ambiente en busca de gases peligrosos como monóxido de carbono (CO), GLP, alcohol o propano. Aprenderás a calibrarlo para obtener lecturas fiables, un paso crucial para la efectividad de tu dispositivo. Cuando el sensor detecte una concentración que supere el umbral de seguridad, tu sistema deberá reaccionar de inmediato.

La respuesta a una amenaza será contundente y clara: un zumbador emitirá una potente alarma sonora imposible de ignorar, mientras que el LED Rojo del MentorBit se iluminará con un parpadeo de emergencia, proporcionando una alerta visual inconfundible. Toda la información será centralizada en una pantalla OLED, que mostrará mensajes en tiempo real como "Calidad Aire OK" durante la normalidad, o "¡ALARMA GAS!" especificando el compuesto y su concentración en ppm durante una emergencia. Para añadir una capa de registro extra, tu proyecto incluirá un módulo RTC (Reloj en Tiempo Real) y un lector de tarjetas Micro SD que funcionarán como la caja negra del sistema, registrando cada incidente de alarma con su fecha y hora exactas en un archivo de texto.

Para dar vida a este sistema, integrarás todos los componentes utilizando tu MentorBit, asegurando que cada sensor y actuador se comunique a la perfección. Prepárate para dominar la calibración de sensores analógicos, la gestión de alarmas audiovisuales, la visualización de datos en tiempo real y el registro de eventos con precisión cronológica, llevando la seguridad ambiental a un nivel superior.

#include <MentorBit.h>
#include <MentorBitPantallas.h> // Para la pantalla OLED
#include <MentorBitMQ.h>       // Para el sensor MQ-2
#include <MentorBitPuertos.h>  // Para la gestión de pines
#include <MentorBitDataLogger.h> // Para la micro SD

// --- INSTANCIACIÓN DE OBJETOS ---
MentorBit miMentorBit;
MentorBitPuertos miModuloPuertos;
MentorBitPantallas DriverPantallas;
MentorBitDataLogger miDataLogger;
MentorBitMQ2 miMQ(miMQ.co, miModuloPuertos.PUERTO_MODULO_1_ANALOGICO);

// --- DEFINICIÓN DE PINES (¡AJUSTA SEGÚN TUS CONEXIONES!) ---
// Utiliza los nombres de pines que te proporcione la documentación de MentorBit y del módulo expansor.



// --- CONSTANTES Y VARIABLES GLOBALES ---
// Umbral de PPM para considerar la concentración de CO como peligrosa
const float CO_ALTO = 1.5; //5 ppm, puedes ajustar este valor
const float GLP_ALTO = 1; //0 ppm
const float H2_BAJO = 1; //1 ppm
const float ALCOHOL_ALTO = 1; //0 ppm
const float PROPANO_ALTO = 1; //0 ppm

// Variables para el parpadeo de la alarma
unsigned long lastBlinkTime = 0;
const unsigned long BLINK_INTERVAL = 200; // Intervalo de parpadeo en ms (200ms ON, 200ms OFF)
bool alarmState = false; // true = alarma activa (sonando y parpadeando)

// Variable con el nombre del Archivo que vamos a emplear
String archivo = "Alarma.txt";


// --- FUNCIONES AUXILIARES ---

// Función para actualizar la pantalla OLED
void actualizarOLED(String linea1, String linea2 = "", String linea3 = "", String linea4 = "") {
    DriverPantallas.oled.clearDisplay(); // Limpia la pantalla
    DriverPantallas.oled.setCursor(0, 0); DriverPantallas.oled.print(linea1);
    DriverPantallas.oled.setCursor(0, 10); DriverPantallas.oled.print(linea2);
    DriverPantallas.oled.setCursor(0, 20); DriverPantallas.oled.print(linea3);
    DriverPantallas.oled.setCursor(0, 30); DriverPantallas.oled.print(linea4);
    DriverPantallas.oled.display(); // Muestra el contenido en la pantalla
}

// Función para activar/desactivar el zumbador y parpadear el led rojo
void activarAlarmaVisualAuditiva(float concentracion, const String& nombreGas) {
    unsigned long currentTime = millis();

    if (currentTime - lastBlinkTime >= BLINK_INTERVAL) {
        lastBlinkTime = currentTime;
        alarmState = !alarmState; // Alternar estado (ON/OFF)

        if (alarmState) {
            // LED: Rojo intenso
            digitalWrite(miMentorBit.LED_ROJO, HIGH);
            digitalWrite(miMentorBit.LED_AZUL, LOW);
            // Zumbador: Encendido
            tone(miMentorBit.ZUMBADOR, 1000, 300);
        } else {
            // LED rojo: Apagado
            digitalWrite(miMentorBit.LED_ROJO, LOW);
            // Apagamos el Zumbador
            noTone(miMentorBit.ZUMBADOR);
        }
    }
    // Mostrar mensaje de alarma en OLED
    actualizarOLED("!!! ALARMA GAS !!!",
                    nombreGas + ": " + String(concentracion, 1) + "ppm",
                    "Ventile de Inmediato",
                    "Abra Ventanas");
   
    Serial.print("ALARMA DE GAS " + nombreGas + ": ");
    Serial.print(concentracion, 1); // Un decimal
    Serial.println(" ppm");

    // Registro con fecha y hora
    String fecha_hora_actual = miDataLogger.obtenerHoraRTC();
    String fecha_actual = fecha_hora_actual.substring(0, 10);
    String hora_actual = fecha_hora_actual.substring(11);

    String registro = "Alarma por " + nombreGas +
                      " el " + fecha_actual +
                      " a las " + hora_actual +
                      " (" + String(concentracion, 1) + " ppm)";
   
    miDataLogger.escribirEnArchivo(archivo, registro);
    Serial.println(registro);
}

// Función para desactivar la alarma y mostrar estado normal
void desactivarAlarma() {
    digitalWrite(miMentorBit.LED_AZUL, HIGH);
    noTone(miMentorBit.ZUMBADOR);
    alarmState = false; // Asegurarse de que el estado interno sea OFF
}

void setup() {
    Serial.begin(9600);
    Serial.println("Iniciando Centro de Notificaciones y Calidad del Aire...");

    // Inicializar pin del zumbador apagado
    noTone(miMentorBit.ZUMBADOR);

    // Inicializar LED rojo del MentorBit
    digitalWrite(miMentorBit.LED_AZUL, LOW);
    digitalWrite(miMentorBit.LED_ROJO, LOW);


    // Inicializar pantalla OLED
    DriverPantallas.inicializarOLED();
    DriverPantallas.oled.setTextSize(1);
    DriverPantallas.oled.setTextColor(SSD1306_WHITE);
    actualizarOLED("Calidad Aire", "Iniciando Sensor...");
    delay(2000);

    // Calibrar el sensor MQ-2
    Serial.println("Calibrando sensor MQ-2. Esto puede tardar 20-30 segundos...");
    actualizarOLED("Calibrando MQ-2...", "Mantener en aire limpio");
    miMQ.calibrar();
    Serial.println("Calibracion MQ-2 completa.");
    actualizarOLED("Calibracion OK", "Sistema Listo!");
    delay(1000);

    // Inicalizamos el RTC
    miDataLogger.inicializarRTC();
    // Configuramos el RTC con la fecha y la hora del PC
    miDataLogger.ajustarHoraRTC();
    // Comprobamos que la Tarjeta Micro SD se inicialice correctamente
    if(!miDataLogger.inicializarSD()) {
        // Inicializamos y configuramos la Pantalla LCD
        DriverPantallas.inicializarLCD();
        DriverPantallas.lcd.backlight();
        // Mostramos un mensaje por Pantalla LCD indicando un error con la SD
        DriverPantallas.lcd.clear();
        DriverPantallas.lcd.setCursor(0, 0);
        DriverPantallas.lcd.print("Problema con la");
        DriverPantallas.lcd.setCursor(0, 1);
        DriverPantallas.lcd.print("Micro SD");
        while(true) {} // Código bloqueante para no avanzar sin Tarjeta Micro SD
    }
    // Guardamos un primer mensaje distintivo al comienzo de la cuenta
    miDataLogger.escribirEnArchivo(archivo, "---- Registro de alarmas ----");

    // Esperamos un poco antes de empezar
    delay(2000);

    // Limpiamos la pantalla antes de empezar
    DriverPantallas.lcd.clear();
}

void loop() {
    // --- 1. Monitorización de Calidad del Aire (Sensor MQ-2) ---
    miMQ.cambiarDeteccionGas(miMQ.co);
    float concentracion_co_ppm = miMQ.obtenerLecturaMQ();
    miMQ.cambiarDeteccionGas(miMQ.glp);
    float concentracion_glp_ppm = miMQ.obtenerLecturaMQ();
    miMQ.cambiarDeteccionGas(miMQ.h2);
    float concentracion_h2_ppm = miMQ.obtenerLecturaMQ();
    miMQ.cambiarDeteccionGas(miMQ.alcohol);
    float concentracion_alcohol_ppm = miMQ.obtenerLecturaMQ();
    miMQ.cambiarDeteccionGas(miMQ.propano);
    float concentracion_propano_ppm = miMQ.obtenerLecturaMQ();
   

    // --- 2. Lógica de Alerta de Seguridad Ambiental ---
    if (concentracion_co_ppm > CO_ALTO) {
        activarAlarmaVisualAuditiva(concentracion_co_ppm, "CO");
    }
    else if (concentracion_glp_ppm > GLP_ALTO) {
        activarAlarmaVisualAuditiva(concentracion_glp_ppm, "GLP");
    }
    else if (concentracion_h2_ppm < H2_BAJO) {
        activarAlarmaVisualAuditiva(concentracion_h2_ppm, "H2");
    }
    else if (concentracion_alcohol_ppm > ALCOHOL_ALTO) {
        activarAlarmaVisualAuditiva(concentracion_alcohol_ppm, "ALCOHOL");
    }
    else if (concentracion_propano_ppm > PROPANO_ALTO) {
        activarAlarmaVisualAuditiva(concentracion_propano_ppm, "PROPANO");
    }
    else {
        desactivarAlarma();
        // Mostrar estado normal de calidad del aire en OLED
        actualizarOLED("Calidad Aire OK");
    }


    delay(500); // Pausa para no saturar lecturas y displays
}
Vistas
1 Número de vistas
1 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.