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