diff --git a/InterfaceOption.png b/InterfaceOption.png new file mode 100644 index 0000000..c96fca3 Binary files /dev/null and b/InterfaceOption.png differ diff --git a/MHZ19B/mhz19b_driver.c b/MHZ19B/mhz19b_driver.c index 1b2e305..77b821e 100644 --- a/MHZ19B/mhz19b_driver.c +++ b/MHZ19B/mhz19b_driver.c @@ -5,7 +5,7 @@ #include #include -// --- 1. FUNCIÓN DE INICIALIZACIÓN --- +// --- FUNCIÓN DE INICIALIZACIÓN --- // Devuelve el descriptor de archivo (fd) o -1 si falla. int init_uart(const char *puerto, speed_t baudrate) { // Abrir el puerto: Lectura/Escritura, no ser la terminal controladora, no bloquear. @@ -59,7 +59,7 @@ int init_uart(const char *puerto, speed_t baudrate) { return fd; } -// --- 2. FUNCIÓN PARA ENVIAR --- +// --- FUNCIÓN PARA ENVIAR --- void send_uart(int fd, unsigned char *trama, int longitud) { tcflush(fd, TCIOFLUSH); // Limpiar tubería antes de hablar int escritos = write(fd, trama, longitud); @@ -68,13 +68,13 @@ void send_uart(int fd, unsigned char *trama, int longitud) { } } -// --- 3. FUNCIÓN PARA RECIBIR --- +// --- FUNCIÓN PARA RECIBIR --- int receive_uart(int fd, unsigned char *buffer, int longitud_esperada) { int bytes_leidos = read(fd, buffer, longitud_esperada); return bytes_leidos; } -// --- EJEMPLO DE USO --- +// --- FUNCION PRINCIPAL --- int main() { int uart_fd = init_uart("/dev/serial0", B9600); if (uart_fd == -1) return 1; @@ -94,16 +94,6 @@ int main() { // 2. Imprimir en consola (para tu propio monitoreo) printf("Respuesta OK: CO2 = %d ppm\n", co2_ppm); - - // 3. Escribir el valor en el archivo JSON para la interfaz web - FILE *archivo_json = fopen("Data/MHZ19B.json", "w"); // "w" sobreescribe el archivo cada vez - if (archivo_json != NULL) { - // Formatear estrictamente como JSON - fprintf(archivo_json, "{\n \"ppm\": %d\n}\n", co2_ppm); - fclose(archivo_json); // Liberar el archivo para que JS pueda leerlo - } else { - perror("Error: No se pudo crear/abrir el archivo JSON"); - } } else { printf("Error: Bytes recibidos = %d\n", bytes); diff --git a/README.md b/README.md index 881faef..951daf6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ El propósito principal de este proyecto es estudiar y comprender la arquitectur --- # 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. +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. --- @@ -42,11 +42,6 @@ Las principales características del sensor son: ## Software - UART (TTL) - Lenguaje C -- HTML5 -- CSS3 -- JavaScript -- JSON -- Nginx - Linux - Git @@ -81,7 +76,7 @@ sudo apt update && sudo apt upgrade -y ## 2. Instalar Dependencias ```bash -sudo apt install git gcc nginx -y +sudo apt install git gcc -y ``` --- @@ -100,16 +95,22 @@ Ir a: 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: @@ -128,29 +129,10 @@ 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/ +cd MHZ19B ``` Compilar el controlador: @@ -176,33 +158,7 @@ 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. +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. --- @@ -217,22 +173,16 @@ La interfaz web consultará periódicamente el archivo **MHZ19B.json** mediante 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 + C( Driver en C) -->|Imprime datos| D - %% Nube / Web Dashboard - F(( Dashboard Web / Cliente)) + %% 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 y un retraso de 6 segundos entre la consola y la interfaz gráfica. +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. @@ -241,5 +191,4 @@ A pesar de esto, UART sigue siendo uno de los pilares dentro de los sistemas emb 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. \ No newline at end of file +- **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. \ No newline at end of file diff --git a/SerialPort.png b/SerialPort.png new file mode 100644 index 0000000..e0977f2 Binary files /dev/null and b/SerialPort.png differ diff --git a/WYLL_No.png b/WYLL_No.png new file mode 100644 index 0000000..6661e63 Binary files /dev/null and b/WYLL_No.png differ diff --git a/WYLS_Yes.png b/WYLS_Yes.png new file mode 100644 index 0000000..1b24711 Binary files /dev/null and b/WYLS_Yes.png differ