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 <termios.h>
// --- 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);

@ -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://<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.
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.
- **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.

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