Revista 100% Verde

IoT Cloud

Por Soloelectronicos @soloelectronico

En este post vamos a a ver conectar una placa MKR1000 (o MKR 1010) a la nube de Arduino IoT de modo que podremos controlar y supervisar las entradas o salidas de estas places a través de Internet utilizando el sitio web de Arduino IoT Cloud.

Para ello simplemente seguiremos tres pasos,:

  • Agregaremos nuestra placa a Arduino IoT Cloud como una cosa( Thing) , es decir una representación de nuestra placa en la nube.
  • A continuación, le daremos a nuestra cosa un conjunto de propiedades que representan sensores, LEDs, motores y muchos otros componentes en el proyecto al que queremos acceder desde la nube.
  • Subiremos a nuestra placa el código que nos propone Arduino IoT Cloud personalizado para nuestra red wifi

Si le interesa como hacerlo , vera que es muy sencillo, pues como vamos a ver casi todo esta hecho, pero antes, veremos las semejanzas y diferencias de ambas placas y después veremos paso a paso como lograrlo.

Arduino MKR1000

Arduino MKR1000 es una placa diseñada para ofrecer una solución práctica y rentable para cualquiera que busque agregar conectividad WiFi a sus proyectos con una experiencia mínima en redes. Su precio no es excesivo teniendo en cuenta que integra la conectividad wifi ( unos 38€ en Amazon)

El diseño incluye un circuito de carga Li-Po que permite que el Arduino MKR1000 funcione con una batería o 5V externos, cargando la batería Li-Po mientras funciona con energía externa: el cambio de una fuente a otra se realizara automáticamente y por tanto no tendremos que preocuparnos de nada más.

El MKR1000 tiene un procesador Arm Cortex-M0 + de 32 bits corriendo a 2.4ghz , y cuenta con el rico conjunto habitual de interfaces de E / S . Sin duda uno de su punto fuertes es que integra WiFi de baja potencia con un chip criptográfico para una comunicación segura.

Una de las grandes ventajas es que p uede programarlo utilizando el software Arduino (IDE) al que estamos todos familiarizados siendo muy fácil de usar.

Todas estas características hacen de esta placa la opción preferida para los proyectos emergentes que funcionan con baterías de IoT en un factor de forma compacto.

IoT Cloud

Desafortunadamente, Arduino aún no lo ha integrado en su IDE, por lo que la configuración no es tan fácil como lo es para la mayoría de sus otras placas ,sin embargo, siga algunos pasos para configurarlo y podrá ponerlo a prueba: -

  • Instale el último IDE de Arduino
  • Haga clic en Herramientas | Puerto - Seleccione el puerto COM (no se mostrará ninguna placa)
  • Ahora haga clic en Herramientas | Junta | Obtener información del tablero. Verá información con "Tablero desconocido" como tipo
  • A continuación, haga clic en Herramientas | Junta | Gerente de la Junta
  • Instale el paquete Arduino SAMD Boards (ARM Cortex-M0 + de 32 bits) que incluye MKR WiFi 1010, Genuino Zero, MKR1000, etc.
  • Reinicie el IDE para que surta efecto el nuevo paquete de placa
  • En este punto, puede desconectar y volver a conectar la placa para que el IDE lo vea
  • Haga clic en Herramientas | Información del tablero; esta vez verá "Arduino / Genuino MKR1000" !!! ¡No olvides este siguiente paso o no podrás subir tu boceto!
  • Haga clic en Herramientas | Tablero:
  • Seleccione Arduino / Genuino MKR1000 . En este punto, yaa puede cargar un boceto en su tablero como por ejemplo el que vamos a ver en este post para controlar un led desde Internet

Como se puede ver en la imagen de mas abajo , l os pines disponibles son casi los mismos que los que solemos tener en un Arduino convenciona l : los pines A0 a A6 para entradas y salidas analógicas , los pines 0 al 14 para entradas salidas binarias y los típicos de alimentación externa(VIN,VCC 5v y GND) , la referencia (AREF ) y RESET.

IoT Cloud

Si le interesa esta placa la puede comprar en Amazon por unos 38€

Arduino MKR1010

Hablamos ahora de una placa muy similar a la anterior algo mas barata que la la Mkr1000 ( unos 33€ en Amazon , es decir unos 5€ mas barato que la MKR1000)

Esta placa está compuesta por tres bloques principales:

  • Microchip ATSAMD21 MCU basado en un procesador Arm Cortex-M0
  • Serie u-blox NINA-W10 de baja potencia 2.4GHz IEEE 802.11 b / g / n Wi-Fi ECC508 CryptoAuthentication
  • El diseño incluye un Li-Po Circuito de carga que permite que Arduino MKR WiFi 1010 funcione con batería o 5V externos, cargando la batería Li-Po mientras funciona con energía externa. El cambio de una fuente a otra se realiza automáticamente.

Como vemos , la gran diferencia es el Microcontrolador que es menos potente pues cuenta con el Microchip ATSAMD21 (procesador Arm Cortex-M0 +) en contraste con el Arm Cortex-M0 + de 32 bits corriendo a 2.4ghz del MKR100.

Respecto a la conectividad, es similar al MKR1000 contando con WiFi u-blox NINA-W102 (ESP32)

La alimentación se puede hacer con una fuente de alimentación externa de 5v DC bien por USB o bien por el pin VIN , pero cuenta además con conexión para Batería compatible (*) Li-Po de celda única, 3,7 V, 700 mAh siendo el voltaje mínimo de funcionamiento del circuito 3,3 V .

IoT Cloud

Como se puede ver en la imagen de mas abajo , l os pines disponibles son casi los mismos que los que solemos tener en un Arduino convenciona l ( y los mismo que el MKR100) : los pines A0 a A6 para entradas y salidas analógicas , los pines 0 al 14 para entradas salidas binarias y los típicos de alimentación externa(VIN,VCC 5v y GND) , la referencia (AREF ) y RESET.

IoT Cloud

Si le interesa esta placa la puede comprar en Amazon por unos 33€

1. Crear una cosa y controlar un LED a través de la nube

Para empezar vamos a crear un circuito simple que consiste en un LED conectado a la placa Arduino MKR1000 (o MKR 1010).

Como se muestra en el esquema, simplemente conectaremos la pata positiva del LED al Pin digital 2 de la placa y la pata negativa a tierra a través de una resistencia de 150 ohmios.

Observe que la potencia de la placa de pan proviene del Vcc, no del pin de 5V de la placa MKR1000 pues si lo conectamos al pin de 5V, podríamos dañar la placa cuando por ejemplo agreguemos un botón.

Ahora que hemos conectado nuestro LED, podremos habilitado para IoT pero antes de eso, tendremos que configurar una placa Arduino para que pueda comunicarse con la nube.

Para este proyecto, podemos elegir un MKR1000 o un MKR 1010. Una vez que nuestra placa está configurada, nos iremos Arduino IoT Cloud y el proceso guiado de introducción nos ayudará a configurar nuestra placa, darle un nombre e instalar las claves que le permitirán conectarse de forma segura a nuestra nube mediante un canal cifrado.

IoT Cloud
Es hora de conectar nuestra placa a nuestro ordenador, se reconocerá automáticamente

Al hacer clic en el botón "BACK TO CLOUD" podremos crear nuestra primera Cosa.

Nuestra placa MKR recién configurada se seleccionará automáticamente para ser asociada con nuestra Cosa, por lo que todo lo que queda es darle un nombre. Elegimos llamarlo IoTCloud_Tutorial_Thing pero puede nombrarlo como desee.

IoT Cloud
Nuestra placa está preseleccionada ->
IoT Cloud
y haga clic en el botón CREAR

Ahora seremos redirigidos a nuestra vista de edición de Thing, donde podremos crear y modificar sus Propiedades - la representación de sensores y actuadores a los que queremos acceder a través de la nube.

Nuestro objetivo es encender y apagar el LED a través de Cloud cuando alternamos un interruptor gráfico en nuestro navegador. Para hacerlo, tenemos que crear una propiedad, así que haga clic en el botón + como se muestra en la imagen de abajo.

IoT Cloud

Usaremos como nombre significativo que lo represente (este nombre se reflejará en el nombre de la variable que usaremos en el boceto) como por ejemplo dado que va ser un led de ". light"

IoT Cloud

El Tipo de esta propiedad debe ser "ON/OFF (Boolean)".

Podemos dejar El permiso establecido en "Leer y escribir" - para que podamos encender y apagar el LED desde el navegador.

También deje Actualizar en "Cuando cambie el valor", lo cual asegurará de que siempre que el valor de la propiedad/variable cambie dentro del boceto de la placa, dicho valor se enviará inmediatamente a la nube.

Finalmente haga clic en CREAR.

Desde la vista Editar podemos hacer clic en "EDITAR CODE". Esto nos redirigirá al Editor mostrando un boceto ya hecho que se ha generado para nuestra Cosa.

En este caso de ejemplo se generará el siguiente código que tendremos que cargar en nuestra placa:

*
Sketch generated by the Arduino IoT Cloud Thing "testThing"
https://create.arduino.cc/cloud/things/d276ab77-67cb-420b-9ea4-bd34cdf385d9
Arduino IoT Cloud Properties description
The following variables are automatically generated and updated when changes are made to the Thing properties
bool switchState;
int potentiometerValue;
bool ledState;
Properties which are marked as READ/WRITE in the Cloud Thing will also have functions
which are called when their values are changed from the Dashboard.
These functions are generated with the Thing and added at the end of this sketch.
*/
include "thingProperties.h"
include
define LED_PIN 2
define POT_PIN A1
define BUTTON_PIN 5
FTDebouncer buttons;
void setup() {
pinMode(LED_PIN, OUTPUT);
buttons.addPin(BUTTON_PIN, LOW);
buttons.init();
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you'll get.
The default is 0 (only errors).
Maximum is 3
*/
setDebugMessageLevel(2);
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
}
void loop() {
buttons.update();
ArduinoCloud.update();
// Your code here
int angleSensor = analogRead(A1);
angle = map(angleSensor, 0, 1023, 0, 270);
}
void onLightChange() {
digitalWrite(LED_PIN, light);
Serial.print("The light is ");
if (light) {
Serial.println("ON");
} else {
Serial.println("OFF");
}
}
void onPinActivated(uint8_t pinNr) {
// do something according to the _pinNR that is triggered. For instance:
Serial.println(pinNr);
toggle = !toggle;
}
void onPinDeactivated(uint8_t pinNr) {
// do something according to the _pinNR that is triggered. For instance:
Serial.println(pinNr);
}

El boceto se denominará exactamente igual que nuestra Cosa, más la fecha de creación y, finalmente, un número si ya existe un boceto con nombre .

Aparte del archivo .ino principal , verá tres archivos más:

  • ReadMe.adoc: se trata de un archivo de texto sin formato que contiene información sobre el boceto, el autor y el propio proyecto.
  • thingProperties.h: este es el código generado por Arduino IoT Cloud cuando agregamos nuestra propiedad. No necesitamos editar este código, pero es útil verlo ya que muestra qué variablesde nuestro archivo de boceto principal (.ino) se sincronizarán con la nube.light
  • En la Pestaña Secreto: Detalles de la conexión WiFi, esta pestaña nos permite rellenar los valores como son el nombre y la contraseña de la red WiFi a la que se conectará nuestra placa.SECRET_SSIDSECRET_PASS

Vamos a profundizar en cada línea de este boceto para entender lo que hacen los difrentes ficheros qeu lo compone:

Fichero thingProperties.h

#include <ArduinoIoTCloud.h>

Importa la biblioteca ArduinoIoTCloud, que es necesaria para sincronizar nuestras variables de boceto locales con sus propiedades de IoT Cloud.

#include <Arduino_ConnectionHandler.h>

El WiFiConnectionManager se utiliza para gestionar la conexión WiFi y la reconexión sin problemas.

char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;

Estos valores se extraen de la pestaña Secreto.

#define THING_ID "d276ab77-67cb-420b-9ea4-bd34cdf385d9"

El código de identificación único de la cosa.

void onLightChange();

Esta línea declara una función que se llamará cada vez que se cambia el valor de nuestra propiedad en el panel. Este tipo de función se conoce como devolución de llamada. light

bool light;

Declaración de la variable. light

void initProperties()

Esta función se llamará dentro del bloque de nuestro archivo *.ino. setup()

ArduinoCloud.setThingId(THING_ID);

Le dice a nuestro boceto a qué cosa conectarse.

ArduinoCloud.addProperty(light, READWRITE, ON_CHANGE, onLightChange);

Este código pues le indica al sketch que trate la variable como una propiedad de nuestra cosa y que ejecute la función de devolución de llamada cada vez que se cambie el valor de propiedad de Arduino IoT Cloud.

Los permisos se establecen para esta propiedad porque esto es lo que seleccionamos al crear esta propiedad. lightonLightChangeREADWRITE

El resto de codigo es el siguiente:

void onLightChange(); void initProperties(){WiFiConnectionHandler ArduinoIoTPreferredConnection(ssid, pass);
ArduinoCloud.setThingId(THING_ID);
ArduinoCloud.addProperty(toggle, READ, ON_CHANGE, NULL);
ArduinoCloud.addProperty(angle, READ, ON_CHANGE, NULL, 3.000000);
ArduinoCloud.addProperty(light, READWRITE, ON_CHANGE, onLightChange);
}

Este código Inicializa Connection Manager con el nombre de punto de acceso WiFi ( SECRET_SSID) y la contraseña ( SECRET_PASS)que establecemos en la pestaña Secreto

Fichero *.ino

Al igual que en cualquier Arduino Sketch, hay dos funciones principales, y . Se llama una sola vez; cuando el croquis se inicia o se restablece. El se ejecuta continuamente siempre y cuando la placa esté siendo alimentada. void setup(){...}void loop() {...}setup()loop()

#include "thingProperties.h"

Importa variables y funciones declaradas en thingProperties.h, así como en otras bibliotecas importadas.

setDebugMessageLevel(2);

Establece el nivel deseado de mensajes de registro que se imprimirán en el Monitor serie. En este momento el nivel se establece en 2, pero podemos cambiarlo de0 (que registra sólo errores) hasta 3 (que registra TODO!). Si algo no está funcionando con la conexión a WiFi o Cloud, será más fácil encontrar el problema si se establece en un nivel superior. Por ahora, podemos dejarlo como está.

Serial.begin(9600);

Inicializa el monitor serie para imprimir lo y leer deél.

delay(1500);

Espera 1,5 segundos para dar al Monitor serie el tiempo necesario para inicializar.

initProperties();

Inicializa las propiedades tal como se definen en thingProperties.h.

ArduinoCloud.begin(ArduinoIoTPreferredConnection);

InicializatheArduinoCloudusingthe mencionado anteriormente ConnectionManager.

Dentro de lo que encontramos loop()

ArduinoCloud.update();

Maneja muchas cosas en segundo plano, incluyendo la sincronización de los valores de las propiedades entre la nube y la placa, checkingtheconnectiontonetworkyCloudy otra lógica. Si el valor de una propiedad cambia en el boceto, la biblioteca la detectará automáticamente y notificará a la nube, de modo que dicho valor se reflejará en nuestro Arduino IoT Cloud Dashboard. Del mismo modo, cuando se cambia el valor de una propiedad en el panel, la biblioteca actualizará el valor correspondiente en el dispositivo.

void onLightChange() {...}

La implementación de nuestra devolución de llamada que se llamará en cualquier momento que cambie el valor de la propiedad. Aquí agregaremos cualquier código que queramos que se ejecute cuando cambie la propiedad de nuestro panel. light

Y ahora, con el fin de encender y apagar el LED desde el Arduino IoT Cloud Dashboard, necesitamos escribir algunas líneas de código. Primero definimos el pin al que está conectado nuestro LED. Agregue este código justo encima de la función setup()

#define LED_PIN 2

En la función, necesitamos inicializar este pin para que sea una SALIDA:setup()

pinMode(LED_PIN, OUTPUT);

Por último, en la función, agregamos un poco de lógica para rastrear el estado en el monitor serie y para encender y apagar el LED. Tenga en cuenta que esta función de devolución de llamada se genera automáticamente cada vez que se agrega una nueva propiedad con permisos de lectura y escritura.onLightChange()light

void onLightChange() {
    digitalWrite(LED_PIN, light);
    Serial.print("The light is ");
    if (light) {
        Serial.println("ON");
    } else {
        Serial.println("OFF");
    }
}

Pruebas

Una vez preparados los ficheros anteriores podemos cargar el boceto desde el IDE de Arduino haciendo clic en el botón Cargar y luego abra el Monitor Serie a la izquierda para ver si todo funciona.

Debido a que hemos establecido el nivel de registro en 2, el Monitor serie nos mostrará información sobre el progreso de nuestra placa que se conecta a IoT Cloud.

Una vez conectado con éxito a nuestro WiFi, logró obtener una dirección e inició un enlace seguro, la placa se conectará a IoT Cloud y comenzará a intercambiar datos con ella.

[ 144313 ] Connecting to "FT Mobile"
[ 148284 ] Connected to "FT Mobile"
[ 148284 ] Acquiring Time from Network
....
[ 148690 ] Network Time: 1550057496
[ 148910 ] Connecting to Arduino IoT Cloud...
[ 152212 ] Connected to Arduino IoT Cloud

Si alguno de los pasos anteriores falla, recibiremos un error. Si eso sucede, podemos restablecer el tablero e intentarlo de nuevo. Si los pasos anteriores se han seguido cuidadosamente, es un caso poco probable 🙂

Al hacer clic en el botón GO TO IOT CLOUD seremos redirigidos a la página de nuestra Cosa en Arduino IoT Cloud. Desde aquí haremos clic en el botón del panel.

IoT Cloud
En la Vista de Dasboard ya deberíamos ver un widget que muestra el estado de la propiedad que creamos, y debe establecerse en OFF.light

Vamos a hacer clic en él un par de veces y vamos a ver el LED encender y apagar... y ON... y OFF de nuevo...

¡Misión cumplida!


Volver a la Portada de Logo Paperblog