Automação residencial com ESP8266 e Alexa

Alexa com Esp8266

Fala pessoal tudo beleza? Vocês pediram um tutorial com a Alexa e nós atendemos os pedidos de vocês! O projeto de hoje é sobre automação residencial com ESP8266 e Alexa (Echo dot da Amazon). Estão preparados para controlar a casa toda com comandos de voz? Então vamos lá!

Lista de Materiais

E aqui na Arduino Ômega temos um Kit dedicado para Internet das Coisas, ideal para você reproduzir este tutorial!

Montagem do Circuito

Caso você ainda não tenha familiaridade com o ESP8266, nós temos um tutorial muito bacana de introdução para esta plaquinha magnifica, clique aqui para ler o nosso tutorial de introdução ao ESP8266.

A montagem do circuito começa conectando a ESP8266 na protoboard, para ligarmos o módulo Relê à placa, usaremos os pinos D1 e D2 da placa, no módulo o fio que sai de D1 liga-se no IN1 já o que sai de D2 ao IN2. Para alimentar o componente, ligaremos o GND do módulo no GND da placa e o VCC do módulo na saída 3V da placa. Tudo isto está presente no esquema abaixo. 

Esquema do circuito elétrico.

Programando!

Usaremos as bibliotecas fauxmoESP e ESPAsyncTCP para realizar a comunicação da Alexa com os dispositivos ligados aos Relês, para fazer o download da primeira clique aqui e da segunda clique aqui.

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#define RELAY_PIN_1 12
#define RELAY_PIN_2 14
#else 
#define RELAY_PIN_1 5
#define RELAY_PIN_2 4
#endif
#include "fauxmoESP.h"
#define SERIAL_BAUDRATE 115200

#define WIFI_SSID "House_Bennett_WGO_Fibra"
#define WIFI_PASS "joaopedropreguicinha"

#define TOM "Tv"
#define LAMP "Lâmpada 1"

fauxmoESP fauxmo;

// Conexão WiFi
void wifiSetup(){

  //Define o como STA
  WiFi.mode(WIFI_STA);

  //Conecta 
  Serial.printf("[WIFI] Conectado ao %s", WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  // Espera 
  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(100);
  }
  Serial.println();

  //Conectado
  Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(),WiFi.localIP().toString().c_str());
  }
  
void setup() {
  // Inicia a Serial 
  Serial.begin(SERIAL_BAUDRATE);
  Serial.println();

  // Conexão WiFi
  wifiSetup();

  //Dispositivos a serem ligados
  pinMode(RELAY_PIN_1, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);

  pinMode(RELAY_PIN_2, OUTPUT);
  digitalWrite(RELAY_PIN_2,HIGH);
 
  // Por padrão, fauxmoESP cria seu próprio servidor web na porta definida
  // A porta TCP deve ser 80 para dispositivos gen3 (o padrão é 1901)
  // Isso deve ser feito antes da chamada enable()
  fauxmo.createServer(true); // Cria o servidor
  fauxmo.setPort(80); // Necessário para os dispositivos gen3

  // Você deve chamar enable(true) assim que tiver uma conexão WiFi
  // Você pode ativar ou desativar a biblioteca a qualquer momento
  // Desativá-lo impedirá que os dispositivos sejam descobertos e trocados
  fauxmo.enable(true);

  // Você pode usar diferentes maneiras de chamar a Alexa para modificar o estado dos dispositivos:
  // "Alexa, ligar Ventilador"

  // Adiciona os dispositivos 
  fauxmo.addDevice(TOM);
  fauxmo.addDevice(LAMP);

  fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
    // Retorno de chamada quando um comando da Alexa é recebido.
    // Você pode usar device_id ou device_name para escolher o elemento no qual realizar uma ação (relé, LED, ...)
    // O state é um booleano (ON / OFF) e value um número de 0 a 255 (se você disser "definir a luz da cozinha para 50%", receberá 128 aqui).

    Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
    if ( (strcmp(device_name, TOM) == 0) ) {
      Serial.println("RELAY 1 switched by Alexa");
      //digitalWrite(RELAY_PIN_1, !digitalRead(RELAY_PIN_1));
      if (state) {
        digitalWrite(RELAY_PIN_1, LOW);
      } else {
        digitalWrite(RELAY_PIN_1, HIGH);
      }
    }
    if ( (strcmp(device_name, LAMP) == 0) ) {
      // Esse comando define a variavel da função para realizar alguma ação
      Serial.println("RELAY 2 switched by Alexa");
      if (state) {
        digitalWrite(RELAY_PIN_2, LOW);
      } else {
        digitalWrite(RELAY_PIN_2, HIGH);
      }
    }
  });


}

void loop() {
  // fauxmoESP usa um servidor TCP assíncrono, mas um servidor UDP sincronizado
  // Portanto, temos que pesquisar manualmente os pacotes UDP
  fauxmo.handle();

  static unsigned long last = millis();
  if (millis() - last > 5000) {
    last = millis();
    Serial.printf("[MAIN] Free heap: %d bytes\n", ESP.getFreeHeap());
  }

}

Aprofundando no código

Logo no início incluiremos todas as bibliotecas que serão utilizadas no projeto, definimos os nomes dos equipamentos a serem ligados pela Alexa e também colocaremos o SSID e senha do seu WiFi.

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#define RELAY_PIN_1 12
#define RELAY_PIN_2 14
#else 
#define RELAY_PIN_1 5
#define RELAY_PIN_2 4
#endif
#include "fauxmoESP.h"
#define SERIAL_BAUDRATE 115200

#define WIFI_SSID "Nome do Seu WiFi"
#define WIFI_PASS "Senha do seu WiFi"

#define TOM "Tv"
#define LAMP "Lâmpada 1"

fauxmoESP fauxmo;

Agora iremos configurar a conexão WiFi. Primeiro criaremos uma função chamada wifiSetup() e dentro dela será realizado todo o processo de configuração conforme o código abaixo. 

// Conexão WiFi
void wifiSetup(){

  //Define o como STA
  WiFi.mode(WIFI_STA);

  //Conecta 
  Serial.printf("[WIFI] Conectado ao %s", WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  // Espera 
  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(100);
  }
  Serial.println();

  //Conectado
  Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(),WiFi.localIP().toString().c_str());
  }

Função Void setup()

Primeiramente configuramos o monitor serial e a conexão WiFi, logo após definimos os pinos do Relê como OUTPUT e como HIGH, pois usaremos a entrada sempre aberto do módulo Relê. Mais adiante criaremos um servidor pela biblioteca fauxmo e definimos a porta para 80. Adicionaremos os dispositivos e configuramos o retorno do programa quando algum comando da alexa for recebido.

void setup() {
  // Inicia a Serial 
  Serial.begin(SERIAL_BAUDRATE);
  Serial.println();

  // Conexão WiFi
  wifiSetup();

  //Dispositivos a serem ligados
  pinMode(RELAY_PIN_1, OUTPUT);
  digitalWrite(RELAY_PIN_1, HIGH);

  pinMode(RELAY_PIN_2, OUTPUT);
  digitalWrite(RELAY_PIN_2,HIGH);
 
  // Por padrão, fauxmoESP cria seu próprio servidor web na porta definida
  // A porta TCP deve ser 80 para dispositivos gen3 (o padrão é 1901)
  // Isso deve ser feito antes da chamada enable()
  fauxmo.createServer(true); // Cria o servidor
  fauxmo.setPort(80); // Necessário para os dispositivos gen3

  // Você deve chamar enable(true) assim que tiver uma conexão WiFi
  // Você pode ativar ou desativar a biblioteca a qualquer momento
  // Desativá-lo impedirá que os dispositivos sejam descobertos e trocados
  fauxmo.enable(true);

  // Você pode usar diferentes maneiras de chamar a Alexa para modificar o estado dos dispositivos:
  // "Alexa, ligar Ventilador"

  // Adiciona os dispositivos 
  fauxmo.addDevice(TOM);
  fauxmo.addDevice(LAMP);

  fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
    // Retorno de chamada quando um comando da Alexa é recebido.
    // Você pode usar device_id ou device_name para escolher o elemento no qual realizar uma ação (relé, LED, ...)
    // O state é um booleano (ON / OFF) e value um número de 0 a 255 (se você disser "definir a luz da cozinha para 50%", receberá 128 aqui).

    Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
    if ( (strcmp(device_name, TOM) == 0) ) {
      Serial.println("RELAY 1 switched by Alexa");
      //digitalWrite(RELAY_PIN_1, !digitalRead(RELAY_PIN_1));
      if (state) {
        digitalWrite(RELAY_PIN_1, LOW);
      } else {
        digitalWrite(RELAY_PIN_1, HIGH);
      }
    }
    if ( (strcmp(device_name, LAMP) == 0) ) {
      // Esse comando define a variavel da função para realizar alguma ação
      Serial.println("RELAY 2 switched by Alexa");
      if (state) {
        digitalWrite(RELAY_PIN_2, LOW);
      } else {
        digitalWrite(RELAY_PIN_2, HIGH);
      }
    }
  });


}

Função Void loop()

Nessa função a biblioteca fauxmoESP utiliza um servidor assíncrono, mas um servidor UDP sincronizado, portanto temos que pesquisar manualmente os pacotes UDP. Pelo comando fauxmo.headle(). E também temos um código para imprimir no monitor serial a quantidade de bytes que está sendo usada.

void loop() {
  fauxmo.handle();

  static unsigned long last = millis();
  if (millis() - last > 5000) {
    last = millis();
    Serial.printf("[MAIN] Free heap: %d bytes\n", ESP.getFreeHeap());
  }

}

Conexão pelo aplicativo Alexa

Você pode achar o aplicativo Alexa na loja de seu dispositivo ou pelos links abaixo:

Android: https://play.google.com/store/apps/details?id=com.amazon.dee.app
IOS: https://apps.apple.com/br/app/amazon-alexa/id944011620?l=en

Após baixar o app, você deverá criar um login e senha. Sendo assim, você irá clicar na aba dispositivos.

Logo depois clicará em adicionar dispositivo, conforme mostra a imagem abaixo:

Depois clique em Adicionar dispositivos, como pode ser visto abaixo:

Após isso arraste pra baixo e clique em Outros:

Clique em detectar dispositivos:

Espere a Alexa procurar os dispositivos próximos.

Logo após isso, de primeira a Alexa provavelmente não reconhecerá nenhum dispositivo, você deve retirar o cabo de alimentação e conecta-lo após alguns segundos e realizar todo o procedimento acima. Dessa vez ira aparecer a seguinte imagem

Depois de clicar em avançar, selecione qual dispositivo quer configurar primeiro

Ao selecionar qualquer um dos dispositivos aparecerá uma página questionando se você deseja adicionar ele a algum grupo, se não quiser basta clicar em “Pular”

E pronto seus dispositivos já estão todos devidamente configurados! Abaixo temos um vídeo de demonstração desse tutorial em funcionamento:

Conclusão

A princípio nós temos a tendência de pensar que controlar dispositivos por comandos de voz é algo complexo, mas como vimos neste tutorial, fazer uma integração com a Alexa usando o ESP8266 é algo relativamente simples e com um custo razoavelmente baixo, assim sendo, uma automação residencial com ESP8266 e Alexa está longe de ser um bicho de sete cabeças! Se tiverem dúvidas por favor comente abaixo que a gente sempre tenta ajudar. Abraços e até a próxima!

Referências:

Github da Lib ESPAsyncTCP

Biblioteca fauxmoesp

Sobre João Pedro Bennett 1 artigo
Graduando em Matemática Industrial

1 Trackback / Pingback

  1. Acionamento de cargas com NodeMCU e módulo relé de 4 canais

Deixe uma resposta

O seu endereço de email não será publicado.


*