Archivo de la categoría: Python

Leer temperatura de un sensor DS18B20 con Raspberry Pi

Mediante un sensor DS18B20 podemos obtener una lectura de temperatura fácil y precisa. Este sensor puede ser una gran aliado para nuestro montajes. Este sensor de temperatura utiliza el protocolo de comunicación 1-Wire, lo que nos permite una facil comunicación con el, y la posibilidad de crear un red de sensores, sin tener que ocupar muchos de nuestros pines de entradas y salidad de datos de nuestro Raspberry Pi.

Materiales usados

Raspberry Pi 2 Raspberry Pi 3 Modelo B (1,2 GHz Quad-core ARM Cortex-A53, 1GB RAM, USB 2.0)

Raspberry Pi 2 Model B – Placa base (ARM Quad-Core 900 MHz, 1 GB RAM, 4 x USB, HDMI, RJ-45)

Sensor temperatura DS18B20 DS18B20 con carcasa de acero inoxidable
protoboard Protoboard
cables_union Cables de conexión
Resistencia 4k7 Resistencias varias
RPi GPIO Breakout Pi 2 Model B & B+ RPi GPIO Breakout Pi 2 Model B & B+

Esquema de montaje DS18B20 y Raspberry Pi

El montaje del sensor en un sencillo, la alimentación del sensor lo haremos mediante el pin de 3,3v del conector GPIO (pin 1), al clave rojo del sensor, en mi caso, si utilizamos la versión como un transistor, la conectaremos al pin más a la izquierda. La masa, la sacaremos el pin 6 del GPIO, y lo conectaremos al cable negro, o al pin de la derecha del sensor. La salida de datos la conectaremos al pin 4, al cable amarillo, o al pin del medio del sensor. Para terminar el montaje, tendremos que situar una resistencia de 4K7 Ohm, entre el pin positivo del sensor y el pin de datos.

Esquema de montaje del sensor DS18B20 con un Raspberry Pi

Esquema de montaje del sensor DS18B20 con un Raspberry Pi

El sensor DS18B20, permite conectar varios sensores al mismo canal, es decir, que si queremos añadir más sensores DS18B20 a nuestro circuito, no tendremos que ocupar más pines de datos de nuestra raspberry, colo tendremos que conectar cada uno de los pines del sensor al mismo circuito que el primero.

Ejemplo de montaje de varios sensores DS18B20 a una Raspberry Pi.

Montaje de varios sensores DS18B20 a una Raspberry Pi
Montaje de varios sensores DS18B20 a una Raspberry Pi

 

Comprobando la instalación de los sensores DS18B20

Como todas las comunicaciones que Linux hace con cualquier dispositivo, ya sea puertos serie, USB, comunicaciones I2C, etc. La forma de trabajar la Raspberry Pi con el sensor de temperatura DS18B20 es creando un fichero, donde el sensor escribe los datos devuelto. Esta comunicación la realiza mediante el bus 1-Wire.

Para comprobar que nuestra Raspberry Pi lee todos los sensores que tenemos instalados, solo tendremos que mirar cuantas carpetas con el inicio “28” tenemos dentro del directorio que maneja las comunicaciones con el bus 1-Wire. Cada una de estas carpetas que comienzan por “28” corresponde con el numero de serie del sensor de temperatura.

Cada una de estas carpetas que comienzan por “28” corresponde con el número de serie del sensor de temperatura. Si faltase alguna carpeta, habría que comprobar la conexión de ese sensor.

Lectura del sensor DS18B20 con una Raspberry Pi

Para leer los datos proporcionados por el sensor de temperatura DS18B20 con nuestra Raspberry Pi solo tendremos que acceder a cada una de las carpetas, y leer los datos que hay dentro del fichero “w1-slave”. En este fichero tendremos el valor de la temperatura leída por el sensor * 1000, es decir, para obtener el valor real de la temperatura, dividiremos el valor del parametro “t” / 1000.

Para hacer esto desde Python, haremos los siguiente.

Añadiremos las siguientes librerías, para el manejo de ficheros y directorios del sistema

Cargamos los módulos en el kernel del sistema para manejar el bus 1wire del conector GPIO del Raspberry Pi.

Cargamos la ruta donde se encuentra nuestro sensor.

Con esta linea cargamos el nombre del primer sensor de la lista disponible, para cargar las demás rutas solo tendremos que cambiar “[0]” por la posición deseada.

Lo siguiente que haremos es leer el fichero “w1_slave”, para leer el valor de la temperatura del sensor. Leemos el fichero y cargamos todas las lineas disponibles en una variable.

Una vez que ya tenemos el contenido del fichero, buscamos el parámetro “t” donde esta la temperatura. Una vez que encontramos la temperatura, la multiplicamos por 1000, par obtener el valor real.

Con esto ya tendríamos el valor del sensor, con su valor real, dentro de la variable “temperatura”.

OPC el idioma de los sistemas industriales

La comunicación de los sistemas industriales siempre a sido un tema muy complicado. Cada fabricante de plc’s utilizaba un sistema de comunicación propio, sin ofreces ningún tipo de información a tercera partes para poder realizar productos que pudieran trabajar con el. Esto hacia que el montaje de un sistema fuera complicado, ya que te tenias que basar en los productos que el fabricante elegido te ofrecía.

PROBLEOPC

Pero esto, se terminó con la aparición del sistema OPC, (OLE for Process Control, por sus siglas en ingles) es un sistema creado en un principio por Microsoft para la comunicación de sistemas industriales. En la actualidad este estándar esta gestionado por la fundación OPC Foundation. La aparición de este protocolo ha permitido una comunicación mas fácil entre los sistemas de control, sistemas SCADA, HMI, etc. con los sistemas de control, PLC’s.

SOLUCIOPC

En un principio este estándar se basó en la tecnología de Microsoft, Este, se baso en la tecnologia OLE, que emplea el formato COM/DCOM, que Micorosft desarrolo para el intercambio de innfomarcion entre aplicaciones y sistemas, como es normal, pero con el traspaso de la gestión a la fundación, esta ha impulsado un sistema libre, sin basarse en ninguna tecnología propietaria.

Por eso en la actualidad, con la versión UA, se puede encontrar desarrollos de sistemas OPC para cualquier sistema, ya se Windows, Linux, OsX, etc. Aunque el sistema principal, y el que dispone de un mayor catalogo de productos para el desarrollo sigue siendo Windows. Esto es debido en parte utilización de este sistema por parte de la industria de equipos industriales.

RTEmagicC_oemgatewayproxy_08.png

En la actualidad podemos encontrar librerías para el desarrollo para cualquier sistema, .Net, Python, Java, etc.

 

 

Leer coordenadas de un gps en python

gps-iconLos gps, no los navegados que son otra cosa, suelen devolver la información obtenida mediante el protocolo NMEA. Este protocolo define la información que podemos obtener del gps y como esta sera trasmitida.

Para obtener las coordenadas del gps tenemos que esperar a recibir una la sentencia $–GGA, esta tiene el siguiente formato:

$–GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

Formato:

  • $–GGA: Indica que la información es la posición, hora, e información relacionada con el gps. Los dos guiones (–), pueden ser cualquier cosa, pero normalmente suele ser “GP”, es raro encontrar un gps que cambie esta definición.
  • hhmmss.ss: Hora a la que fue tomada esas coordenadas.
  • 1111.1111: latitud, en formato ggmm.ssss, los segundos en formato decimal. Esta es una de la información que me interesa.
  • a: Esto indica en que hemisferio se ha tomado las coordenadas si en el norte (N) o en el sur (S).
  • yyyyy.yyyy: Longitud, lo mismo que la latitud, pero nos da las coordenadas de la longitud. Tiene el mismo formato.
  • a: Lo mismo que para el hemisferio norte y sur, pero en esta caso indicando “E” para el este y “W” para el oeste.

Los demás campos están relacionados con el numero de satélites, calidad de la señal del GPS, altitud a la que nos encontramos, etc.

El gps que estoy utilizando, es un gps bluetooth, que una vez que lo he enlazado con el ordenador me crea un puerto serie, en mi caso con linux “/dev/rfcomm0”. Una vez que lo tenemos conectado solo tenemos que conectarnos en python utilizando la librería pyserial.

Para pasar el formato de las coordenadas devuelto por el gps, a unas coordenadas normales en el formato ggº mm’ ss.ss” lo he hecho del siguiente modo.

Para separar cada unos de los campos utilizo en comando “split”, pasándole como parámetro “,”. Este nos devuelve cada campo en una posición de una tabla, utilizando la coma como separador.

Los campos que nos interesan, para la conversión de las coordenadas están en la posición 2, latitud y en la 4, longitud. Y los campos 3, para saber si estamos en el norte o en el sur, y el campo 5, para el este o el oeste.

Con esto ya podemos tratar las coordenadas como más nos interés.

Si tienes algún consejo, recomendación o alguna duda utiliza los comentarios.

Como mandar un correo mediante Python

Enviar correo con Python y Gmail
Enviar correos mediante smtplib de python y una cuenta de gmail

En algunas ocasiones necesito enviar los resultados que me devuelve el arduino a mi teléfono para avisarme de alguna anomalía. Lo primero que se le viene a la cabeza a uno es hacer un programa para el móvil para recibir los datos, ahora que se ha puesto de moda hacer “app’s” para todo ( ya no son programas o aplicaciones ahora son “app’s”).

Pero yo no necesito un programa que me este ocupando espacio y memoria en el teléfono para recibir una alerta una vez al mes a lo sumo. Aprovechando que el “android” te pide una dirección de correo para poder acceder a “Google Play” y que además, esta en todo momento mirando el contenido de esa cuenta, lo mas fácil es que el arduino mande un correo a esa cuenta.  Por ello le he implementado una opción al programa que gestiona el arduino para que me mande el correo.

Para poder enviar un correo a través de Python, lenguaje con el que gestiono el arduino,  solo tenemos que hacer uso de la librería “smtplib”, esta librería nos proporciona todas la funciones necesarias para poder enviar el correo.

Lo primero que haremos el importar la función desde la librería.

Una vez que ya podemos utilizar la librería, creamos la variable que gestionara el envío.

Nos conectamos al servidor de correo saliente de gmail, smtp.gmail.com que esta a la escucha en el puerto 587, para utilizar cualquier otro servidor tendremos que cambiar el servidor y el puerto por el que este escuchando.

El servidor de gmail necesita que habilitemos el modo TTL, esto es uno de los métodos de enviar el correo de forma segura, el otro modo seria utilizar SSL.

Esto me ha dado problemas algunas veces, buscando por internet he visto que varia gente utiliza esta forma para activar el TTL.

Lo que hace la función “.ehlo()” es decirle a “EnviarCorreo” que se ponga en modo de enviar un correo. Es decir, ponemos la función en modo de enviar correo, le decimos que vamos ha enviar el correo utilizando TTL, y volvemos a indicarle que se vuelva poner modo de enviar un correo, esta vez, si para enviar el correo.

Antes de enviar el correo, nos identificamos en el servidor de la siguiente forma.

Ahora solo nos queda montar el correo que queremos enviar. Para ello tenemos que crear tanto la cabecera del mensaje, donde ira la dirección de quien lo envía, la dirección de quien lo recibe, el asunto del mensaje, y demás información que podemos incluir en la cabecera, y por ultimo crear el cuerpo del mensaje.

Esta seria una cabecera básica, al final del cuerpo incluimos dos saltos de linea, porque? no lo se aun.

Para crear el cuerpo solo tenemos que pasar el contenido del mensaje a una variable del tipo string.

Como en la cabecera, terminamos el cuerpo del mensaje con dos salto de linea, la explicación no la se todavía.

Y ya tenemos todo listo para enviar el correo.

Y con esto, y si todo esta bien, ya hemos enviado el correo. Ahora solo nos queda cerrar la comunicación con el servidor SMTP.

Y listo, ya hemos mando la alerta a nuestro teléfono móvil, y sin tener que instalar ninguna aplicación nueva y sin tener que hacer nada en el teléfono.

Que te ha parecido?

 

Almacenar el contenido de una pagina html en una variable en Python

wpid-python-thread-exitEn alguna ocasión no interesa guardar el contenido de una pagina en una variable para luego poder procesarla, ya sea para obtener datos relevantes de ella, para indexar su contenido, etc.

Para hacer esto en python solo tenemos que importar la librería “urllib”

Dentro de esta librería podemos encontrar el comando “urlopen”, al que tenemos que pasar como parámetro la url de la pagina que queremos abrir, el comando nos devolverá  una cadena con el contenido de la pagina.

Una vez almacenada la pagina en la variable, ya podemos procesarla como deseemos, utilizando alguna tecnica de “parse” para localizar las etiquetas, buscar la información deseada, etc.

Código completo, y muestra del código fuente de la pagina leída.

Fácil y sencillo como siempre con Python

 

 

Temperatura con Arduino, DHT11 y python (II)

modulo-sensor-de-tempertura-y-humedad-dht11-para-arduino_MEC-O-3277967849_102012Una vez que ya hemos hecho que nuestro arduino nos “hable”, ya solo nos queda “escuchar” lo que nos dice. Para ello vamos a utilizar Python para obtener la temperatura con Arduino.

Lo primero que tenemos que hacer es conectarnos con nuestro arduino (Arduino Uno R3), para ello, lo primero que haremos es descubrir en que puerto esta conectado nuestro arduino, este método esta explicado en un por anterior, así que no me detendré el ello.

Temperatura con Arduino

Una vez que ya sabemos en que puerto esta el arduino, pasamos a leer los datos que nos esta trasmitiendo. para la lectura de estos datos utilizaremos la librería PySerial. como con la búsqueda de puerto del arduino, ya esta explicado en otro post, por lo que tampoco me detendré en ello. Como siga así no explico nada :-).

Bueno, ahora es cuando llega la hora de saber lo que nos dice nuestro arduino. Como ya dije en la otra parte de este post, lo que nos envía el arduino es un registro formateado con los datos que nosotros queremos, por lo que solo tendremos que dividir el registro leído en los diferentes campos en que se compone el registro.

Cuando leamos el registro lo primero que hacemos es comprobar que el registro esta completo. Esto lo hago comprobando que los últimos caracteres del registros son los que establecimos como final de este “|f|” y que la longitud es la que definimos.

Si todo esta bien, pasamos a trocear el registro, si esta mal, pasamos de los datos leídos y volvemos a leer un nuevo registro. Si el sistema fuera para el control de sistemas críticos, este método no nos valdría, debido a la perdida de datos. Para mi caso me sobra, ya que esto va ha controlar la temperatura y humedad de un invernadero.

Para dividir el registro utilizamos el carácter que hemos utilizado en el arduino como separador de campos, en mi caso el carácter “|”, y el numero de campos de que consta nuestro registro, en mi proyecto 2, uno para la temperatura y otro para la humedad (Módulo de Sensor de Humedad Módulo de Temperatura Digital). Y lo guardamos en sus correspondientes variables. El resto del registro lo podemos guardar en una variable temporal, pero hay que pasarle una variable, sino, nos daría error.

Con esto ya tenemos nuestro campos guardados en sus respectivas variables para poder procesarlas como queramos. Y ya esta, hemos escuchado al arduino y sabemos lo que nos esta diciendo.

Este es el proceso completo que he utilizado.

Y esto es todo para obtener la temperatura con Arduino, si tienes alguna duda, o si ves que se puede mejorar, que se puede mejorar y mucho, no te cortes y deja tu comentario.

Temperatura con Arduino, sensor DHT11 y python (I)

modulo-sensor-de-tempertura-y-humedad-dht11-para-arduino_MEC-O-3277967849_102012El sensor DHT11 (Módulo de Sensor de Humedad Módulo de Temperatura Digital), y sus variantes, es uno de los sensores más fáciles de manejar para obtener la temperatura con arduino. Gracias a la librería disponible para el, solo tenemos que pedir la temperatura o la humedad y ya la tenemos, sin hacer ninguna otra operación.

Materiales usados

Arduino UNO Arduino UNO
 Sensor DHT 11 Sensor DHT11
protoboard Protoboard
cables_union Cables de conexión

Sensor DHT11

Para conectarlo al arduino es muy sencillo, alimentamos el pin vcc, primero por la izquierda, con 5v desde unos de los pines del arduino, conectamos la masa al más a la derecha, y desde un pin analogico del arduino al 2 pin del sensor, empezando por la izquierda, el 3 pin no hay que conectarlo a nada.

Montaje de un sensor DHT11 en una placa Arduino UNO
Montaje de un sensor DHT11 en una placa Arduino UNO

El código como he dicho antes es muy fácil gracias a la librería existente, solo tenemos que inicializar una variable que nos permita manejar en sensor y poco mas.

Importamos la libreria

Inicializamos la variable para manejar el sensor DHT11

Ahora solo tenemos que leer los datos del sensor DHT11 tanto de temperatura como de humedad de la siguiente forma

y con esto ya tendríamos tanto el % de la humedad con los grados de temperatura en la escala Celsius.

Pero ahora me queda mandar la información por el puerto serie para luego poderla leer en python.

Para esto creo un registro de 30 caracteres formateado, donde incluyo los dos valores leídos, una cadena variable de caracteres para ajustar la longitud del registro, un carácter separador de los campos “|”  y un campo “|f|” indicando que es el final del registro. quedando de la siguiente forma

HH|TT|XXXXXXXXXXXXXXXXXXXXX|f|

  1. HH seria el valor de la humedad, puede ser 1 0 2 caracteres dependiendo de la humedad que haya.
  2. TT valor de la temperatura, como la humedad el tamaño de este campo puede ser de 1 o 2 caracteres.
  3. X cadena variable, que dependiendo de la longitud de humedad o temperatura puede variar su longitud.
  4. |f| indica que es el final del registro. Para comprobar luego mediante python, que hemos leído correctamente la información enviada.

Si queremos enviar mas información solo tenemos que añadirla incluyendo los separadores. El tamaño del registro lo he establecido en 30 caracteres pero lo podemos variar cambiando la configuración del programa.

Y el código seria el siguiente

Y con esto ya hemos leído la temperatura y la humedad desde el sensor DHT11 (Módulo de Sensor de Humedad Módulo de Temperatura Digital), y enviada al puerto serie para ser leída por nuestro programa en python.

Código completo.

Y con eso terminamos la primera entrega. en la segunda, la lectura de los datos en Python.

Manejos de hilos (Threads) en python

wpid-python-thread-exitLos hilos o threads ( en ingles) nos permite realizar varias tareas a la vez sin tener que parar la ejecución del hilo principal que llamo a esa tarea. Para poder utilizar los hilos en python, lo primero que tenemos que hacer es añadir la librería que contiene las funciones de manejos de hilos.

Lo siguiente es crear la función que queremos que se ejecute ala llamar al hilo. Esto lo podemos hacer de dos maneras creando una nueva clase, o creando una simple función. Lo más habitual es utilizar las clases, por la flexibilidad que nos da. Las funciones las podemos utilizar para hilos que vamos a llamar utilizando un retardo.

Implantación de hilos mediante clases

La clase esta compuerta por varias secciones, Inicio, ejecución, y otras funciones.

Para definir una clase utilizamos el método “class”  seguido del nombre que queramos identificar a la clase y entre paréntesis el tipo de clase, en este caso “threading.Thread”

Lo siguiente es definir la función de inicio, en esta función definiremos los objetos, variables, etc. que se van ha utilizar globalmente en la clase, solo serán globales dentro de la clase donde se han declarado.

Después de inicializar todas las variables y funciones de la clase, definimos la función “Run” que contiene el código que queremos que se ejecute.

El hilo se ejecutara hasta que termine la ejecución del código que este en esta función.

Con esto ya tememos definido lo básico que necesitamos para que nuestra clase se ejecute.

Para llamar ha esta clase lo  haremos de la siguiente manera.

Y con esto tenemos nuestro hilo funcionando.

Enviar SMS con Python y la libreria PySerial

Mandar un SMS con Python
Mandar un SMS con Python

Algunos módem usb permiten recibir ordenes mediante comandos AT, con estos comandos podemos hacer muchas cosas. Hace años, muchos años, estos comandos los utilizábamos para configurar centralitas, realizar llamadas, obtener información del aparato, etc. Ahora esta técnica esta en desuso, pero aun así, algunos módems están preparados todavía para poderse programar con estos comandos.

Aprovechando la librería PySerial y python he creado un programa para cuando lee ciertos valores desde el arduino me los mande por SMS a mi móvil.

Para empezar con el programa tenemos que saber cual es el puerto serie del módem, en mi caso cuando pincho el módem usb al ordenador me crea tres puertos /dev/ttyUSB0, /dev/ttyUSB1 y /dev/ttyUSB2, para windows no tengo ni idea que hace.

Una vez que sabemos los puertos del módem, tenemos que saber cual de ellos es el que responde a los comandos AT. Para saber que puerto responde a los comandos hice este programa

Con este programa, lo que hacemos es abrir el puerto correspondiente, y le enviamos el comando “AT”. Si el módem sabe que es lo que le estoy enviando nos devolverá “OK”, en caso contrario “ERRROR”, o saltara la excepción del programa.

También lo podemos probar con un programa de terminal, como el “Serial port Terminal” o el “minicom” en Linux, o con el “Hiperterminal” en windows. Solo tenemos que abrir el puerto a probar y escribir “AT” y esperar la respuesta

Así con todos los puertos disponibles, en mi caso me admitió peticiones por los puertos /dev/ttyUSB1 y /dev/ttyUSB2.

Una vez que sabes el puerto, podes probar ha enviar un SMS de la siguiente forma.

Y con esto ya podemos mandar SMS desde python, esta un poco chapucero, pero para lo hace y lo que he tardado en el, sobra la mitad.

Ya solo nos queda leer los datos del arduino y mandar el SMS.

Como descubrir el puerto arduino con Python

[singlepic id=20 w=320 h=240 float=right]Cuando desconecto y vuelvo a conectar el Arduino (Arduino Uno R3), el Ubuntu dependiendo si se ha enterado o no que lo he desconectado, al volver a conectarlo me lo instala en otro puerto, con lo que tengo que decirle al programa cual es el nuevo puerto. Para solucionar esto y aprovechando la librería PySerial y la función “try”, podemos descubrir donde esta instalado el puerto Arduino. Para ello solo tenemos que probar los puertos que posiblemente pueda estar utilizando el Arduino. Si al intentar abrir el puerto arduino nos da error, eso es que el Arduino no esta instalado en ese puerto. Gracias a la función “try”, controlamos ese error que se ha producido y podemos seguir con el funcionamiento normal de nuestro programa. Cuando al abrir el puerto no nos da error, eso quiere decir que en ese puerto hay algún dispositivo instalado. si solo tenemos el Arduino instalado ya tendremos el puerto Arduino y podemos salir del bucle y guardar el puerto.

Descubrir el puerto arduino

Código de ejemplo en Python:

Aunque este código es de Python, el portarlo a cualquier otro lenguaje es muy sencillo, por lo básico de su planteamiento, lo único que podrida complicar el código seria las funciones que se tengan que utilizar para la apertura del puerto serie, por lo demás, el resto de funciones están disponibles en cualquier lenguaje.