Con este artículo se pretende ofrecer una guía de iniciación al lenguaje de programación Python, utilizando ejemplos que serán ejecutados en una Raspberry Pi a la que se va a conectas la expansión de sensores Sense HAT. Con estos componentes se podrán realizar ejemplos con cierta utilidad práctica aplicables al mundo real.

Raspberry Pi 3 462x322 847a4sensehat 0d927

Recursos utilizados

Estos han sido los elementos utilizados para la elaboración de esta guía. En caso de que utilices otros elementos, o cuya versión sea diferente, algunas indicaciones podrían variar.

Si no dispones de estos recursos también puedes utilizar el emulador para navegador web de Sense HAT de Trinket.

La instalación y configuración del sistema operativo Raspbian en la Raspberry no se contemplan en esta guía. En el artículo DOCUMENTATION > RASPBIAN de la web de Raspberry puedes encontrar información sobre su instalación si la necesitaras. Para la utilización de la placa Sense HAT se requiere tener instalado en el sistema operativo el paquete de software correspondiente, si no se ha realizado anteriormente. Si fuera necesario en tu caso, puede ver cómo hacerlo en la primera parte del artículo DOCUMENTATION > HARDWARE > SENSE-HAT de la web de Raspberry.

Obtener y mostrar por consola la temperatura ambiente

El primer ejemplo que vas a desarrollar va a obtener la temperatura ambiente desde la Sense HAT, gracias a al sensor de humedad que incorpora, que también permite obtener la temperatura.

La tarjeta de expasión Sense HAT para la Raspberry Pi dispone de los siguientes sensores y elementos: Giroscopio, acelerómetro, magnetómetro, sensor de humedad y temperatura, presión atmosférica, joystick y matriz de leds RGB 8x8.

Veamos cómo puede ser el código fuente más sencillo que puedes utilizar para obtener la temperatura y el resultado obtenido, para ver a continuación paso a paso cómo puedes conseguir ese resultado, y conocerás con más detalle el significado de cada elemento que se ha añadido a este código fuente:

from sense_hat import SenseHat
print(SenseHat().get_temperature_from_humidity())

Captura ea00f 

Abrir la consola de Raspberry Pi

El primer paso será conectarte desde tu PC a la consola de la Raspberry Pi (dando por hecho que ya está correctamente configurada y conectada a la misma red que tu PC). Usando un cliente SSH (Putty desde Windows o el Terminal desde Linux o Mac) podrás conectarte remotamente a la consola de la Raspberry Pi.

En el artículo DOCUMENTATION > REMOTE-ACCESS > IP-ADDRESS de la web de Raspberry puedes encontrar más información sobre la conexión a la Raspberry Pi a través de SSH.

 Para ello necesitará conocer su dirección IP y tener una cuenta de usuario en el sistema operativo que esté instalado en la Raspberry Pi.

En Raspbian, el usuario que se crea por defecto es pi, con la contraseña raspberry.

Captura 193c9

Captura 593dc

Editar el código fuente

Abre el editor de textos nano indicando a continuación el nombre del archivo a editar, por ejemplo, temperatura.py:

A los archivos que contienen código fuente escrito en Python se les suele indicar la extensión .py

nano temperatura.py

Captura aa246

El editor de textos nano es una aplicación para consola que suelen traer incorporado la mayoría de las distribuciones Linux como la Raspbian que estamos utilizando. En el artículo Tutorial del Editor de Texto Nano puedes encontrar más información sobre su uso.

Copia el código fuente para este ejemplo:

from sense_hat import SenseHat
sense = SenseHat() print(sense.get_temperature_from_humidity())

Captura f8d2c

Cierra el editor nano usando la combinación de teclas Ctrl+X y responde afirmativamente a la pregunta sobre si deseas guardar los cambios.

Ejecutar la aplicación Python

El script de Python que has creado en el archivo temperatura.py puede ser ejecutado realizando una llamada al intérprete de Python desde la consola indicando detrás el nombre del archivo a ejecutar. Raspbian incorpora de serie el intérprete de Python para las versiones 2 y 3 de este lenguaje. Para ejecutar el intérprete de Python 2 debes indicar la orden python y para la versión 3 la orden es python3. Se recomienda utilizar la última versión disponible siempre que sea posible, por lo que puedes realizar la ejecución de la aplicación desde la consola de Raspberry Pi con la orden:

python3 temperatura.py

 Captura ea00f

Aunque lo más frecuente es ejecutar el código fuente que se encuentre almacenado en un archivo, las instrucciones de Python también pueden indicarse directamente desde dentro del intérprete. Si en algún momento deseas probar una serie de instrucciones Python sin almacenarlas en un archivo, ejecuta el intérprete sin indicar ningún nombre de archivo y escribe detrás del indicador >>> la línea de código que desees ejecutar. Prueba a ejecutar el mismo código que antes, indicando las 2 sentencias de nuestro ejemplo y termina con exit() o pulsando la combinación de teclas Ctrl+z:

Captura 9117c 

Python es un lenguaje de programación de código abiertofácil de aprender y de propósito general, es decir, con el que se pueden crear aplicaciones para diferentes ámbitos como páginas web, juegos, aplicaciones de escritorio con uso de bases de datos, robótica, aprendizaje automático de máquinasminería de datos, etc. En esta guía se está utilizando para obtener datos desde la tarjeta Sense HAT.

Permite crear aplicaciones para diferentes sistemas operativos (multiplataforma). En este caso se está utilizando sobre el sistema operativo Raspbian, que es una distribución Linux para Raspberry, pero se pueden crear aplicaciones para Windows, Mac, etc, con un interfaz de usuario en modo texto, como el del ejemplo, o en modo gráfico con ventanas como es habitual en muchas aplicaciones de escritorio.

Es un lenguaje interpretado, por lo que se necesita tener instalado un intérprete de Python en el sistema donde se desee ejecutar una aplicación escrita en este lenguaje. En el caso de esta guía, como ya se ha comentado, el intérprete de Python ya viene preinstalado por defecto en el sistema Raspbian. Si, por ejemplo, deseas ejecutar una aplicación Python en Windows, deberás instalar el intérprete de Python para Windows que puedes descargar libremente desde su web oficial www.python.org. Al ejecutar el intérprete con un archivo que contenga código Python, se irán ejecutando secuencialmente cada una de las sentencias que formen el código fuente de la aplicación. Por lo tanto, para ejecutar la aplicación necesitamos tener su código fuente. Existen herramientas externas que permiten compilar un código fuente de Python para un determinado sistema operativo, y de esa manera, se podría ejecutar la aplicación sin necesitar el intérprete.

Mostrar un mensaje informativo

Como ya irás conociendo, Python ofrece una serie de funciones predefinidas para realizar las acciones más habituales. Por tanto Python se considera que es un lenguaje funcional

Funciones y parámetros

Las funciones son acciones predefinidas que pueden ser ejecutadas realizando una llamada. La llamada a una función se realiza indicando el nombre de la función seguido, entre paréntesis, de los parámetros que necesite. Los parámetros son los valores que se deben indicar a la función para que ésta realice su acción según esos valores. 

Función y parámetro 1ea5f

Para conocer qué parámetros se deben indicar en la llamada a una determinada función, hay que consultar la documentación de dicha función. Puedes conocer las funciones internas de Python en en artículo Built-in Functions. Además de las funciones internas del lenguaje, el programador puede diseñar sus propias funciones.

Captura 61308

Función print

Una de las funciones más importantes es el caso de la función print que has usado antes. La función print de Python permite mostrar en la consola un determinado valor que se indique por parámetro. En el caso de que se indique un valor literal de tipo cadena de caracteres, se deberá indicar entre comillas (simples o dobles).

Para el ejemplo que tenemos entre manos vamos a añadir un texto antes de mostrar la temperatura, para informar de qué dato se está presentando:

from sense_hat import SenseHat
sense = SenseHat() print("Temperatura actual: ") print(sense.get_temperature_from_humidity())

Ahora el resultado de la ejecución debe ser:

Captura c22a8

Observa que cada vez que se usa la función print se muestra el contenido del parámetro en una nueva línea.

Redondear el valor de la temperatura

Como has podido apreciar en los resultados obtenidos hasta ahora, el valor de la temperatura puede aparecer con bastante decimales. Con el fin de facilitar la lectura de la temperatura, vamos a modificar el código para eliminarlos o mostrar menos decimales.

from sense_hat import SenseHat
sense = SenseHat() print("Temperatura actual: ") temperatura = sense.get_temperature_from_humidity() temperaturaRedondeo = round(temperatura) print(temperaturaRedondeo)

Captura 83dd1 

Declaración de variables

Ahora en el código se han creado 2 variables (temperatura y temperaturaRedondeo). Como en la mayoría de los lenguajes de programación, en Python se pueden utilizar variables que almacenen un determinado dato, de manera que posteriormente pueda ser utilizado su contenido para realizar cualquier operación que sea compatible con el tipo de dato que almacena.

Para crear una variable que contenga un valor, tan sólo hay que especificar el nombre que se desee para la variable, seguido del signo igual (=) y del valor que se desee almacenar.

nombreVariable = valor

De esa forma, a la variable temperatura se le ha asignado el valor obtenido desde el termómetro de la Sense HAT, y en la variable tempeaturaRedondeo se ha guardado el valor retornado por la función round que se encarga de redondear el valor que se le pase como parámetro.

Nombres de variables

  • Deben ser nombres significativos, de manera que al leer su nombre se pueda suponer a qué hace referencia el dato que contiene.
  • Se diferencian las mayúsculas y minúsculas. Es decir mensaje y Mensaje son 2 variables diferentes.
  • Por convenio, se recomienda emplear letras minúsculas, y separar las palabras empezando en mayúsculas. Es menos frecuente, pero también se puede usar el guión bajo (_) para separar palabras.
  • No se pueden usar espacios ni otros caracteres especiales que sean operadores del lenguaje. como +, -, *, /, %, etc.
  • No puede empezar por dígitos numéricos, aunque sí puede contenerlos en cualquier otra posición.
  • No se puede usar ninguna de las palabras reservadas del lenguaje:

Captura 2ea0e

Observa que si indicas un nombre de variable incorrecto se produce un error invalid sintax al intentar ejecutar la aplicación. Prueba, por ejemplo, a separar con un espacio el nombre de la variable temperaturaRedondeo:

Captura 98e29

Uso de variables

Una vez que una variable ha sido creada almacenando un determinado valor, puede ser usada de igual manera que lo harías con el valor que contiene, escribiendo en este caso el nombre de la variable en lugar del dato que contiene.

En el ejemplo anterior se ha utilizado el nombre de la variable temperaturaRedondeo como parámetro de la función print para mostrar en la consola el valor que contiene dicha variable.

print(temperaturaRedondeo)

Las variables que hemos utilizado van a almacenar valores numéricos, pero pueden almacenar cualquier tipo de dato, por lo que podríamos crear otra variable para almacenar el mensaje de texto, para luego usarla con la función print:

mensaje = "Temperatura actual: "
print(mensaje)

En caso de que utilices un nombre de variable que no ha sido declaradado previamente con un valor, obtendrás un error con el mensaje NameError. Prueba a intentar mostrar en alguna parte del código una nueva variable:

print(variableDesconocida)

Al intentar ejecutar esa orden se obtendrá el siguiente mensaje de error:

Captura eba5e

Función round

En el ejemplo anterior se ha usado también la función round que es otra de las funciones internas del lenguaje Python. Esta función permite redondear un valor numérico con decimales, para eliminar o recortar el número de decimales que contiene dicho valor.

En la documentación de la función se puede ver su modo de uso.

Captura ceeff

Ahí se indica que debe indicarse como parámetro el valor (number) que se desea redondear. Además nos informa que la función retorna (Return) el valor de number redondeado.

Retorno de funciones

Algunas funciones permiten obtener un determinado valor como resultado de su ejecución, como es el caso de la función round, que retorna el valor redondeado. En cambio, la función print no retorna nada, simplemente se encarga de mostrar en consola lo que se le indique por parámetro sin que nos retorne ningún valor.

Para conocer si una función retorna o no un valor, se debe consultar su documentación, donde se explicará qué valor retorna. En la documentación de la función round se puede leer: Return number rounded to ndigits precision after the decimal point (retorna el número redondeado a una precisión de ndigits después del punto decimal).

El valor retornado por una función se puede usar directamente usando la llamada a la función como si se tratara del valor que retorna. Por tanto se puede usar como parámetro dentro de una función como print:

print(round(4.9))

O bien asignarlo a una variable que sea utilizada posteriormente:

valorRedondeado = round(4.9)
print(valorRedondeado)

También se puede usar dentro de una expresión aritmética:

valorSubido = round(4.9) + 1.5

Y de cualquier otro modo, siempre pensando que la llamada a la función equivale al valor que retorna.

Mostrar temperatura con algunos decimales  

Con el código fuente empleado hasta ahora, la temperatura se muestra sin decimales, aunque recordarás que antes de que se usara la función round se mostraba con una buena cantidad de decimales. Quizá nos interese un término medio, es decir, que se muestre, por ejemplo, 1 decimal. Para eso podemos emplear el siguiente código:

from sense_hat import SenseHat
sense = SenseHat() mensaje = "Temperatura actual: " print(mensaje) temperatura = sense.get_temperature_from_humidity() temperaturaRedondeo = round(temperatura, 1) print(temperaturaRedondeo)

Observa que se ha añadido un nuevo parámetro en la llamada a la función round.

Funciones con parámetros opcionales

En la documentación de la función round, el formato de uso se mostraba así:

round(number[, ndigits])

El segundo parámetro aparece entre corchetes, lo que nos indica que ese parámetro es opcional. Según se puede leer en la documentación, si se asigna un valor a ese parámetro, el redondeo se obtendrá con el número de decimales que ahí se indique.

En el ejemplo se ha asignado al segundo parámetro de la llamada a la función round el valor 1. El resultado obtenido será similar al siguiente:

Captura ede93

Mostrar el resultado en una misma línea

Hasta ahora el resultado obtenido al ejecutar la aplicación aparece en dos líneas, una para el mensaje y otra para el valor de la temperatura, ya que hemos realizado dos llamadas a la función print. Si deseamos obtener el resultado en una única linea, habrá que usar una sola vez la función print uniendo el texto del mensaje con la temperatura.

Captura b5da6

from sense_hat import SenseHat

sense = SenseHat() mensaje = "Temperatura actual: " temperatura = sense.get_temperature_from_humidity() temperaturaRedondeo = round(temperatura, 1)
print(mensaje + str(temperaturaRedondeo) + " ºC")

Operador concatenar o sumar (+)

Para usar una única vez la función print de manera que muestre varios datos concatenados se ha usado el operador +. Este operador permite unir 2 cadenas de caracteres obteniéndose como resultado una única cadena de caracteres contenido la unión de ambas.

También se podría usar la función print indicando el parámetro end, asignándole una cadena vacía. De esta manera se está informando a la función print que al final del mensaje no añada nada, ni siquiera el salto de línea:
print(mensaje, end="")

El resultado de "Hola " + "mundo" sería "Hola mundo". Observa que se ha especificado el espacio detrás de Hola para que se queden separadas.

Debes tener en cuenta que este operador + también se usa para sumar cuando sus operandos son valores numéricos. Por ejemplo:

resultado = 5 + 3.2
print(resultado)

Mostraría 8.2 y no 5 + 3.2

En cambio:

resultado = "5" + "3.2"
print(resultado)

Esto mostraría 5 + 3.2 en vez del resultado de la suma, porque los operandos son cadenas de caracteres aunque estén formados de dígitos numéricos.

En el ejemplo de la temperatura, queríamos concatenar el mensaje con el valor de la temperatura. Ten en cuenta que el mensaje es una cadena de caracteres (string), mientras que el valor de la temperatura es una valor numérico con decimales (float), por lo que si intentas concatenarlo obtienes el siguiente error:

print(mensaje + temperaturaRedondeo)

 Captura 40d62

El mensaje de error indica: TypeError: Can't convert 'float' object to str implicitly (no se puede convertir el objeto float a str)

Función str

Para solucionar ese problema se ha usado la función str, que permite convertir un valor numérico a la cadena de caracteres correspondiente. A la función str se le debe indicar como parámetro el valor numérico a convertir, y retorna la cadena de caracteres formada por la secuencia de dígitos numéricos del valor. Por ejemplo:

numero = 238.28
texto = str(numero)

La variable numero contiene el valor 238.28 (de tipo float), mientras que la variable texto contiene el valor "238.28" (de tipo string). Es decir, con la variable numero se podrían hacer operaciones aritméticas (sumar, restar, etc), mientras que con la variable texto no se podría.

En el ejemplo se ha usado de la siguiente manera:

print(mensaje + str(temperaturaRedondeo) + " ºC")

Añadiendo la unidad de medida (grados Celsius) al final de toda la cadena para mejorar la estética del resultado.

Más utilidades de Sense HAT

La primera línea de código que se ha escrito para el ejemplo de la temperatura es la siguiente:

from sense_hat import SenseHat

Con ella, se están ampliando las funcionalidades del lenguaje Python para que no sólo se puedan usar las funciones internas propias del lenguaje (como las que ya conoces: print, round, str, etc)

Módulos Python

Existe una gran cantidad de módulos creados por distintos desarrolladores que permiten ampliar el lenguaje Python. Para usar esos módulos, previamente se han tenido que descargar los archivos correspondientes y en el código fuente de nuestra aplicación se debe indicar la sentencia import.

Para poder usar la tarjeta Sense HAT desde Python se ha descargado (la instalación no está contemplada en esta guía) en el sistema Raspbian el paquete sense-hat con la orden:

sudo apt-get install sense-hat

Al indicar el import en el código fuente de Python podremos usar los recursos que ofrece la clase de Python SenseHat.

Crear objeto de la clase SenseHat

La funcionalidad de la tarjeta Sense HAT está implementada como una clase de Python con el nombre SenseHat. Para poder aprovechar los recursos que ofrece esa clase se debe crear previamente un objeto (también llamado instancia) de esa clase. Eso se consigue indicando el nombre de la clase seguido de paréntesis:

SenseHat()

 La llamada a esta función retorna un objeto de la clase SenseHat, por lo que es conveniente almacenarlo en una variable para poder hacer uso de él posteriormente:

sense = SenseHat()

Por tanto, ahora la variable sense contiene un objeto de la clase SenseHat.

El lenguaje de programación Python, además de permitir el uso de funciones, incluye el uso de clases y objetos, por lo que además de ser un lenguaje funcional, Python también se considera un lenguaje orientado a objetos.

El objeto sense que se acaba de crear puede ser utilizado para llamar a los distintos métodos que ofrece la clase SenseHat y a sus propiedades. Con esto conseguiremos acceder a todas las funcionalidades que ofrece la tarjeta de expansión Sense HAT.

Llamada a métodos de la clase SenseHat

Ya hemos usado la llamada al método get_temperature_from_humidity que, como hemos visto, retorna la temperatura actual.

Para llamar a un método, un objeto de la clase debe preceder al nombre del método, separados con un punto (.):

sense.get_temperature_from_humidity()

En el artículo Sense HAT API Reference puedes encontrar todos los métodos que ofrece la clase SenseHat. Generalmente, las clases desarrolladas para cualquier lenguaje de programación orientado a objetos incluyen una API con información sobre los métodos y propiedades que pueden utilizarse.

Para el método get_temperature_from_humidity se ofrece la siguiente información:

Captura 40afd

Informa que este método obtiene la temperatura en grados Celsius desde el sensor de humedad, que retorna un valor de tipo Float con dicha temperatura, y añade un pequeño ejemplo de uso. En nuestro caso, la línea había quedado como:

temperatura = sense.get_temperature_from_humidity()

Obtener y mostrar la presión atmosférica

Vamos a probar una nueva funcionalidad del Sense HAT, mostrando en esta ocasión la presión atmosférica. Para ello habrá que buscar en la API de la clase SenseHat algún método que nos permita obtener ese valor. Se puede encontrar el método get_pressure:

Captura 30bb6

Para hacer la llamada a este método se puede usar el mismo objeto de la clase SenseHat que ya se había creado antes, aprovechando de esa manera los recursos del sistema.

from sense_hat import SenseHat

sense = SenseHat()
mensaje = "Temperatura actual: "
temperatura = sense.get_temperature_from_humidity()
temperaturaRedondeo = round(temperatura, 1)

print(mensaje + str(temperaturaRedondeo) + " ºC")

pressure = sense.get_pressure()
print("Pressure: %s Millibars" % pressure)

Comentarios

Poco a poco el código fuente va creciendo, y llegará el momento en que no quede clara la funcionalidad de cada parte del código, especialmente cuando pase un tiempo sin recordarlo, o bien cuando tenemos que revisar un código fuente creado por otra persona.

Por eso es importante introducir comentarios en el código, de manera que se documente con lenguaje natural la funcionalidad de los bloques más importantes del código fuente, o aquellas operaciones más complejas.

También es conveniente ordenar las sentencias del código fuente, para agruparlas según su funcionalidad (manteniendo el orden requerido por el resultado que se desea obtener), y añadir líneas en blanco que permitan diferenciar las distitnas partes que lo forman.

En Python puedes introducir comentarios de una línea siempre que vayan precedidos del carácter almohadilla (#):

from sense_hat import SenseHat

# Crear objeto SenseHat
sense = SenseHat()

# Obtener valor de la temperatura
temperatura = sense.get_temperature_from_humidity()
temperaturaRedondeo = round(temperatura, 1)

# Obtener valor de la presión atmosférica 
pressure = sense.get_pressure()

# Mostrar resultados
mensaje = "Temperatura actual: "
print(mensaje + str(temperaturaRedondeo) + " ºC")
print("Pressure: %s Millibars" % pressure)

Esta guía continúa ...

Aprende Python a través de ejemplos con Raspberry Pi y Sense HAT (Parte 2)

Más información