PASO 3: Codificación y Almacenamiento de Datos
Buenos días a todos, en este post vamos ha identificar las partes que debe tener el programa o código que aporta la funcionalidad a nuestra aplicación.
Fases del Código:
al crear los canales. Inicializamos los parámetros como un
string vacío.
El próximo día explicaré cómo podemos ejecutar nuestro código sobre la RPi. La ejecución es sencilla, no obstante deben instalarse y configurarse un par de cositas en la RPi para que todo funcione correctamente.
Fases del Código:
- Importación de librerías:
Librería HTTP y MQTT : implementa las funcionalidades básicas (solicitudes, recepción
de mensajes, etc) para realizar comunicaciones.
de mensajes, etc) para realizar comunicaciones.
Librerías Sensor BMP y DHT: necesarias para realizar las lecturas de los sensores.
Librería JSON: se usa para dar formato JSON a los datos que se desea enviar a
ThingSpeak, ya que la plataforma trabaja con este formato (InformacionJSON).
ThingSpeak, ya que la plataforma trabaja con este formato (InformacionJSON).
Librería Raspberry: permite configurar los pines de la raspberry (Input/Output).
Librería Math: para poder realizar operaciones matemáticas.
Librería Time: para poder establecer tiempos de espera.
- Creación de un canal ThingSpeak:
1- Creación de parámetros asociados a la información del canal ThingSpeak:
1- Creación de parámetros asociados a la información del canal ThingSpeak:
Channel_Name: String con el nombre que deseamos poner al canal
User_API_Key: clave propia que se asigna a cada usuario al registrarse en
la plataforma ThingSpeak.
la plataforma ThingSpeak.
Para consultarla:
Account - MyProfile - ThingSpeak Settings - User API Key
Write_API_Key, Read_API_Key: inicialmente desconocidas ya que se generan al crear los canales. Inicializamos los parámetros como un
string vacío.
2- Crear una conexión TCP a través de la que poder establecer comunicaciones HTTP
3- Establecer comunicación con ThingSpeak y solicitar la información de los canales
existentes en la plataforma. Al recibir la información, buscaremos si ya existe un
canal con el nombre asignado en Channel_Name.
canal con el nombre asignado en Channel_Name.
a) Si el canal existe: registraremos el identificador de canal (Channel_Id) y
solicitaremos las claves del canal (Write/Read API Key)
solicitaremos las claves del canal (Write/Read API Key)
Guía ThingSpeak: read_settings_channel
b) Si NO existe, crearemos el canal: crearemos un mensaje HTTP en el que
mandaremos la información necesaria para crear un canal ( clave de usuario,
campos que deseamos, privacidad del canal).
mandaremos la información necesaria para crear un canal ( clave de usuario,
campos que deseamos, privacidad del canal).
Guía ThingSpeak: create_channel
Nota: este paso podría realizarse de muchos otros modos, como simplificarlo
haciendo que siempre se cree el canal, destruir el canal si ya existe y crearlo de
nuevo siempre, etc. Existen múltiples opciones, por lo que sois libres de escoger
como lo haréis, recordad que tenéis la guía de ThingSpeak como ayuda.
Nota: este paso podría realizarse de muchos otros modos, como simplificarlo
haciendo que siempre se cree el canal, destruir el canal si ya existe y crearlo de
nuevo siempre, etc. Existen múltiples opciones, por lo que sois libres de escoger
como lo haréis, recordad que tenéis la guía de ThingSpeak como ayuda.
- Lectura de los sensores y envío de información a ThingSpeak:
1- Configuración de los pines GPIO de la raspberry. En este punto vamos a indicar que
1- Configuración de los pines GPIO de la raspberry. En este punto vamos a indicar que
los pines de la raspberry son de tipo entrada, de modo que peritirán leer la
información que manden los sensores.
información que manden los sensores.
2- Bucle infinito de lectura, procesamiento y envío de datos a ThingSpeak. Este
apartado puede estructurarse del siguiente modo:
apartado puede estructurarse del siguiente modo:
a) Lectura del sensor DHT y BMP. En este punto he incluido la visualización de
los datos por pantalla, pero no sería necesario.
los datos por pantalla, pero no sería necesario.
b) Realización de cálculos para obtener información derivada de los valores
captados por los sensores. Por ejemplo: cálculo del punto de rocío a partir
de la medición de temperatura y humedad. Este punto puede extenderse tanto
como uno quiera.
captados por los sensores. Por ejemplo: cálculo del punto de rocío a partir
de la medición de temperatura y humedad. Este punto puede extenderse tanto
como uno quiera.
c) Realizar una solicitud de escritura de datos sobre el canal ThingSpeak
mediante comunicaciones MQTT. Para llevar a cabo este tipo de comunicación
es preciso crear un topic y un host. La creación de estos elementos solo
debe hacerse una vez, por lo que se debe realizar justo antes del bucle.
mediante comunicaciones MQTT. Para llevar a cabo este tipo de comunicación
es preciso crear un topic y un host. La creación de estos elementos solo
debe hacerse una vez, por lo que se debe realizar justo antes del bucle.
Por otro lado, debe construirse el mensaje (parámetro llamado payload) que
contiene la información a que deseamos enviar a ThingSpeak. El payload toma
un valor distinto en cada iteración, por lo que se genera dentro del bucle.
En nuestra aplicación el mensaje tendría definidos los valores de
temperatura, humedad, punto de rocío y presión obtenidos/calculados por los
sensores. Una vez definidos el topic, host y payload puede realizarse el
envío de la información o publicación ya que se trata de una comunicación
Publish/Subscribe.
contiene la información a que deseamos enviar a ThingSpeak. El payload toma
un valor distinto en cada iteración, por lo que se genera dentro del bucle.
En nuestra aplicación el mensaje tendría definidos los valores de
temperatura, humedad, punto de rocío y presión obtenidos/calculados por los
sensores. Una vez definidos el topic, host y payload puede realizarse el
envío de la información o publicación ya que se trata de una comunicación
Publish/Subscribe.
Guía ThingSpeak: publish_to_a_channel_feed
3- Establecer un tiempo de espera de 15 segundos. Este paso provoca que el bucle se
duerma durante 15 segundos y por tanto no realice envíos de información a
ThingSpeak. El motivo por el que debe hacerse esto es que la plataforma
ThingSpeak no permite la subida de datos a un frecuencia superior de 15 segundos
a los usuarios creados de forma gratuita, que es nuestro caso. Por tanto, si no
hiciéramos este paso, simplemente realizaríamos envíos que no se publicarían
realmente.
duerma durante 15 segundos y por tanto no realice envíos de información a
ThingSpeak. El motivo por el que debe hacerse esto es que la plataforma
ThingSpeak no permite la subida de datos a un frecuencia superior de 15 segundos
a los usuarios creados de forma gratuita, que es nuestro caso. Por tanto, si no
hiciéramos este paso, simplemente realizaríamos envíos que no se publicarían
realmente.
Las fases del código son las descritas y como podéis ver la plataforma ThingSpeak proporciona muchos recursos para facilitar la tarea. Aún así, os voy a dejar colgado el código que mi compañero y yo hemos desarrollado para que os sirva de guía. Comentaros que hemos hecho uso del lenguaje Python, que es un lenguaje de programación interpretado cuya filosofía es una sintaxis que favorezca el código legible. Además es un lenguaje de programación multiparadigma (soporta orientación a objetos, programación imperativa y programación funcional), usa un tipado dinámico y es multiplataforma. Como puede que muchos de vosotros no conozcáis este lenguaje, os dejo unos enlaces que conducen a manuales que yo misma he usado para aprender Pyhon:
A continuación tenéis el código Python creado por mi compañero y yo para desarrollar la aplicación. Espero os sirva de ayuda o incluso de plantilla para que apliquéis mejoras o ampliaciones.
(No dudéis en preguntar las dudas que os surjan en la zona de comentarios)El próximo día explicaré cómo podemos ejecutar nuestro código sobre la RPi. La ejecución es sencilla, no obstante deben instalarse y configurarse un par de cositas en la RPi para que todo funcione correctamente.
Comentarios
Publicar un comentario