Controlando o ESP32 por comandos de voz via Google Assistant 12

Atualmente os assistentes de voz estão cada vez mais presentes no cotidiano das pessoas, muitas já utilizam os dispositivos em suas residências permitindo a interação e controle de diversos aparelhos como TV, ar condicionado, iluminação entre outros. Neste post mostraremos como é possível fazer a integração do ESP32 com um dos assistentes de voz mais conhecidos, o Google Assistant.

Esse projeto pode ser modificado para diversas aplicações como acionamento de eletroeletrônicos ou abertura/fechamento de portas.

Material necessário

Para controlar o ESP32 por comandos de voz via Google Assistant você precisará dos seguintes componentes:

Serviços Web Utilizados

Para controlar o ESP32 por comandos de voz utilizaremos, além do Google Assistant, alguns serviços para fazer conexão com o hardware. São eles:

Para saber mais sobre o Adafruit IO, acesse o seguinte post: Adafruit IO – Uma nova plataforma de IoT

Circuito

Com todos os componentes em mãos vamos à montagem do circuito. Abaixo temos o esquemático eletrônico montado em protoboard:

ESP32 e Google Assistant
Figura 1 – Esquemático eletrônico

Configuração Adafruit IO

Após realizada a montagem em protoboard, nós utilizaremos o servidor Adafruit IO para comandar a placa através da comunicação IFTTT. Precisamos criar botões para realizar a leitura do LDR e para acionar cada um dos LEDs.

Para começar a configuração acesse o site Adafruit IO. Clique em “Get Started for Free” e crie uma conta.

Início das configurações do Adafruit IO
Figura 2 – Adafruit IO passo 1

Após criada a conta clique em “Sign In” para conectar sua conta. Clique em “Dashboards” e depois “view all”.

Adafruit IO passo 2
Figura 3 – Adafruit IO passo 2
Adafruit IO passo 3
Figura 4 – Adafruit IO passo 3

Clique em “Actions” para criar um novo dashboard.

Adafruit IO passo 4
Figura 5 – Adafruit IO passo 4

Insira o nome do dashboard e clique em “Create”. Após isso aparecerá a dashboard com o nome criado.

Figura 6 – Adafruit IO passo 5
Figura 7 – Adafruit IO passo 6

Dê um duplo clique no nome para abrir a interface com o usuário. Aparecerá uma tela como a imagem abaixo.

Figura 8 – Adafruit IO passo 7

Clique no ícone azul com o sinal “+” para inserir os objetos e depois selecione “Toggle”.

Figura 9 – Adafruit IO passo 8
Figura 10 – Adafruit IO passo 9

Insira o nome da variável e clique em “Create” seguindo as imagens que apareceram em sequência abaixo. Obs: os nomes definidos abaixo não devem ser alterados, se caso feita alguma alteração, deverá também ser feita a alteração no código de programação.

Figura 11 – Adafruit IO passo 10

Repita o mesmo procedimento para os demais. Ao final dessas etapas a sua tela ficará assim:

Figura 12 – Adafruit IO Passo 11

Agora vamos configurar cada variável, para isso siga os passos abaixo. Na lista “Group/Feed” selecione “LED Branco” e clique em “Next Step”.

Figura 13 – Adafruit IO Passo 12

Como mostra a imagem abaixo, coloque o nome em “Block Tittle” e mude os campos ON e OFF para 1 e 0, respectivamente.

Figura 14 – Adafruit IO passo 13
Figura 15 – Adafruit IO passo 14

Após isso clique em “Create Block”.

Figura 16 – Adafruit IO passo 15

Repita o mesmo procedimento para os demais LEDs. Ao final do procedimento teremos uma tela com os botões mostrados na imagem abaixo:

Figura 17 – Adafruit IO passo 16

Agora vamos as variáveis de “Alarme” e “Status Alarme”. Assim como o LED criaremos um botão para a variável “Alarme”. Então selecione o “Toggle”, selecione a variável “Alarme” na lista de “Group/Feed” e clique em “Next Step”.

Figura 18 – Adafruit IO passo 17

Defina o nome como Alarme e mude o ON e OFF para 1 e 0, depois clique em “Create Block”.

Figura 19 – Adafruit IO passo 18

Para última etapa teremos a variável de “Status Alarme” que ao invés de adicionarmos um botão, usaremos o “Indicator”. Ao adicionar um novo item no dashboard procure e selecione “Indicator” como mostra a imagem abaixo.

Figura 20 – Adafruit IO passo 19

Na lista selecione a variável “Status Alarme” e defina os parâmetros como demonstrados abaixo.

Figura 21 – Adafruit IO passo 20
Figura 22 – Adafruit IO passo 20

Em “Conditions” defina como “=” e atribua o valor para 1 e depois clique em “Create Block”.

Figura 23 – Adafruit IO passo 21

O resultado final será algo semelhante a imagem abaixo:

Resultado final Adafruit IO com ESP32 e Google Assistant
Figura 24 – Adafruit IO passo 21

Para concluirmos a configuração do servidor, precisamos obter o Usuário e a Chave de comunicação para utilizarmos posteriormente na programação do ESP32.

Para esse procedimento clique no ícone em amarelo com o desenho de uma chave como mostra a imagem abaixo.

Figura 25 – Adafruit IO passo 22

Copie o “Username” e a “Active Key” no bloco de notas para utilizarmos posteriormente. Após isso concluímos as configurações na Adafruit.

Figura 26 – Adafruit IO passo 23

Programação

Na Arduino IDE vá em Arquivos > Preferências e adicione o link abaixo em “URLs Adicionais para Gerenciadores de Placas” e clique em OK.

https://dl.espressif.com/dl/package_esp32_index.json

Depois vá em Ferramentas > Placas > Gerenciador de Placas… e pesquise ESP32 e clique em instalar.

ESP32 no gerenciador de placas
Figura 27 – Gerenciador de Placas Arduino

Após instalado a placa vá em Ferramentas > Placa e selecione a placa ESP32 Dev Module.

Figura 28 – Selecionando placa

Após isso vá em Sketch > Incluir Biblioteca > Gerenciar Bibliotecas… e pesquise Adafruit MQTT e instale.

Figura 29 – Download biblioteca

Agora podemos ir ao código para descarregar na ESP32. No início do código precisaremos colocar os parâmetros da rede WiFi e do servidor da Adafruit que anotamos anteriormente.

Adicione o nome da sua Rede Wifi e Senha, adicione também o Username e o Active Key obtidos anteriormente no Dashboard já criado.

Figura 30 – Dados do servidor

Abaixo está o código para controlar o ESP32 por comandos de voz via Google Assistant:

//Bibliotecas utilizadas
#include <WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

//Definição dos pinos
#define LED_conexao  23
#define LED_azul     27
#define LED_verde    26
#define LED_vermelho 33
#define LED_branco   32
#define buzzer       14
#define LDR          36

#define WLAN_SSID       "nomedarede"      // Nome da Rede Wifi
#define WLAN_PASS       "senhadarede"     // Senha da Rede Wifi

/************************* Adafruit.io Configuração *********************************/

#define AIO_SERVER      "io.adafruit.com" //Adafruit Servidor
#define AIO_SERVERPORT  1883                  
#define AIO_USERNAME    "YYYYYYYYY"      //Insira o usuario criado na adafruit io
#define AIO_KEY         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" //Insira a chave de comunicação obtida na adafruit io

//Váriáveis utilizadas

int conectado = 1;
int conexao = 0;
int alarme = 0;
int trava = 0;

unsigned long anterior = 0;
unsigned long intervalo = 15000;
unsigned long atual;

//Definição do Wifi Client
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

//Váriáveis criadas para comunicação com o MQTT
Adafruit_MQTT_Publish   sensor = Adafruit_MQTT_Publish  (&mqtt, AIO_USERNAME "/feeds/Status Alarme");   // Crie aqui sua variavel
Adafruit_MQTT_Subscribe Light1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED Azul");        // a palavra feeds deve estar em todos
Adafruit_MQTT_Subscribe Light2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED Verde");    
Adafruit_MQTT_Subscribe Light3 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED Vermelho");
Adafruit_MQTT_Subscribe Light4 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED Branco");
Adafruit_MQTT_Subscribe Light5 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Alarme");

//Funções
void MQTT_connect(); //Determina a conexão MQTT
void Conectar();     //Verifica a conexão o Wifi

void setup() {

  Serial.begin(115200);

  //Definição de saida e entrada de cada pino
  pinMode(LED_conexao,OUTPUT);
  pinMode(LED_azul,OUTPUT);
  pinMode(LED_verde,OUTPUT);
  pinMode(LED_vermelho,OUTPUT);
  pinMode(LED_branco, OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(LDR,INPUT);

  //Desliga o LED de status de conexão do Wifi
  digitalWrite(LED_conexao,LOW);
  
  //Declaração de Tópicos de Leitura
  mqtt.subscribe(&Light1);
  mqtt.subscribe(&Light3);
  mqtt.subscribe(&Light2);
  mqtt.subscribe(&Light4);
  mqtt.subscribe(&Light5);

}

void loop() {

  Conectar();
  MQTT_connect();

  //Leitura do valor recebido através da Adafruit IO
  Adafruit_MQTT_Subscribe *subscription;
  if((subscription = mqtt.readSubscription(100))) {
    if (subscription == &Light1) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light1.lastread);
      int Light1_State = atoi((char *)Light1.lastread);
      digitalWrite(LED_azul, Light1_State);
    }
    if (subscription == &Light2) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light2.lastread);
      int Light2_State = atoi((char *)Light2.lastread);
      digitalWrite(LED_verde, Light2_State);
    }
    if (subscription == &Light3) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light3.lastread);
      int Light3_State = atoi((char *)Light3.lastread);
      digitalWrite(LED_vermelho, Light3_State);
    }
    if (subscription == &Light4) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light4.lastread);
      int Light4_State = atoi((char *)Light4.lastread);
      digitalWrite(LED_branco, Light4_State);
    }
    if (subscription == &Light5) {
      Serial.print(F("Got: "));
      Serial.println((char *)Light5.lastread);
      int Light5_State = atoi((char *)Light5.lastread);
      alarme = Light5_State;
    }
  }
  if(alarme){
    //Leitura do LDR
    int leitura = analogRead(LDR);
    Serial.println(leitura);
    if(leitura < 2900){
      trava = 1;
      //Buzzer tocando intermitente
      digitalWrite(buzzer,HIGH);
      delay(500);
      digitalWrite(buzzer,LOW);
      delay(500);
    }
    atual = millis();
    if (atual - anterior > intervalo)
    {    
        if(trava == 1){
          //Tópico de publicação de acionamento do sensor
          sensor.publish(1);
          trava = 0;
        }
        else{
          //Tópico de publicação de desacionamento do sensor
          sensor.publish(0);
        }
        anterior = atual;
     }
  }
  else{
     //Desliga Buzzer
     digitalWrite(buzzer,LOW);
     trava = 0;
     atual = millis();
     if (atual - anterior > intervalo)
     {   
          sensor.publish(0);
          anterior = atual;
     }
  }
}

void MQTT_connect() {
  int8_t ret;
  //Conectando MQTT
  if (mqtt.connected()) {
    if(conectado){
      conectado = 0;
      Serial.println("MQTT Conectado!");
    }
    return;
  }
  Serial.print("Conectando MQTT...");
  uint8_t retries = 3;
  if((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Reconexao ao MQTT em 5 segundos...");
    mqtt.disconnect();
    delay(5000);
    conectado = 1;
    //retries--;
    if (retries == 0) {
      //retries = 3;
    }
  }
}

void Conectar(){
  //Verifica a conexão wifi
  if(WiFi.status() != WL_CONNECTED){
      conexao = 0; 
      //Conectando ao Wifi
      Serial.println();
      Serial.println();
      Serial.print("Conectando a rede: ");
      Serial.println(WLAN_SSID);
      //Inicializa Conexão Wifi
      WiFi.begin(WLAN_SSID, WLAN_PASS);
      while(WiFi.status() != WL_CONNECTED) {
            digitalWrite(LED_conexao,LOW);
            delay(100);
            digitalWrite(LED_conexao,HIGH);
            delay(100);
            Serial.print(".");
            conexao++;
            if(conexao == 30){
              ESP.restart();
            }
      }
      Serial.println("WiFi conectado!");
      Serial.println("Endereco de IP: ");
      Serial.println(WiFi.localIP());
      digitalWrite(LED_conexao,HIGH);
      conectado = 1;
      Serial.println();
  }
}

Após descarregado o código vá no dashboard e tente acionar os LEDs através dos botões note que já é possível controlá-los.

Para finalizar o projeto concluiremos com a configuração do IFTTT e do aplicativo Google Assistant no smartphone.

Configuração IFTTT

Para configuramos o IFTTT é necessário também criar uma conta onde poderemos vincular a conta criada no Adafruit IO para interagirmos com o Google Assistant. Acesse o site a seguir e faça login com uma conta do Google.

Configurando IFTTT para ESP32 e Google Assistant
Figura 31 – IFTTT passo 1

Após logar com uma conta do Google vá no perfil e clique em “Create”.

Google assistant no IFTTT
Figura 32 – IFTTT passo 2

Vai aparecer esta tela e então clique em “If This”.

Figura 33 – IFTTT passo 3

Pesquise por ”Google Assistant” no campo de busca e clique no mesmo. Obs: Na primeira vez vai pedir autorização.

Selecionando a Google Assistant no IFTTT
Figura 34 – IFTTT passo 4

Clique em “Say a simple phrase”.

Figura 35 – IFTTT passo 5

Na tela “Complete triggers fields” vamos definir os comandos de voz que serão utilizados através do app “Google Assistant”. Para cada LED será necessário aplicar dois comandos um para desligar e outro para ligar como o exemplo abaixo.

Figura 34 – IFTTT passo 6
Figura 36 – IFTTT passo 7

Depois de preencher os campos clique em Create e depois clique em “That”.

Figura 37 – IFTTT passo 8

Pesquise por “Adafruit” clique no mesmo e vincule sua conta.

Figura 38 – IFTTT passo 9

Clique em “Send data to Adafruit IO”.

Figura 39 – IFTTT passo 10

Em “Complete action fields” selecione a variável que nós escolhemos para dar o comando, no caso utilizamos o comando “Turn on the LED White” que será utilizado para ligar o LED Branco, então selecionaremos a “variável LED Branco” e definiremos o “Data to save” para 1.

Figura 40 – IFTTT passo 11

Após clicar em “Create” clique em “Finish”, para configurar o desligamento do LED faça o mesmo procedimento criando outro comando “Turn off the LED White” e definindo o “Data to save” para 0.

Configuração Feed para o IFTTT controlar ESP32 com Google Assistant
Figura 41 – IFTTT passo 12
Figura 42- IFTTT passo 13
IFTTT para Google Assistante controlar ESP32
Figura 43 – IFTTT passo 14
IFTTT para Google Assistante controlar ESP32
Figura 44 – IFTTT passo 15

Bom agora como desafio crie os comandos para os outros LEDs o vermelho, verde e azul, o Alarme fica a seu critério de escolha qual comando irá ativá-lo.

Configuração Google Assistant

Para controlando o ESP32 por comandos de voz  nós vamos finalizar o projeto adicionando os comandos ao Google Assistant. Em seu smartphone se caso não estiver instalado baixe o app na Play Store em seguida faça login com a conta do Google utilizada para vincular o IFTTT.

Ao abrir o app vá na página do seu perfil e procure pela aba “Assistente” e navegue até “Rotinas”, clique em “+ Acionar uma rotina” e siga os passos nas imagens abaixo.

Configuração da Google Assistant para funcionar com ESP32
Figura 45 – Google Assistant passo 1

Crie a rotina também para desligar o LED.

Rotina da Google Assistant para funcionar com ESP32
Figura 46 – Google Assistant passo 2

Resultado

Bom agora só testar o comando e usar sua criatividade para melhorar o projeto, e como desafio explorar os acionamentos dos outros LEDs e do Buzzer apenas aplicando a implantação dos comandos necessários como você já observou anteriormente.

Gostou de aprender a controlar o ESP32 por comandos de voz via Google Assistant? Deixe seu comentário logo abaixo.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

12 Comentários

  1. Muito bom garoto…”TOP”. Parabéns.

  2. Opa, top Felipe!

    ESDRAS SANTOS DO PRADO
  3. Parabéns pelo projeto!

    Projeto 5 estrelas!

    Bem detalhado e explicativo!!

  4. Muito bom o projeto! Para fazer com a Alexa como q seria?

    1. Boa noite Gustavo! Creio que em breve será postado como fazer com a Alexa, pois já tem um post em andamento.

      Felipe Santos do Nascimento
  5. Boa tarde!
    Excelente tutorial! Parabéns!
    Gostaria de tirar um dúvida.
    Como ainda não tenho o arduino, fiz apenas o dashboard no Adafruit IO e depois criei a integração no ITFFF e a rotina no Google Assistent do meu celular Android conforme orientado para ver se o painel muda com o comando de voz, porém quando faço o comando de voz no google Assist ele não cria a integração com o ITFFF e faz uma “busca” como o que falei.
    Em que lugar devo ter errado? rs

    1. Boa tarde Marone! Obrigado pela leitura. Isso ocorreu comigo durante os testes, indico a você desativar e ativar o service do Google assistant no IFTTT, depois tente dar o comando em inglês pelo Google Assistant se caso acionar a rotina em português funcionará, espero ter ajudado!

      Abraço!

      Felipe Santos do Nascimento
  6. boa tarde ficou top, no caso deste projeto voce fala ”ligar led branco” ele liga ate ai tudo bem, mas no caso eu colocar um sensor de temperatura no esp32 e eu falar “ok google qual e a temperatura” tem como o google ler essa variavel e me dizer?

    reginaldo aparecido lemes
    1. Boa tarde Reginaldo! Muito obrigado pela leitura! E sim tem como fazer o que você disse, sugiro a você dar uma pesquisada na internet sobre inteligência artificial com Google Home e ESP32. Espero ter ajudado! Abraços!

      Felipe Santos do Nascimento
  7. Olá Felipe parabéns pelo trabalho, eu queria saber se posso ao invés de ligar led lugar relés para comandar luzes da casa, mas sem alterar a programação que está ali no tópico apenas mudar o nome em vez de led azul por exemplo para luz da cozinha?

    1. Bruno obrigado pela leitura! Peço desculpas pela demora em responder. Sim consegue fazer, isso mesmo que você descreveu na pergunta, apenas troque para o exemplo que você descreveu irá funcionar certinho, só tem um porém, o módulo relé liga com LOW e desliga com HIGH então sem alterar o código de programação recomendo a você ligar a lâmpada no contato Comum e no contato NF.

      Espero ter ajudado! Abraços.

      Felipe Santos do Nascimento
  8. Boa tarde.
    Obrigado pelo tutorial. Funcionou bem. Só um problema: após alguns minutos o esp para de receber o sinal enviado pelo adafruit. aparentemente ainda está conectado a rede, pois consigo pingar, porém já não muda o estado do LED.
    Teria alguma sugestão para o problema?

    Lucas Wilke Dalla Rosa