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
- 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:
17 Comentários
Muito bem explicado parabéns
ResponderExcluirmuito top agora vc podia incluir a biblioteca irremote para controlar os aparelhos de controle remoto
ExcluirOlá Fernando, muito boas as suas aulas. Como faço para ter dúvidas esclarecidas?
ResponderExcluirGostaria de poder entrar em contato por e-mail.
Abraços.
Olá, Luiz Flavio. Entre em contato comigo pelo contato@fernandok.com.
ExcluirAbraço
Não consigo fazer Download dos arquivos...
ExcluirEu tenho esta APP mas acho que falta alguma cois poderia me ajudar?
ResponderExcluirmuito top agora vc podia incluir a biblioteca irremote para controlar os aparelhos de controle remoto
ResponderExcluiroi
ResponderExcluirestou tentando fazer com meu ESP2866 mais n tou conseguindo !
porque sera ??!
parabéns pelos videos, estão me ajudando muito cada video absorvo muita informação!!! conteúdo sempre fantástico !!!
ResponderExcluirNão estou conseguindo ascender o LED quando o comando é composto, tipo "ascender verde". O que pode ser feito nesse caso?
ResponderExcluirMuito Obrigado pelo tutorial.
"acender verde"
Excluiraqui 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"
ResponderExcluircomando_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"
TENTEI CARREGAR NOVAMENTE O ESP32 E APARACEU O SEGUINTE ERRO
ResponderExcluirArduino: 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
quando apareser Connecting........_____..... fica presionado o botao boot ate carregar o codigo...
ExcluirEste comentário foi removido pelo autor.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirBoa 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