Internet of Things: Arduino/Adafruit IoT Cloud

Introducción

En este tutorial vamos a ver como enviar los valores de temperatura, humedad, presión atmosférica y luminosidad leídos por los sensores de la MKR ENV SHIELD al Arduino IoT Cloud y al Adafruit IoT Cloud.

Por otro lado también veremos cómo mostrar el mensaje «ON» (en color verde) y «OFF» (en color rojo) en la MKR RGB SHIELD en función del estado de un botón de tipo «ON/OFF» (con el que interactuaremos) creado desde el Arduino IoT Cloud y desde el Adafruit IoT Cloud.

Para la realización de este proyecto utilizaremos la placa Arduino MKR WiFi 1010 y necesitaremos tener una cuenta tanto en el Cloud de Arduino como en el de Adafruit.

Listado de componentes

    • Arduino MKR WiFi 1010.
    • Arduino MKR ENV SHIELD.
    • Arduino MKR RGB SHIELD.
    • Adafruit 1.44″ Color TFT LCD Display con MicroSD – ST7735R.

Enviando los datos al Cloud

En esta sección vamos a ver como enviar los valores de temperatura, humedad, presión atmosférica y luminosidad leídos por los sensores de la MKR ENV SHIELD primero al Arduino IoT Cloud y posteriormente al Adafruit IoT Cloud utilizando para este último la librería WiFiNINA y el Adafruit IO REST API (v2.0.0).

También utilizaremos el Adafruit 1.44″ Color TFT LCD Display con MicroSD-ST7735R para visualizar los valores que estamos leyendo en la MKR ENV SHIELD y de esta manera verificar que son los mismos valores que estamos enviando y visualizando en el Cloud.

El circuito que montaremos quedará de la siguiente manera:

Adafruit 1.44″ Color TFT MKR WiFi 1010
VIN VCC
3V3 NC
GND GND
SCK D9 (SCK)
SO NC
SI D8 (MOSI)
TCS D3
RST D2
D/C D1
CSS NC
LITE NC

Arduino IOT Cloud

Seguiremos los siguientes pasos:

Paso 1: Ir al Arduino IoT Cloud: https://create.arduino.cc/iot/things

Paso 2: Pulsar el botón “NEW THING”.

Paso 3: Seleccionar la placa que queremos asociar en el Arduino IoT Cloud (en nuestro caso será la placa MKR WiFi 1010).

Paso 4: El siguiente paso será la instalación del Arduino Create Plugin y la configuración de la placa MKR WiFi 1010.

Paso 5: Conectar la placa MKR WiFi 1010 al ordenador mediante un cable micro USB.

Paso 6: Una vez detectada la placa le pondremos un nombre para identificarla.

Paso 7: El siguiente paso configurará el Crypto Chip de la placa.

Si todo ha ido bien ya tendremos nuestra placa MKR WiFi 1010 habilitada para utilizarla en el Arduino IoT Cloud.

Paso 8: Ahora ya podremos crear nuestro “THING”  (representación lógica de un objeto conectado) que en nuestro caso representará los valores de temperatura, humedad, presión atmosférica y luminosidad leídos por la MKR ENV SHIELD acoplada en la placa MKR WiFi 1010.

Paso 9: Crearemos 4 propiedades: TEMPERATURE, HUMIDITY, PRESSURE y LIGHT_INTENSITY que se actualizarán cada 2s y serán solo de lectura.

Si vamos a la pestaña de “Widgets” veremos que todavía no existen valores recibidos y los indicadores aparecen vacíos:

Paso 10: Si pulsamos el botón “EDIT CODE” podemos ver el sketch y los ficheros que se han generado. Solo faltará completar la programación y añadir en el fichero arduino_secrets.h los valores SECRET_SSID y SECRET_PASS de nuestra WiFi.

El sketch completo lo podeis descargar del siguiente repositorio:

https://github.com/avilmaru/iot_arduino_adafruit/tree/master/readsensors_sendtoarduino_iotcloud

NOTA: Recordad que que teneis que cambiar los siguientes valores por los vuestros:

thingProperties.h

const char THING_ID[] = "xxxxxx-cxxx-xxxx-xxxx-xxxxxxxx";

arduino_secrets.h

#define SECRET_SSID "XXX"
#define SECRET_PASS "YYY”

Paso 11: Cargar el sketch en la placa y ver como cada 2s los valores leídos por la MKR ENV SHIELD son enviados al Arduino IoT Cloud:

Adafruit IOT Cloud

En este ejemplo vamos a ver como enviar la misma información anterior pero esta vez al Adafruit IoT Cloud utilizando la librería WiFiNINA y el Adafruit IO REST API (v2.0.0).

Para información sobre el Adafruit IoT Cloud

https://learn.adafruit.com/welcome-to-adafruit-io/getting-started-with-adafruit-io

Para información sobre Adafruit IO REST API (v2.0.0):

https://io.adafruit.com/api/docs/

Seguiremos los siguientes pasos:

Paso 1: Ir al Adafruit IoT Cloud: https://io.adafruit.com/

Paso 2: Crearemos 4 “feeds” (lo que en el Arduino IoT Cloud llamamos “propiedades”) dentro de un “grupo” que llamaremos ENV_ROOM1:

    1. humidity
    2. light_intensity.
    3. pressure.
    4. temperature

Para saber como crear “feeds”:

https://learn.adafruit.com/adafruit-io-basics-feeds/overview

Paso 3: Crearemos un “dashboard” para poder visualizar los datos de los “feeds” anteriores. En nuestro caso crearemos 4 bloques (el equivalente a los “Widgets” en Arduino IoT Cloud) de tipo “indicador” que llamaremos: TEMPERATURE, HUMIDITY, PRESSURE y LIGHT_INTENSITY que estarán asociados a los 4 “feeds” que hemos creado en el apartado anterior.

Para saber como crear “dashboards”:

https://learn.adafruit.com/adafruit-io-basics-dashboards/creating-a-dashboard

Paso 4: Para enviar el valor de los datos leídos por los sensores de la MKR ENV SHIELD utilizaremos la opción de crear datos de un grupo del Adafruit IO REST API (v2.0.0) que nos permitirá enviar los datos de temperatura, humedad, presión atmosférica y luminosidad leídos de una sola vez.

Si miramos la documentación del API vemos que para enviar la información necesitamos hacer la siguiente llamada:

POST: https://io.adafruit.com/api/v2/{username}/groups/{group_key}/data

y generar un JSON con los datos con la siguiente estructura:

{
 "location": {

   "lat": 0,
   "lon": 0,
   "ele": 0
 },
 "feeds": [
   {
     "key": "string",
     "value": "string"
   }
 ],
 "created_at": "string"
}

Para serializar los datos y generar el JSON utilizaremos la librería “ArduinoJson”:

https://arduinojson.org/v6/doc/serialization/

Paso 5: Finalmente cargaremos en la placa el sketch del siguiente repositorio y comprobaremos que los valores leídos por la MKR ENV SHIELD son enviados al Adafruit IoT Cloud cada 7s:

https://github.com/avilmaru/iot_arduino_adafruit/tree/master/readsensors_sendtoadafruit_iotcloud

NOTA: Recordad que que teneis que cambiar los siguientes valores por los vuestros:

arduino_secrets.h

#define SECRET_SSID "XXX"
#define SECRET_PASS "YYY”
#define IO_USERNAME  "ZZZZ"
#define IO_KEY       "XXXX"

Interactuando con el Cloud

En este tutorial veremos cómo mostrar el mensaje «ON» (en color verde) y «OFF» (en color rojo) en la MKR RGB SHIELD en función del estado de un botón de tipo «ON/OFF» (con el que interactuaremos) creado desde el Arduino IoT Cloud y desde el Adafruit IoT Cloud.

Arduino IOT Cloud

Seguiremos los siguientes pasos:

Paso 1: Añadiremos una nueva propiedad a las ya existentes que llamaremos ON_OFF. Será de tipo “ON/OFF (boolean)” de lectura/escritura y se actualizará solo cuando su valor cambie.

Paso 2: Si pulsamos el botón “EDIT CODE” podemos ver el sketch y los ficheros que se han generado. Solo faltará completar la programación y añadir en el fichero arduino_secrets.h los valores SECRET_SSID y SECRET_PASS de nuestra WiFi.

El sketch completo lo podeis descargar del siguiente repositorio:

https://github.com/avilmaru/iot_arduino_adafruit/tree/master/onoff_getfromarduino_iotcloud

NOTA: He suprimido las variables de entorno del tutorial anterior para dejar únicamente el código referente a esta nueva propiedad.

NOTA: Recordad que que teneis que cambiar los siguientes valores por los vuestros:

thingProperties.h

const char THING_ID[] = "xxxxxx-cxxx-xxxx-xxxx-xxxxxxxx";

arduino_secrets.h

#define SECRET_SSID "XXX"
#define SECRET_PASS "YYY”

 

Paso 3: Cargar el sketch en la placa y ver cómo al variar el estado del botón “ON/OFF” provoca que aparezca el texto “ON” en color verde (si es el estado del botón es “ON”) o el texto “OFF” en color rojo (si el estado del botón es “OFF”) en la MKR RGB SHIELD.

Adafruit IOT Cloud

Para realizar el mismo ejemplo anterior en el Adafruit IoT Cloud volveremos a utilizar la librería WiFiNINA y el Adafruit IO REST API (v2.0.0).

Los pasos a seguir serán:

Paso 1: Crearemos un “feed” llamado “ON_OFF” dentro del “grupo”  DEFAULT (grupo que existe por defecto).

Paso 2: Modificaremos la propiedad “Feed History” para que no guarde el historial de valores de este feed ya que para este ejemplo no es necesario. Para ello pondremos a “OFF” esta propiedad.

Paso 3: Crearemos un “dashboard”  que contendrá un botón “ON/OFF”  que asociaremos al “feed” que hemos creado.

Paso 4: Para coger el valor del “feed” asociado al botón utilizaremos la opción de coger el último valor de un feed del Adafruit IO REST API (v2.0.0) que como su nombre indica nos permitirá saber el último valor de un feed y que en nuestro caso corresponderá al valor de “ON” o “OFF” que tiene el botón del dashboard.

Si miramos la documentación del API vemos que para coger esta información necesitamos hacer la siguiente llamada:

GET: /api/v2/{username}/feeds/{feed_key}/data/last

… y deserializar un JSON con la siguiente estructura:

{
 "id": "string",
 "value": "string",
 "feed_id": 0,
 "group_id": 0,
 "expiration": "string",
 "lat": 0,
 "lon": 0,
 "ele": 0,
 "completed_at": "string",
 "created_at": "string",
 "updated_at": "string",
 "created_epoch": 0
}

Para deserializar los datos del JSON  devuelto utilizaremos la librería “ArduinoJson”:

https://arduinojson.org/v6/doc/deserialization/

Paso 5: Finalmente cargaremos en la placa el sketch del siguiente repositorio y comprobaremos que al variar el estado del botón “ON/OFF” provoca que aparezca el texto “ON” en color verde (si es el estado del botón es “ON”) o el texto “OFF” en color rojo (si el estado del botón es “OFF”) en la MKR RGB SHIELD.

https://github.com/avilmaru/iot_arduino_adafruit/tree/master/onoff_getfromadafruit_iotcloud

NOTA: Recordad que que teneis que cambiar los siguientes valores por los vuestros:

arduino_secrets.h

#define SECRET_SSID "XXX"
#define SECRET_PASS "YYY”
#define IO_USERNAME  "ZZZZ"
#define IO_KEY       "XXXX"