Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


ESP32: Reconhecimento de voz com celular




Já pensou em utilizar o reconhecimento de voz com um ESP32? Hoje vou mostrar para vocês como usar este sistema através de um aplicativo de smartphone Android. Ou seja, você vai ver como conectar um ESP32 com um celular e como utilizar o reconhecimento de voz da Google. Vai ainda entender o código .ino do ESP32 e conhecer melhor este programa de reconhecimento de voz que foi feito pelo AppInventor.

Montagem


A nossa montagem é simples e composta pelo ESP, um led e um resistor de 220ohm que foi ligado na porta 23. Basta isso para nosso exemplo de hoje.
Destaco que, no lugar do led, você pode ligar um relé ou um triac, o que te possibilitará ligar aqui um ar-condicionado, uma lâmpada, entre outros dispositivos da automação residencial.

Demonstração

No vídeo você pode ver que, na parte da demonstração, temos a nossa montagem na qual o ESP32 é alimentado pela USB. A primeira coisa a fazer para trabalhar com reconhecimento de voz é, no smartphone, abrir o browser e acessar o endereço IP local do microcontrolador junto com um dos comandos programados no aplicativo, separado por barra (exemplo "http://192.168.3.120/piscar"). Neste momento, o led vai piscar, o que confirma que o celular está ligado na mesma rede que o ESP32. Na sequência, abrimos o aplicativo AppESP32 e proferimos comandos de voz que serão reconhecidos e executados pelo programa.


IDEs utilizadas

Eu sempre uso a IDE do arduino para programar o ESP32. Já no caso do AppInventor, desenvolvido pelo MIT, este gera sozinho o aplicativo para o Android.


Recursos usados


- ESP32
- Smartphone
- Led
- Resistor de 220ohm
- Protoboard


Código ESP32

ESP32 [Organização do código]

Sempre gosto de deixar um esqueleto para facilitar sua visualização em relação ao código fonte. Uma função importante é a ReadIncomingRequest, que aparece junto a um corpo de função Setup e outro de Loop.


ESP32 [Definições e Variáveis]

Nesta parte parto para diversas definições e trato das variáveis.

//lib necessária para conectar o wifi
#include <WiFi.h> 

//led conectado no pino 23
#define ledVerde 23

//mensagem enviada pelo client (aplicativo)
String ClientRequest;

//ip estático, o mesmo deve ser usado no app do smartphone
IPAddress staticIP(192,168,3,120);
//gateway, deixe aqui o gateway da rede em que está conectado
IPAddress gateway(192,168,3,255);
//máscara, deixe aqui a máscara da rede em que está conectado
IPAddress subnet(255,255,255,0);

//objeto do servidor
WiFiServer server(80);

//objeto do cliente
WiFiClient client;

//variável usada para obter o request do client 
String myresultat;

ESP32 [ReadIncomingRequest - Leitura do Request]

Aqui trabalhamos com a função usada para a leitura do request sem caracteres de quebra de linha como "\n" ou "\r", atribuímos para a variável String o comando enviado pelo cliente e verificamos uma solicitação HTTP.

//função usada para a leitura do request sem caracteres de quebra de linha como "\n" ou "\r"
String ReadIncomingRequest()
{
  //enquanto houver bytes enviados pelo client 
  while(client.available()) 
  {
    //atribui para a variável String o comando enviado pelo cliente sem "\r"
    ClientRequest = (client.readStringUntil('\r'));

    //se existir "HTTP/1.1" na String então recebe comando, senão o comando não é aceito
    //isso verifica que a solicitação seja HTTP/1.1
    if ((ClientRequest.indexOf("HTTP/1.1")>0))
      myresultat = ClientRequest;
  }
  //retorna variável
  return myresultat;
}


ESP32 [Setup]

No Setup vamos inicializar variável e definir o pino do led como saída. Também vamos inicializar a serial como 115200 bits por segundo para poder dar um print na tela e dou um delay de 10 milissegundos. Exibo informações de conexão, configuro o IP estático, gateway e máscara e inicializo o servidor.

void setup()
{
  //inicializa varíavel como vazia
  ClientRequest = "";
  
  //define pino do led como saída
  pinMode(ledVerde,OUTPUT);

  //inicializa serial com 115200 bits por segundo
  Serial.begin(115200);
  //aguarda 10ms
  delay(10);

  //A partir daqui conecta wifi
  Serial.println("START");

  //configura ssid e senha da rede
  WiFi.begin("robotica", "XXXXXXXX");

  //enquanto não conectar exibe "."
  while (WiFi.status() != WL_CONNECTED)
  {
      delay(500);
      Serial.print(".");
  }

  //exibe "conectado"
  Serial.println("Connected");

  //configura ip estático, gateway e máscara (definidos globais no início do código)
  WiFi.config(staticIP, gateway, subnet);

  //exibe ip utilizado pelo ESP
  Serial.println("Your IP is");
  Serial.println((WiFi.localIP()));

  //inicializa servidor
  server.begin();
}


ESP32 [Loop]

Nesta etapa nós obtemos o cliente e configuramos o controle do led conforme o comando recebido.

void loop()
{
    //obtém cliente
    client = server.available();

    //se ele for nulo, retorna até que ele realmente exista
    if (!client) 
      return; 

    //enquanto não existir request aguarda
    while(!client.available())
      delay(1); 

    //obtém request utilizando a função local ReadIncomingRequest
    ClientRequest = (ReadIncomingRequest());
    
    //retira dados da página e obtém apenas o comando enviado
    ClientRequest.remove(0, 5);
    ClientRequest.remove(ClientRequest.length()-9,9);

    //controla led conforme o comando recebido
    if (ClientRequest == "acender") 
      digitalWrite(ledVerde,HIGH);
    if (ClientRequest == "apagar")
      digitalWrite(ledVerde,LOW);
    if (ClientRequest == "piscar") 
    {      
      digitalWrite(ledVerde,HIGH);
      delay(500);
      digitalWrite(ledVerde,LOW);
      delay(500);
      digitalWrite(ledVerde,HIGH);
      delay(500);
      digitalWrite(ledVerde,LOW);
      delay(500);
    }

    //exibe na página a palavra "OK", caso acessado por um navegador
    //se estiver no aplicativo esta exibição não será feita
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("");
    client.println("");
    client.println("OK");
    client.println("");
    client.flush();
    client.stop();
    delay(1);
}


Programação do AppInventor

Importar arquivo [AppESP32.aia]

Baixe o arquivo .aia disponível no meu blog e importe para a sua conta do AppInventor seguindo estes passos.

Teste de comunicação do Smartphone com o ESP32

Para verificar se o seu celular pode se comunicar com o ESP32, abra o navegador e digite conforme a figura, lembrando que o IP deve ser o mesmo definido em “staticIP792” no código .ino do ESP32.

Programa AppInventor [Designer]


Usaremos duas Labels e três componentes não-visíveis: Web, Clock e SpeechReconigzer

Obs: A Label2 é localizada logo abaixo da Label1, sem nenhum texto inserido

Programa AppInventor [Blocks]


1.       Inicializa variável global com “0”. Esta variável é usada para que a função de reconhecimento de voz seja chamada só uma vez, caso contrário, a cada segundo, essa função será chamada e ficará num loop “descontrolado”.

2.       Este loop é executado assim que o aplicativo é aberto e ele funciona de tempo em tempo (milissegundos). É como se fosse o loop do Arduino IDE, só que de acordo com o clock deste componente.

3.       Se o comando não foi recebido ainda...

4.       Então chama a função “SpeechRecognizer1”, que é a função de reconhecimento de voz da Google.

5.       Atribui à variável o valor “1”, que impede que a função seja chamada novamente neste loop. (Até que ela seja setada como “0” novamente).

Programa AppInventor [Blocks]


1.       Após a voz ser reconhecida e o texto já ter sido obtido...

2.       Insere na etiqueta o texto que foi reconhecido.

3.       Se a palavra foi “acender”, então...

4.       Insere na etiqueta o texto “Comando enviado” mais o comando entre parênteses.

5.       Envia por Url o comando “acender” (o ip deve ser o mesmo do ESP).

6.       Repete para os demais comandos.

7.       Reseta variável para que o reconhecimento seja feito novamente.

Instalação do aplicativo AppInventor [Permissão de instalação]

Antes de instalar o aplicativo habilite a permissão de instalação de aplicativos de fontes desconhecidas.
No seu smartphone vá em: Configurações -> Segurança -> Administração do dispositivo
Marque a opção conforme a figura.

Instalação do aplicativo AppInventor [PlayStore]

Abra a PlayStore e procure por AppInventor. O aplicativo se chama “MIT AI2 Companion”.


Utilização e instalação do programa desenvolvido


Abra o aplicativo baixado e veja a tela principal, como na imagem acima. É possível conectar com código ou escanear com QR code.
Agora, na imagem abaixo, você vê, à esquerda, a opção usada para apenas utilizar o aplicativo sem que ele seja instalado. Detalhe: esta opção permite que o aplicativo seja atualizado em tempo real, assim que o “designer” ou “blocks” for alterado.
No lado direito você confere a opção usada para instalar o aplicativo no seu smartphone.




Faça o download dos arquivos:


Postar um comentário

17 Comentários

  1. Respostas
    1. muito top agora vc podia incluir a biblioteca irremote para controlar os aparelhos de controle remoto

      Excluir
  2. Olá Fernando, muito boas as suas aulas. Como faço para ter dúvidas esclarecidas?
    Gostaria de poder entrar em contato por e-mail.

    Abraços.

    ResponderExcluir
    Respostas
    1. Olá, Luiz Flavio. Entre em contato comigo pelo contato@fernandok.com.
      Abraço

      Excluir
    2. Não consigo fazer Download dos arquivos...

      Excluir
  3. Eu tenho esta APP mas acho que falta alguma cois poderia me ajudar?

    ResponderExcluir
  4. muito top agora vc podia incluir a biblioteca irremote para controlar os aparelhos de controle remoto

    ResponderExcluir
  5. oi
    estou tentando fazer com meu ESP2866 mais n tou conseguindo !
    porque sera ??!

    ResponderExcluir
  6. parabéns pelos videos, estão me ajudando muito cada video absorvo muita informação!!! conteúdo sempre fantástico !!!

    ResponderExcluir
  7. Não estou conseguindo ascender o LED quando o comando é composto, tipo "ascender verde". O que pode ser feito nesse caso?

    Muito Obrigado pelo tutorial.

    ResponderExcluir
  8. aqui deu esse erro será que alguem pode me ajudar com o seguinte erro Arduino: 1.8.13 (Windows 10), Placa:"ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"

    comando_de_voz:50:3: error: stray '\342' in program

    WiFi.begin(“robotica", “XXXXXXXX");

    ^

    comando_de_voz:50:3: error: stray '\200' in program

    comando_de_voz:50:3: error: stray '\234' in program

    C:\Users\GRAFICA02\Documents\Arduino\comando_de_voz\comando_de_voz.ino: In function 'void setup()':

    comando_de_voz:50:17: error: 'robotica' was not declared in this scope

    WiFi.begin(“robotica", “XXXXXXXX");

    ^

    Foram encontradas múltiplas bibliotecas para "WiFi.h"

    Usado: C:\Users\GRAFICA02\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi

    Não usado: C:\Program Files (x86)\Arduino\libraries\WiFi

    exit status 1

    stray '\342' in program



    Este relatório teria mais informações com
    "Mostrar a saida detalhada durante a compilação"
    opção pode ser ativada em "Arquivo -> Preferências"

    ResponderExcluir
  9. TENTEI CARREGAR NOVAMENTE O ESP32 E APARACEU O SEGUINTE ERRO
    Arduino: 1.8.13 (Windows 10), Placa:"ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"

    O sketch usa 640722 bytes (48%) de espaço de armazenamento para programas. O máximo são 1310720 bytes.

    Variáveis globais usam 38856 bytes (11%) de memória dinâmica, deixando 288824 bytes para variáveis locais. O máximo são 327680 bytes.

    esptool.py v2.6

    Serial port COM1

    Connecting........_____....._____....._____....._____....._____....._____.....____Ocorreu um erro enquanto o sketch era carregado

    _



    A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header



    Este relatório teria mais informações com
    "Mostrar a saida detalhada durante a compilação"
    opção pode ser ativada em "Arquivo -> Preferências"

    ALGUEM PODE ME AJUDAR A CORRIGIR ESTE ERROR DESDE JÁ AGRADEÇO

    ResponderExcluir
    Respostas
    1. quando apareser Connecting........_____..... fica presionado o botao boot ate carregar o codigo...

      Excluir
  10. Este comentário foi removido pelo autor.

    ResponderExcluir
  11. Este comentário foi removido pelo autor.

    ResponderExcluir
  12. Boa noite, não funcionou, lá pede o Ip do esp mais dois que não compreendi, mais dois, a mascara e outro, como consigo encontrar no esp ou no wifi.

    ResponderExcluir