Implemementación de mediciones en la terminal

main
parent c8bdc5469b
commit eb978a53d2

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@ -5,7 +5,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <termios.h> #include <termios.h>
// --- 1. FUNCIÓN DE INICIALIZACIÓN --- // --- FUNCIÓN DE INICIALIZACIÓN ---
// Devuelve el descriptor de archivo (fd) o -1 si falla. // Devuelve el descriptor de archivo (fd) o -1 si falla.
int init_uart(const char *puerto, speed_t baudrate) { int init_uart(const char *puerto, speed_t baudrate) {
// Abrir el puerto: Lectura/Escritura, no ser la terminal controladora, no bloquear. // 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; return fd;
} }
// --- 2. FUNCIÓN PARA ENVIAR --- // --- FUNCIÓN PARA ENVIAR ---
void send_uart(int fd, unsigned char *trama, int longitud) { void send_uart(int fd, unsigned char *trama, int longitud) {
tcflush(fd, TCIOFLUSH); // Limpiar tubería antes de hablar tcflush(fd, TCIOFLUSH); // Limpiar tubería antes de hablar
int escritos = write(fd, trama, longitud); 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 receive_uart(int fd, unsigned char *buffer, int longitud_esperada) {
int bytes_leidos = read(fd, buffer, longitud_esperada); int bytes_leidos = read(fd, buffer, longitud_esperada);
return bytes_leidos; return bytes_leidos;
} }
// --- EJEMPLO DE USO --- // --- FUNCION PRINCIPAL ---
int main() { int main() {
int uart_fd = init_uart("/dev/serial0", B9600); int uart_fd = init_uart("/dev/serial0", B9600);
if (uart_fd == -1) return 1; if (uart_fd == -1) return 1;
@ -95,16 +95,6 @@ int main() {
// 2. Imprimir en consola (para tu propio monitoreo) // 2. Imprimir en consola (para tu propio monitoreo)
printf("Respuesta OK: CO2 = %d ppm\n", co2_ppm); 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 { } else {
printf("Error: Bytes recibidos = %d\n", bytes); printf("Error: Bytes recibidos = %d\n", bytes);
} }

@ -7,7 +7,7 @@ El propósito principal de este proyecto es estudiar y comprender la arquitectur
--- ---
# Objetivo del Proyecto # 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 ## Software
- UART (TTL) - UART (TTL)
- Lenguaje C - Lenguaje C
- HTML5
- CSS3
- JavaScript
- JSON
- Nginx
- Linux - Linux
- Git - Git
@ -81,7 +76,7 @@ sudo apt update && sudo apt upgrade -y
## 2. Instalar Dependencias ## 2. Instalar Dependencias
```bash ```bash
sudo apt install git gcc nginx -y sudo apt install git gcc -y
``` ```
--- ---
@ -100,16 +95,22 @@ Ir a:
Interface Options Interface Options
└── Serial Port └── Serial Port
``` ```
![Opciones de Interfaz](InterfaceOption.png)
![Puerto Serial](SerialPort.png)
Configurar: Configurar:
```text ```text
Would you like a login shell to be accessible over serial? Would you like a login shell to be accessible over serial?
No 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? Would you like the serial port hardware to be enabled?
Yes Yes
``` ```
![Would you like the serial port hardware to be enabled?](WYLS_Yes.png)
Reiniciar el sistema: 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 # Compilación del Controlador en C
Ubicarse en el directorio del proyecto:
```bash ```bash
cd /var/www/html/ cd MHZ19B
``` ```
Compilar el controlador: Compilar el controlador:
@ -176,33 +158,7 @@ El controlador se comunicará con el sensor mediante el dispositivo:
```text ```text
/dev/serial0 /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.
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.
--- ---
@ -217,22 +173,16 @@ La interfaz web consultará periódicamente el archivo **MHZ19B.json** mediante
B{{ Raspberry Pi 4}} --> C B{{ Raspberry Pi 4}} --> C
%% Proceso de Software %% Proceso de Software
C( Driver en C) -->|Escribe datos| D C( Driver en C) -->|Imprime datos| D
%% Base de datos / Archivo
D[( MHZ19B.json)] -.->|Lectura local| E
%% Servidor Web
E[[ Servidor Nginx]] -->|HTTP / Fetch API| F
%% Nube / Web Dashboard %% Terminal
F(( Dashboard Web / Cliente)) D[[ Terminal ]]
``` ```
--- ---
# Conclusión # 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. 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: 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. - **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. - **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.
- **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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Loading…
Cancel
Save