entrada-POST

En esta nueva entrada del curso de programación con Protocoder vamos a aprender cómo leer datos de un sensor de temperatura y humedad y representarlos en Protocoder.

Código Arduino

En el código de Arduino realizaremos la medición con un sensor basado en el chip HTS221 y enviaremos los datos a través de Bluetooth. En nuestro caso, conectaremos la salida SCL del sensor al pin A5 y la SDA al pin A4 de la placa ZUM.

En primer lugar, incluimos las librerías y creamos un objeto para poder acceder a los datos del sensor:

Para almacenar los datos de los sensores, utilizaremos dos variables h y t, que guardarán la humedad y temperatura respectivamente, y la variable sampleTime, que parará la ejecución durante el tiempo marcado en milisegundos. Utilizaremos una variable auxiliar, aux, donde guardaremos los datos “parseados” para enviarlos y, la variable debug, de tipo “bool”, para determinar si se imprime a través de la conexión serie los datos de temperatura y humedad sin “parsear”.

En la función setup se inicializa la conexión serie y las librerías Wire y hts221. También se comprueba si la conexión se ha realizado correctamente.

En la función loop, se acceden y almacenan los datos de los sensores y se realiza el parseo de dichos valores para enviarlos a través de Bluetooth.

Para enviar los datos, de tipo “float”, se convierten a variables enteras y se concatenan ambos valores. Por ejemplo, en un ciclo de la función loop se obtienen los valores h = 44.38 y t = 26.80. Para enviarlos, en primer lugar, multiplicamos ambas variables por 100 para trasladar la parte decimal a la parte entera, obteniendo 4438 y 2680; en segundo lugar se realiza un cast de las variables a entero, con la orden int().

Una vez que se ha realizado el cast, el siguiente paso es aumentar el peso de una de las dos mediciones para obtener un número de 8 cifras en el que se almacenen tanto los datos de humedad como de temperatura. En este caso, se ha decidido que la medición de humedad sea la de mayor peso dentro del envío, por lo que multiplicamos por 10000 el valor de la humedad para obtener, siguiendo con el ejemplo, un valor de humedad igual a 44380000, al que sumaremos el valor de la temperatura y obtendremos el valor parseado 44382680 listo para enviar. Una vez que se reciba en Protocoder, se realizará el proceso inverso para separar los datos y poder trabajar con ellos.

Por último, se envían los datos una vez se ha realizado el parseo, almacenados en la variable aux, y se espera el tiempo programado mediante las ordenes:

Código Protocoder

En el código de Protocoder comenzamos incluyendo la cabecera de nuestros programas y dos botones, para conectar y desconectar al Bluetooth. Si quieres conocer más a fondo cómo funciona este código, puedes visitar esta entrada.

bq_Aquaris_E4_5

bluetooth

Los únicos cambios realizados con respecto a lecciones anteriores del curso son la inclusión de la función onNewData y dentro de ésta, la función parseIncomming(), encargadas de recibir los datos desde Arduino y, “traducir” dichos datos a números para poder trabajar con ellos en Protocoder, respectivamente.

Una vez que hemos “decodificado” los datos de humedad y temperatura, cambiamos el texto de las variables que crearemos después textH y textT y, concatenamos respectivamente “%HR” y “ºC” a las variables, para que se muestren los valores correctamente.

La función onNewData recibe los datos que se han enviado desde la placa ZUM y se almacenan en la variable data, que solo podemos utilizar dentro de la propia función onNewData. Para deshacer el parseo de la humedad y temperatura que hemos realizado en el código Arduino, utilizamos la función parseIncomming, a la que pasamos la variable data. Además, creamos las variables humidity y temperature, que igualamos a 0, y debugging, que igualamos a false para evitar que se muestren datos por la consola. Si queremos comprobar qué datos se utilizan de manera interna en la función, tendremos que cambiar el valor de debugging a true. El código de la función parseIncomming es:

Dentro de parseIncomming se utilizan las funciones parseInt y toFixed (pulsa sobre los nombres para conocer más sobre estas funciones). Con la función parseInt se elimina la parte decimal del número, y con toFixed se obliga a que el número tenga 2 decimales. Se utiliza una combinación de operaciones matemáticas y estas funciones para “decodificar” los valores de humedad y temperatura que se han recibido a través de Bluetooth.

Por último, creamos dos variables de texto que mostrarán los valores de humedad y temperatura, modificamos su tamaño y cambiamos su color, en este caso a negro. Para modificar el color, se utilizan códigos html.

boton-humedad

2 comentarios

  1. Hola, muy interesantes estas entradas sobre el uso de protocoder para comunicarse con una placa (en mi caso la Zum Core) con sensores.
    ¿Podrías resolverme una duda?. Estoy intentando adaptar el ejemplo al uso de 2 sensores (uno barométrico y otro de humedad), para enviar 3 datos (temperatura, humedad y presión atmosférica).
    ¿Podrías ilustrar un ejemplo en que se manden más de 2 valores? Pues, si se usa el mismo método indicado para mandarlos, tendremos problemas de overflow en la variable aux. ¿Se pueden mandar como una serie de valores seguidos, no en una sola variable?
    Gracias por vuestro esfuerzo aportando conocimiento.
    Un saludo.

Los comentarios están cerrados.