Mostrando entradas con la etiqueta Python. Mostrar todas las entradas
Mostrando entradas con la etiqueta Python. Mostrar todas las entradas

lunes, 12 de diciembre de 2022

Comunicación serie entre PC y Arduino, programación python.

  Página principal

Arduino
Python (PC) -> Arduino
Arduino -> Python (PC)
Comunicación serie

Aunque python no es mi lenguaje favorito, he de reconocer que es fácil realizar programas por la gran multitud de comunidad que está detrás.
El entorno de programación es Linux sobre la distribución Debian 11.

Para hacer uso de la comunicación serie, lo primero es descargar la librería serie de python.
    apt install python3
    apt install python3-pip
    pip3 install pyserial

Para la primera prueba creamos un programa en el IDE del arduino que transmita los datos del LDR al PC.





El programa es simple, al iniciar manda una clave par identificarse en la comunicación serie.
En un bucle continuo se mandan los datos cada minuto, con una secuencia numérica.

En la parte del PC, programación python, se busca entre todos los puertos serie, un dispositivo que mande la clave identificativa.
Una vez encontrado el dispositivo, empieza la lectura del puerto serie.
Cuando encuentra los comando apropiados los almacena.
En el momento que aparece el comando FINAL , se imprime todas las variables acumuladas.
He creado dos interfaces para el terminal, uno en blanco y negro y otro en color.



 También he añadido una barra a modo de gráfica , para mostrar el valor de la LDR.

Como segunda parte del proyecto , creo una comunicación desde el PC hacia el arduino.
En este caso enciendo dos LED colocados en los pins D2 y D3, cuando se pulsan las teclas 2 y 3 respectivamente.
Para este caso mando las ordenes D2on o D2off a través del puerto serie.
Interpretadas por el arduino encienden o apagan el LED colocado en el pin D2.



PROGRAMA1.     .PROGRAMA2

VIDEO DEL FUNCIONAMIENTO

Espero que este montaje os haya parecido interesante.


Saludos.
Juan Galaz



Bibliografía:

https://python-para-impacientes.blogspot.com/2016/09/dar-color-las-salidas-en-la-consola.html

martes, 11 de junio de 2019

Gráficas de datos metereológicos. Python. Generar página web.

Página principal

Gráficas de datos metereológicos.
Python.
Generar página web.


Continuamos con la serie de artículos sobre servidor web.
En el último artículo había creado un visualizador de temperatura, humedad y presión. Además de visualizar los datos, creaba un registro diario de los datos.
El archivo de los datos está bien, pero su visualización e interpretación es poco útil si no se ven los datos gráficamente.
En este artículo se representan los datos en dos gráficas, una de temperaturas por horas, y en la otra la representación de humedad y temperatura en función de la hora.
Aunque no soy muy partidario del lenguaje python, he de reconocer que se hace muy fácil trabajar con el debido a la gran cantidad de librerías que existen para casi cualquier cosa.
Para este programa hacemos uso de la librería matplotlib. Esta librería se emplea para hacer todo tipo de gráficas. La librería está muy extendida, además de disponer de mucha documentación y una excelente página web.
Con esta librería creamos las gráficas anteriormente mencionadas, para luego exportarlas como imágenes con formato  *.png. Las imágenes creadas será luego las que se visualizaran en la página web.

Lo primero que debemos hacer para crear una gráfica es tener los datos, estos datos los obtenemos del fichero diario con el nombre:
"Temp"+ time.strftime("%y_%m_%d")+".cvs"
Creamos una matriz donde se almacenan todos los datos de temperatura, humedad y presión, donde se ordenan por horas y minutos.
Debo de anotar que crear matrices en python es un poco peculiar, no existe la creación de matrices como en otros lenguajes, debemos crearlas añadiendo datos, es de lo mas frustrante, aunque tiene otras ventajas este lenguaje.

Crear una gráfica de cada minuto de las 24 horas del día es innecesario, lo he reducido a 10 datos cada hora, o lo que es lo mismo cada 6 minutos.
Creo otras listas con los datos que realmente voy a utilizar para la gráfica. En total serán 10 muestras por hora, y como son 24 horas, el total de datos representados serán 240.
Las listas de datos son la siguientes:
    listaTemp , listaHume, listaPres
Estas son las lista de datos que voy a proporcionar a la librería  matplotlib para que cree las gráficas.


Código de creación de la gráfica de temperatura.
fig = plt.figure()                                                              
ax = fig.add_subplot(1,1,1)
major_ticks = np.arange(0, 240, 30)                                             
ax.set_xticks(major_ticks)
ax.grid(which='major', alpha=1)

plt.xlabel("Temperatura DIA "+ time.strftime("%d_%m_20%y"))
plt.plot(listaTemp,color='red')
plt.xlim(0,240)
plt.ion()

my_dpi=75
plt.savefig("gra2.png",dpi=my_dpi)


Código de creación de la doble gráfica de humedad y presión.
fig, (ax1, ax2) = plt.subplots(2, sharex=True,)

plt.xlim(0,240)
ax1.plot(listaHume,color='blue')
ax1.set(ylabel='Humedad %')

plt.xlim(0,240)
ax2.plot(listaPres,color='green')
plt.setp(ax2.get_xticklabels(), fontsize=9)

major_ticks = np.arange(0, 240, 30)                                             
ax2.set_xticks(major_ticks)

ax2.set(ylabel='Bares')
plt.xlabel("HORA "+time.strftime("%H:%M"))

my_dpi=75
plt.savefig("gra1.png",dpi=my_dpi)

En las siguientes imágenes se pueden ver los gráficos creados.


  Gráficas pertenecientes a Palencia, ESPAÑA

Se puede estudiar las gráficas y observar el cambio de presión preludio de lluvia.
Después de la lluvia observamos también como aumenta la humedad en el ambiente.
Estas dos imágenes son las que se incorporan en la página web para hacer mucho mas intuitiva el estudio de los datos.

Para ejecutar el programa en python he creado un programa en bash llamado gratem.sh que se ejecuta cuando se inicia el ordenador.
gratem.sh
#!/bin/bash
echo "GENERANDO GRAFICOS"
cd $HOME/www/webcam
$HOME/www/webcam/gratem.py
Ya tenemos el script creado, pero nos falta que el script se ejecute cada 10 minutos.
Para esta tarea utilizaremos cron.  El comando cron es un administrador regular de procesos en segundo plano que viene de serie en linux.
Para añadir el comando que se debe ejecutar en segundo plano, utilizaremos el comando crontab -e  .
Editaremos de la siguiente forma:

    */10 * * * * /home/seta/www/webcam/gratem.sh > $HOME/tmp/cron.log 2>&1

De esta forma el script  de generación de gráficas se ejecutará cada 10 minutos.

Podéis comprobar el resultado en mi página:
http://seta43.duckdns.org/seta/webcam/gradia.html
http://seta43.ddns.net/seta/webcam/gradia.html
Espero que os guste este artículo, y que os sirva para vuestros proyectos.

PROGRAMAS

Saludos
Juan Galaz

Bibliografía:
https://matplotlib.org/index.html
https://claudiovz.github.io/scipy-lecture-notes-ES/intro/matplotlib/matplotlib.html
https://github.com/japp/Computacion-Cientifica/blob/master/graficos.rst



miércoles, 5 de junio de 2019

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

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

lunes, 29 de abril de 2019

Sensores 18B20 LDR BMP180 DHT22, Arduino - Gambas - Python

Página principal


Sensores

18B20 LDR BMP180 DHT22

Arduino - Gambas - Python


Debía realizar un circuito electrónico para añadir a una página web donde indicara la temperatura ambiente.
La idea era solo colocar un sensor de temperatura 18B20, pero se me ocurrió añadir mas sensores.
En este circuito coloco varios sensores:
-18B20 sensor de temperatura.
-LDR sensor de luz.
-BMP180 sensor de presión y temperatura.
-DHT220 sensor de temperatura y humedad. (he utilizado el equivalente AM2302)


Todos los datos de estos sensores se transmiten al PC mediante el terminal serie.

Circuito montado.


Circuito.

Para la representación de los datos he utilizado dos programas.
El primero está realizado en Gambas (VB para linux).
El segundo realizado en Python.
En ambos programas busca la placa de sensores dentro de todos los posibles puertos serie.
Si encuentra el módulo de sensores los representa en pantalla.
Toda la programación se ha realizado en el entorno Linux con la distribución Debian 9.
La información de sensores se manda cada 5 segundos.
Su transformación para que funcionase en Windows en el caso de Phyton es fácil, solo cambiar la lista de dispositivos serie.

Programa Gambas (VB para linux).


Programa Phyton.

El montaje es perfecto para probar sensores.
Si no tenéis alguno de los sensores, deberéis anular el código correspondiente al sensor en el programa del arduino.

PROGRAMAS

VIDEO





Saludos.
Juan Galaz


Bibliografía:
predi.html
raspb.html
arterec.html
tm16tem.html