# 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**, permitiendo que muestre las mediciones de CO₂ en tiempo real en la terminal. 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 - 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 -y ``` --- ## 3. Habilitar UART Ejecutar: ```bash sudo raspi-config ``` Ir a: ```text Interface Options └── Serial Port ``` ![Opciones de Interfaz](InterfaceOption.png) ![Puerto Serial](SerialPort.png) Configurar: ```text Would you like a login shell to be accessible over serial? No ``` ![Would you like a login shell to be accessible over serial?](WYLL_No.png) ``` Would you like the serial port hardware to be enabled? Yes ``` ![Would you like the serial port hardware to be enabled?](WYLS_Yes.png) 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 ``` --- # Compilación del Controlador en C ```bash cd MHZ19B ``` 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 ``` Este no es un puerto físico real, sino un acceso directo que el sistema operativo de la Raspberry Pi crea automáticamente para apuntar al puerto serial principal que está mapeado a los pines físicos de la placa. --- # 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) -->|Imprime datos| D %% Terminal D[[ Terminal ]] ``` --- # 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. 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. 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.