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
- Esp8266 NodeMCU
- Módulo Relê 4 canais
- Jumpers Macho/Fêmea
- Protoboard
- Soquete
- Tomada
- Fios de energia
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.

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:
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!


Deixe uma resposta