# Proyecto de Investigación: Integración del Sensor NDIR MH-Z19B vía UART Este repositorio documenta la integración, adquisición y visualización de datos del sensor de dióxido de carbono (CO₂) **MH-Z19B**. El propósito principal de este proyecto es estudiar y comprender la arquitectura del protocolo de comunicación asíncrona **UART** a bajo nivel en sistemas embebidos basados en Linux utilizando una **Raspberry Pi 4**. Esta implementación integra una prueba experimental para la integración de sensores que formarán parte del desarrollo de microestaciones destinadas al monitoreo de la calidad del aire, desarrolladas durante el **Verano de la Investigación Científica y Tecnológica del Programa Delfín 2026**. --- # Objetivo del Proyecto Implementar un controlador de bajo nivel para el sensor **MH-Z19B** utilizando comunicación **UART**, integrándolo con una interfaz web capaz de visualizar las mediciones de CO₂ en tiempo real. Esta implementación constituye la base para el desarrollo de futuras microestaciones inteligentes destinadas al monitoreo ambiental y la calidad del aire. --- # Especificaciones Técnicas del Sensor (MH-Z19B) El **MH-Z19B** es un sensor compacto que utiliza la tecnología **NDIR (Non-Dispersive Infrared)** para medir la concentración de dióxido de carbono (CO₂) en el aire. Esta tecnología se basa en que las moléculas de gas absorben luz infrarroja a longitudes de onda muy específicas por lo que proporciona alta selectividad, buena estabilidad y no depende de la concentración de oxígeno para realizar las mediciones. Las principales características del sensor son: | Característica | Valor | | :--- | :--- | | Tecnología | NDIR (Non-Dispersive Infrared) | | Gas medido | CO₂ | | Rango de medición | 0–2000 ppm o 0–5000 ppm (configurable) | | Voltaje de alimentación | 3.6–5.5 V DC | | Tiempo de precalentamiento | 3 minutos | | Comunicación | UART TTL | | Velocidad de transmisión | 9600 baudios | | Configuración UART | 8 bits de datos, sin paridad, 1 bit de parada (8N1) | | Vida útil estimada | Mayor a 5 años | --- # Material ## Hardware - Raspberry Pi 4 - Sensor MH-Z19B - Cables Jumper - MicroSD card with Raspberry Pi OS ## Software - UART (TTL) - Lenguaje C - HTML5 - CSS3 - JavaScript - JSON - Nginx - Linux - Git --- # Conexiones de Hardware (Capa Física) Para establecer correctamente la comunicación UART entre el sensor y la Raspberry Pi 4 es necesario cruzar las líneas de transmisión y recepción. | Pin MH-Z19B | Función | Raspberry Pi 4 | Descripción | | :--- | :--- | :--- | :--- | | Vin (Pin 6) | Alimentación | Pin físico **2** o **4** (5 V) | Alimenta el sensor. | | GND (Pin 7) | Tierra | Pin físico **6** (GND) | Referencia eléctrica común. | | TXD (Pin 3) | Transmisión | Pin físico **10** (GPIO15 / RXD) | Envía los datos del sensor hacia la Raspberry Pi. | | RXD (Pin 2) | Recepción | Pin físico **8** (GPIO14 / TXD) | Recibe los comandos enviados por la Raspberry Pi. | ![Esquema de Conexiones](EsquemaPines.png) --- # Guía de Uso ## 1. Actualizar el Sistema ```bash sudo apt update && sudo apt upgrade -y ``` --- ## 2. Instalar Dependencias ```bash sudo apt install git gcc nginx -y ``` --- ## 3. Habilitar UART Ejecutar: ```bash sudo raspi-config ``` Ir a: ```text Interface Options └── Serial Port ``` Configurar: ```text Would you like a login shell to be accessible over serial? No Would you like the serial port hardware to be enabled? Yes ``` Reiniciar el sistema: ```bash sudo reboot ``` --- ## 4. Clonar el Repositorio ```bash git clone https://gitea.itmorelia.com/Verano-Delfin-2026/CO2-Sensor.git cd CO2-Sensor ``` --- ## 5. Configurar Nginx Copiar los archivos de la interfaz web al servidor: ```bash sudo cp index.html /var/www/html/ sudo cp -r MHZ19B /var/www/html/ ``` Reiniciar Nginx: ```bash sudo systemctl restart nginx ``` --- # Compilación del Controlador en C Ubicarse en el directorio del proyecto: ```bash cd /var/www/html/ ``` Compilar el controlador: ```bash gcc mhz19b_driver.c -o driver_co2 ``` Asignar permisos: ```bash sudo chmod +x driver_co2 ``` Ejecutar el programa: ```bash sudo ./driver_co2 ``` El controlador se comunicará con el sensor mediante el dispositivo: ```text /dev/serial0 ``` Las mediciones serán almacenadas periódicamente en el archivo: ```text MHZ19B.json ``` Este archivo será utilizado posteriormente por la interfaz web. --- # Visualización del Dashboard Obtener la dirección IP de la Raspberry Pi: ```bash hostname -I ``` Abrir un navegador web desde cualquier dispositivo conectado a la misma red local e ingresar: ```text http:// ``` ![Pagina resultante con las mediciones](InterfazWeb.png) La interfaz web consultará periódicamente el archivo **MHZ19B.json** mediante JavaScript utilizando peticiones asíncronas (`fetch()`), mostrando en tiempo real la concentración de CO₂ y el estado de la calidad del aire. --- # Arquitectura General del Sistema ```mermaid graph TD %% Sensor físico A[ Sensor MH-Z19B] -->|UART 9600 baudios| B %% Placa/Hardware B{{ Raspberry Pi 4}} --> C %% Proceso de Software C( Driver en C) -->|Escribe datos| D %% Base de datos / Archivo D[( MHZ19B.json)] -.->|Lectura local| E %% Servidor Web E[[ Servidor Nginx]] -->|HTTP / Fetch API| F %% Nube / Web Dashboard F(( Dashboard Web / Cliente)) ``` --- # Conclusión El uso del protocolo UART implica un gran desafío debido a su necesidad de programación a bajo nivel en C. Durante la fase de depuración se logró identificar que dejar que el sistema operativo controle los tiempos lo hace muy propenso a fallas de sincronización. Esto se evidenció en la recepción de "basura" hexadecimal, la captura de tramas incompletas de apenas 3 bytes, el congelamiento del sistema por saturación de peticiones y un retraso de 6 segundos entre la consola y la interfaz gráfica. A pesar de esto, UART sigue siendo uno de los pilares dentro de los sistemas embebidos por ser una herramienta directa, robusta y útil. No solo permite una transmisión de datos confiable en tiempo real, sino que otorga el control absoluto sobre el hardware. # Limitaciones Aunque este mini proyecto cumple su objetivo de leer el CO₂ y probar la comunicación UART, tiene las siguientes limitaciones prácticas que debemos tomar en cuenta: - **Tiempos no exactos:** La Raspberry Pi funciona como una computadora normal y no está diseñada para controlar el tiempo con una precisión matemática perfecta. Esto hace que las pausas para comunicarse con el sensor tengan ligeras variaciones. - **El programa se "pausa" a esperar:** Actualmente, el código en C se detiene por completo hasta que el sensor responde y se guarda el archivo. Esto funciona bien para un solo sensor, pero si en el futuro queremos conectar varios a la vez, el sistema se volvería lento porque tendría que esperar a uno por uno en lugar de atenderlos al mismo tiempo. - **Consumo innecesario en la página web:** El panel web descarga el archivo completo cada dos segundos, haya o no haya datos nuevos. Para la versión final de la estación, lo ideal sería usar un método más inteligente donde la página se actualice *solo* cuando el nivel de CO₂ cambie, para no desperdiciar recursos ni hacer trabajar a la placa de más.