Domótica con ESP32 (Tira RGB WS2812B con Alexa o Google Assistant)

Hey, esta vez les traigo un proyecto bastante sencillo pero potente para automatizar una gran cantidad de cosas de nuestro hogar. Estoy hablando de Arduino Cloud, una plataforma muy potente y fácil de usar para hacer dispositivos IoT.

En esta ocasión, haremos una tira RGB que podremos controlar ya sea desde Alexa o el Asistente de Google. Muy fácil.

Poner este proyecto en marcha es bastante sencillo:

  1. Nos vamos a Arduino Cloud.
  2. Seleccionamos la pestaña de crear open app o abrir aplicación.
  3. Iniciamos sesión.

Creación del dispositivo.

1. Seleccionamos la pestaña Devices.

2. Seleccionamos la opción “Third party device”.

3. Seleccionamos la placa que usamos.

4. Asignamos un nombre.

5. Descargamos las llaves que genera asociada a este thing, en caso de que perdamos los parámetros para usar el thing, este archivo descargable una sola vez, puede ayudarnos.

6.

Creación del Thing

1. Seleccionamos la opción de Things.

2. Seleccionamos la opción de añadir thing.

3. En variables de la nube seleccionamos añadir.

4. Se asigna un nombre, el tipo de variable, en este caso CloudColoredLight y se coloca en Read & Write y en On change, para que haga sus acciones solo cuando detecte un cambio de variable.

5. En la misma pestaña, se asocia el dispositivo que acabamos de crear en la sección anterior. Para esto, se presiona en el ícono de dispositivo asociado y luego se selecciona el dispositivo antes creado.

6. En integración con smarth home, se agrega si se quiere comunicar con Alexa o con Google Home.

Creación de visualizador.

1. En la sección dashboard, se agrega un nuevo dashboard.

2. Se agrega un nombre.

3. Se añade un visualizador de variable del mismo tipo en la que se creó en el Thing, es decir, de tipo Colored light.

Y listo, esta es la configuración de Arduino cloud. Ahora solo falta el código.

Código de arduino.

En el código se harán las siguientes configuraciones.

En thingProperties.h:

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
#include "arduino_secrets.h"

const char DEVICE_LOGIN_NAME[]  = "f590db35-0a98-422b-bb56-acb87dfe76db";

const char SSID[]               = SECRET_SSID;    // Network SSID (name)
const char PASS[]               = SECRET_OPTIONAL_PASS;    // Network password (use for WPA, or use as key for WEP)
const char DEVICE_KEY[]  = SECRET_DEVICE_KEY;    // Secret device password

void onDHCastThingChange();

CloudColoredLight dHCastThing;

void initProperties(){

  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.addProperty(dHCastThing, READWRITE, ON_CHANGE, onDHCastThingChange);

}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

En arduino_secrets.h:

En el Arduino secrets, se pueden colocar los datos sensibles que tendrá el código, en este caso, será el secret device key y las credenciales de la red wifi a la que se conectará el dispositivo.

#include <Arduino_ConnectionHandler.h>

#define SECRET_DEVICE_KEY "ulQg1kzflSUSWhVITRGCgW3hA"
/* A complete list of supported boards with WiFi is available here:
 * https://github.com/arduino-libraries/ArduinoIoTCloud/#what
 */
#if defined(BOARD_HAS_WIFI)
  #define SECRET_SSID "ADG1234"
  #define SECRET_OPTIONAL_PASS "1234567810"
#endif

/* ESP8266 ESP32 */
#if defined(BOARD_HAS_SECRET_KEY)
  
#endif

/* MKR GSM 1400 */ /* MKR NB 1500 */ /* Portenta CAT.M1/NB IoT GNSS Shield */
/* Portenta H7 and C33 + Portenta Mid Carrier + 4G Module */
#if defined(BOARD_HAS_GSM) || defined(BOARD_HAS_NB) || \
    defined(BOARD_HAS_CATM1_NBIOT) || defined(BOARD_HAS_CELLULAR)
  #define SECRET_PIN ""
  #define SECRET_APN ""
  #define SECRET_LOGIN ""
  #define SECRET_PASS ""
#endif

/* MKR WAN 1300/1310 */
#if defined(BOARD_HAS_LORA)
  #define SECRET_APP_EUI ""
  #define SECRET_APP_KEY ""
#endif

/* Portenta H7 + Ethernet shield */
#if defined(BOARD_HAS_ETHERNET)
  #define SECRET_OPTIONAL_IP ""
  #define SECRET_OPTIONAL_DNS ""
  #define SECRET_OPTIONAL_GATEWAY ""
  #define SECRET_OPTIONAL_NETMASK ""
#endif

En el main:

En el main solo vamos a hacer tres cosas, crear la configuración inicial, las funciones extra para el tratamiento de datos y la lógica principal de lectura en lo que hay en Arduino cloud.

Se incluyen la librerías que vamos a utilizar, en este caso, las del thingProperties que a su vez utiliza las de arduino cloud y las de Neopixel para el manejo de la tira RGB:

Configuro la tira RGB:

Creo las declaraciones de funciones y variables para utilizar en mi lógica principal:

En void setup inicializo mis comunicaciones:

En void loop coloco mi lógica principal que solo dirá que cada tres segundos verifique si arduino cloud está conectado, si está conectado, solo actualizo mis datos de arduino cloud, y si no está conectado, hago la reconexión de arduino cloud.

Ahora creo una función de conversión de tipo de sistema digital de representación del color. Esta función convierte la nomenclatura HSL del color que llega de arduino cloud a un RGB normal que es la nomenclatura que solemos trabajar en Arduino. Recibe los parámetros HUE, Saturation, ligh, y retorna los parámetros R, G y B.

Finalmente la función más importante, esta función que define lo que se hace cuando hay un cambio de información de arduino cloud, fue declarada en el thingProperties, y a su vez dicho thingProperties se puede obtener del generado en la plataforma de Arduino Cloud, en este caso, defino una lógica, que cada vez que se ejecute esta función, es decir, que exista un cambio de variables en la nube de Arduino Cloud, haga una conversión de los datos de color de la nube que obtengo con getHue y getSaturation del objeto dHCastThing, luego simplemente limpio los pixeles de mi tira RGB WS2812B y vuelvo a asignar el mismo color a todos mis pixeles de la tira RGB, finalmente, muestro el resultado.

Y listo, así de fácil es acomodar nuestra propia tira RGB con Arduino Cloud, y hay muchas otras cosas que se pueden hacer y que estaremos repasando próximamente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll to Top