Underc0de

Informática => Electrónica y Robótica => Arduino - Raspberry PI => Mensaje iniciado por: Ruleman en Abril 21, 2020, 04:58:09 PM

Título: Ok Google...Arduino!
Publicado por: Ruleman en Abril 21, 2020, 04:58:09 PM
(https://i.imgur.com/zEUrSHim.jpg)

Ok Google.....Arduino!

Hola a todos, hoy les traigo un tutorial para que puedan conectar Arduino con un ESP8266 y poderlo usar con el Asistente de Google.

Si bien como Arduino es open source podemos encontrar este mismo tutorial en muchos lados y de formas distintas, es por eso que comparto este material para los amantes de la domótica o makers de Arduino sin la necesidad de gastar tanto dinero en otras formas de automatizar como lo es el sonoff u otro que exista en el mercado.


ESP8266

(https://i.imgur.com/gSkXbVfm.jpg)

El ESP8266 es un chip de bajo costo con un stack TCP/IP y a su vez es un microcontrolador independientemente a la conexión a WiFi. A este lo podemos encontrar en un módulo para Arduino o lo podemos encontrar en placas como NodeMCU, Wemos, entre otros tanto. En mi caso usaré un Wemos D1 mini Pro que ya tiene incorporado el ESP8266.

(https://i.imgur.com/FxAdPZIm.jpg)

Lo primero que tenemos que hacer es conectarnos a Adafruit IO (https://io.adafruit.com/ (https://io.adafruit.com/)). Esta plataforma gratuita que trabaja con el protocolo MQTT (Message Queuing Telemetry Transport) este protocolo de red de publicación-suscripción que transporta mensajes entre dispositivos.
Esto nos permite conectarnos en cualquier parte del mundo, para poder revisar sensores o automatizar con el uso de Google Assitent.
Esto funciona de la siguiente manera, el ESP8266 publica o envía información al MQTT Broker que es el encargado de enviar y recibir a los diferentes dispositivos conectados.
Luego usaremos IFTTT (el valor de sus siglas es: "If  This Then That", link: https://ifttt.com/ (https://ifttt.com/)) para vincular nuestro Placa y Adafruit IO con los servicios de IFTTT combinando condiciones y acciones para poder así automatizar lo que se nos ocurra.


(https://i.imgur.com/zXKjUCx.png)

Empecemos!

Primero tenemos que crear una cuenta en Adafruit IO para poder cargar nuestro feeds.
Para crear un Feeds, nos vamos a la pestaña con el mismo nombre y  en Actions/ Create a New Feed.



(https://i.imgur.com/IvHw2nG.png)

(https://i.imgur.com/f2RY90p.png)

Nos aparecerá una nueva ventana que le vamos a poner un nombre y una descripción. En mi caso le puse lights y no agregue descripción, eso es opcional. Luego presionamos Crerate.

(https://i.imgur.com/vuZxhcj.png)

Una vez creado nos dirigimos donde dice Adafruit IO Key, esto nos proporcionara un nombre de usuario y contraseña para poder vincular nuestra placa. Yo tape los valores porque justamente lo estoy usando para esta práctica.


(https://i.imgur.com/3bRv9gm.png)

(https://i.imgur.com/XNkuAmf.png)

Una vez realizado este paso, nos dirigiremos a la página de IFTTT para crear un usuario con la cuenta de Google o la que ustedes deseen.
Vamos al icono de nuestro perfil y seleccionamos "Create".


(https://i.imgur.com/0uMFcwT.png)

(https://i.imgur.com/8RASOSz.png)

Nos aparecerá algo como lo siguiente, hacemos click en el signo de "+" y buscamos "Google Assistant" y seleccionamos la opción "Say a simple phrase".

(https://i.imgur.com/KCuHPKi.png)

(https://i.imgur.com/MG5E7jZ.png)

Ahora vamos a pasarle lo que queremos decir para que las acciones se cumplan.

(https://i.imgur.com/sQHmQTq.png)

Listo ya tenemos las instrucciones para "Encender". Seguido de esto vamos hacer nuevamente click en el signo "+" para vincular nuestro feed en Adafruit IO.

(https://i.imgur.com/Scxyhm0.png)

Seleccionamos la única opción y nos aparecerá una ventana, en este paso seleccionamos el nombre de nuestro Feed y le pasamos un valor para guardar, en este caso yo puse "1", si quieren le pueden cambiar el valor por "encender". Listo le dan a "Create action" y ya tenemos la acción de "Encender", hay que tener en cuenta que tenemos que repetir los pasos anteriores para generar la acción de "Apagar", y le ponen un "0" al "Data to Save" o simplemente "apagar" quedando de la siguiente manera.

(https://i.imgur.com/Ti5mOBc.png)

(https://i.imgur.com/iw1o0iC.png)

Ahora vamos al código que tanto están esperando.

Primero tenemos que cargar las librerías del ESP8266 y las de Adafruit_MQTT, para poder realizar el enlace.


//Incluimos las librerías mencionadas.

#include <ESP8266WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>

// Conectamos a nuestro WiFi
WiFiClient client;
#define SSID_WIFI       "Tu_SSID"
#define PASS_WIFI       "Tu_Password"

//Conexión con Adafruit IO

#define servidor  "io.adafruit.com"
#define puerto     1883
#define usuario   "Usuario"
#define API_KEY   "contraseña por la API"

Adafruit_MQTT_Client mqtt(&client, servidor, puerto, usuario, API_KEY);

//Configurar el feed de Adafruit

//acá hacemos la petición a nuestro feed.
Adafruit_MQTT_Subscribe lights = Adafruit_MQTT_Subscribe(&mqtt, usuario "/feeds/lights");

//Definimos la salida que va a tener el rele para poder conectar una lámpara.
const int rele = 5;

void setup() {
  Serial.begin(115200);
  pinMode(rele,OUTPUT);
  digitalWrite(rele, LOW);
  delay(10);
 
  // Conectarse a la red WiFi
 
  Serial.println(); Serial.println();
  Serial.print("Conectando a ");
  Serial.println(SSID_WIFI);
  WiFi.begin(SSID_WIFI, PASS_WIFI);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi Conectado");

  //  Adafruit IO

  mqtt.subscribe(&lights);

  // Conectarse a Adafruit IO
 
//Acá hacemos que conecte y si no es posible lo renitente cada 5 seg"
  int8_t ret;
  if (!mqtt.connected()) {
    Serial.print("Conectando a AdafruitIO");
    uint8_t intentos = 3;
    while ((ret = mqtt.connect()) != 0) {
         Serial.println(mqtt.connectErrorString(ret));
         Serial.println("Intentando en 5 segundos");
         mqtt.disconnect();
         delay(5000); 
         intentos--;
         
         if (intentos == 0) {
           while (1);
         }
    }
    Serial.println("\nConectado!");
  }

}

void loop() {

  //Espera recibir un mensaje que la conexión a MQTT

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(1000))) {
    //Comprobar si el mensaje es para el lights
    if (subscription == &lights) {
      //Comprobar el mensaje
      if (strcmp((char *)lights.lastread, "1") == 0){

//el valor que guardamos en IFTTT es el que vamos a analizar y comparar para que esto suceda
//si es 1 se va a encender y si es 0 apaga
       
        digitalWrite(rele, HIGH);   //Encendemos el rele
        Serial.println("\nLuz Encendida");
      } else if (strcmp((char *)lights.lastread, "0") == 0){
        digitalWrite(rele, LOW);  //Apagamos el Rele
        Serial.println("\nLuz Apagada!");
      }
    }
  }
}


Esquema de conexión.

(https://i.imgur.com/UtbXuRg.png)

Como se puede apreciar el D1 de la placa es 5 para el IDE de Arduino.

(https://i.imgur.com/tYvvXhV.png)

Anotación Importante!

La placa de Wemos tiene que ser conectada a 3.3V como máximo y el rele a 5v, por lo que van a tener que usar una fuente aparte para alimentar el relay.

Y a todo esto lo podemos controlar con el asistente de Google desde nuestro smartphone, sin necesidad de comprar nada más que el módulo!

Les dejo una imagen del trabajo terminado!

(https://i.imgur.com/j888UPs.jpg)

Yo en este caso solo lo programe para que trabaje un solo rele, pero se pueden agregar más acciones y feeds como también reles.
Bueno espero que les sirva de ayuda y lo puedan poner en práctica. Si tienen dudas o sugerencias las pueden comentar y los ayudo.

En próxima edición de la revista enviaré un aporte para controlar con otras cositas ;).


Gracias por leer y los leo!