You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
7.3 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 | 02000 ppm o 05000 ppm (configurable) |
| Voltaje de alimentación | 3.65.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://<IP_DE_LA_RASPBERRY_PI>
```
![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.