Página principal

Sensores

Tratamiento de datos metereológicos
con
Python
Generar página web de temperaturas


Este artículo es una continuación de una serie de artículos sento.html , oracam.html, serora.html .
El propósito de este artículo es capturar los datos que manda un módulo ( en este caso un arduino con sensores) a través del puerto serie ( /dev/ttyUSB0', '/dev/ttyUSB1','/dev/ttyACM0','/dev/ttyACM1'....) y procesarlos para guardarlos en un fichero ( ejemplo: Temp2019_06_04.csv ).
Además de todo lo anterior, creará una página web donde se visualizarán los datos a través de un servidor web.
No soy muy partidario de Python, pero al estar muy implantado en todas la plataformas del tipo Raspberry o Orange-PI,  que es donde se va montar el servidor, la programación se va a realizar en este lenguaje. Deberéis perdonar lo mal que sé programar en Python, soy novato en este lenguaje de programación, normalmente programo en C/C++ o Básic.

Lo primero es saber el formato que tienen los datos que transmite el modulo de sensores (arduino) a través del puerto serie.
Formato de datos
INICIO
Temperatura,14.0
Humedad,32
#presion,923
#Temperatura,26.1
FINAL

Como podéis observar el formato es bastante simple:
Dos cadenas INICIO y FINAL, y en medio datos.
Cada línea de datos está compuesto del tipo de dato y el valor, separados por una coma.

Lo primero que hace el programa es buscar el módulo en todos los puertos serie posibles.
Al escanear los puertos, si existe el módulo, responderá el módulo con la palabra SENSORTOTAL empezándose a ejecutarse la rutina principal del programa.

En la rutina principal del programa, se lee continuamente el puerto serie hasta que encuentra datos a procesar.
Cuando encuentra datos, los almacena en las variables  dTemperatura, dHumedad, dPresion.
La visualización en tiempo real se realiza en consola.


Cada minuto se van almacenando las variables en un fichero con el formato TempAÑO_MES_DIA.csv  .
Ejemplo : Temp2019_06_04.csv
Esto se realiza con los comandos en python:
nombreFichero="Temp20"+time.strftime("%y_%m_%d")+".csv"
f = open(nombreFichero,'a')
f.write(time.strftime("%H,%M"))
f.write(',')
f.write(dTemperatura+','+dHumedad+','+dPresion+','+'\n')
f.close()


Como podéis observar cada día se crea automáticamente un fichero de datos.
Formato del fichero de datos metereológicos
00,00,21.6,25,924,
00,01,21.6,25,924,
00,02,21.6,25,924,
00,03,21.6,25,924,
00,04,21.5,25,924,
Lo bueno de este formato es que se puede importar con una hoja de cálculo para su tratamiento.

El programa, cada 41 segundos o cada vez que recibe datos del módulo de sensores, actualiza el fichero  index.html que es el que se representa en la página web.
El código python que se utiliza para crear la página web es el siguiente:
            print "Crear pagina"
            fw = open('index.html','w')

            mensajeWeb = """
<html>
<head>
    <meta http-equiv="refresh" content="115">
    <title>PALENCIA</title>
</head>
<body bgcolor="#ffff99">
<h2>Palencia, Spain
<hr size="2" width="100%">
<img  alt="" src="web.jpg" height="480" width="640"><br>
<hr size="2" width="100%">
"""
            mensajeWeb = mensajeWeb + time.strftime("%d/%m/%y") +"  "+ time.strftime("%H:%M:%S")
            mensajeWeb = mensajeWeb + """<br>"""
            mensajeWeb = mensajeWeb + mensaje
            mensajeWeb = mensajeWeb + """
<h2><a href="gradia.html">GRAFICOS</a><br>
<img  alt="" src="mapa.png" >
</h2>           
</body>
</html>"""

            fw.write(mensajeWeb)
            fw.close()

Como había veces que los navegadores utilizaban la cache, y para que se actualizase cada 2 minutos, añadí en la cabecera del fichero html :  <meta http-equiv="refresh" content="115">
Con lo que obliga al navegador a actualizar automáticamente la página web.
El resultado es el siguiente:


Podéis comprobar el resultado en mi página:
http://seta43.duckdns.org/seta/webcam/index.html
http://seta43.ddns.net/seta/webcam/index.html
El resultado no lo he hecho muy vistoso a propósito, para hacer mas legible el código, el que quiera lo puede mejorar retocando el código html.

Para ejecutar el programa en python he creado un programa en bash llamado app_python.sh que se ejecuta cuando se inicia el ordenador.
app_python.sh
#!/bin/bash
cd /home/seta/www/webcam
xterm -e "python camtem4.py"
He de reconocer que en mi placa OrangePI no consigo que se inicie automáticamente, aunque en el ordenador PC se inicie perfectamente, y mira que lo he revisado, pero nada, lo debo iniciar yo, por lo cual si se va la luz en el servidor, debo lanzarlo yo remotamente.

PROGRAMA


Saludos.
Juan Galaz


Bibliografía:
https://pyserial.readthedocs.io/en/latest/
sento.html
predi.html
raspb.html
arterec.html
tm16tem.html