A Placa Wi-Fi ESP8266 de modo geral, seja nos modelos NodeMCU, D1 R2 Mini/Pro e D1 R1, fazem parte de uma incrível plataforma IoT. São capazes de fornecer I/O’s programáveis, entrada micro USB, conversor FTDI integrado, regulador de tensão 3,3 V, conexão Wi-Fi e muito mais, tudo isso reunido em um só dispositivo. Porém, ao realizarmos um protótipo ou projeto embarcado que se conecte a internet devemos digitar no código fonte o usuário “SSID” e a senha “PASSWORD” da rede Wi-Fi o que pode não ser nada fácil e prático, correto? Então, através deste post, mostraremos como implementar um código fonte para conectar NodeMCU no Wi-Fi via WPS do roteador e gravá-los diretamente na memória EPROM do dispositivo.
O que é WPS e como funciona esse recurso?
Você conhece a função WPS – Wi-Fi Protected Setup? Esse botão é fornecido em vários roteadores e tem como principal função facilitar o processo de conexão entre seu roteador e os dispositivos.
Se você possui banda larga, é provável que também tenha Wi-Fi e que sua rede esteja protegida por uma senha. No início das redes wireless, o único padrão de senhas existentes era o WEP. Porém, sua criptografia é extremamente fraca e fácil de ser quebrada. Logo, o WEP foi substituído pelos padrões WPA e WPA2, usados até hoje, pois são seguros e sua criptografia é forte. Porém, para se fazer uma senha realmente forte, é necessário combinar letras maiúsculas, minúsculas, números e caracteres especiais, ou seja, sempre que você quiser conectar um novo dispositivo, será necessário digitar essa complexa senha novamente. Para facilitar o processo, foi criado o WPS, que quando habilitada, a função grava em seu roteador um código de oito dígitos. Ou seja, quando você quiser conectar um novo aparelho à rede Wi-Fi, basta pressionar o botão WPS em seu roteador para que o aparelho se conecte automaticamente, sem a necessidade de utilizar senhas.
Em outras palavras, a função WPS traz mais praticidade e facilidade de conexão às redes Wi-Fi, eliminando a necessidade de utilização e memorização de senhas.
Gostou da ideia? Então vamos aprender como isto funciona!
Como conectar NodeMCU no Wi-Fi via WPS do roteador
O projeto para conectar NodeMCU no Wi-Fi via WPS do roteador consiste em fazer a NodeMCU se conectar a rede Wi-Fi através de um pulso no botão WPS encontrado em qualquer modelo de roteador disponível no mercado atualmente. Após pressionar o botão WPS do roteador é necessário manter pressionado o botão configurado na NodeMCU, neste caso “Pino D4/GPIO2” por aproximadamente 4 segundos e pronto! Seus dados de usuário e senha serão escritos na memória EPROM do componente, ou seja, mesmo ligando e desligando a ESP8266 NodeMCU os dados permanecem gravados.
OBS: Não pressionar o botão WPS do roteador mais do que 2 segundos, pois isso poderá reiniciar o seu roteador para configuração de fábrica.
Material Necessário
- Módulo WiFi ESP8266 NodeMcu ESP-12
- LED Difuso 5mm Verde
- Resistor 220Ω 1/4W
- Jumpers macho fêmea
- Chave Táctil Push-Button
- Mini protoboard
- Fonte DC Chaveada 5V 2A Micro USB
A alimentação pode ser feita pelo cabo USB (o mesmo cabo utilizado na programação da ESP8266 NodeMCU) ou Fonte DC Chaveada 5 V/ 2 A Micro USB.
Setup necessário para conectar NodeMCU no Wi-Fi via WPS do roteador
É essencial que você tenha o Arduino IDE instalado em sua máquina, de preferência a última versão disponível no site Arduino.CC.
Depois é necessário realizar a configuração do Arduino IDE para realizar o desenvolvimento com a ESP8266. Você pode fazer essa configuração usando como base esse tutorial descrito no Blog MakerHero.
Esquema Elétrico
Observe o circuito esquemático abaixo, que será usado no projeto para conectar o NodeMCU no Wi-Fi via WPS do roteador:
Após realizada a montagem conforme figura abaixo e pressionado rapidamente o botão WPS do roteador, ao pressionar e segurar o botão configurado na ESP8266 NodeMCU durante 4 segundos será enviado um nível lógico baixo “LOW” ao pino D7 possibilitando a conexão entre roteador e placa. Após a conexão ser estabelecida o LED conectado ao pino D3 piscará 4 vezes, indicando que a conexão foi bem sucedida.
Programando o Módulo ESP8266 NodeMCU
Primeiro foram inclusas as bibliotecas para o correto funcionamento da ESP8266. Foi definida a porta serial para comunicação entre placa e monitor serial do Arduino IDE com uma taxa de transmissão em 115200 baud rate.
O botão utilizado na ESP8266 serve para se comunicar com o roteador e o LED para indicar que a comunicação Wi-Fi foi estabelecida (escrevendo os dados diretamente na memória EPROM). Para saber mais sobre a biblioteca EPROM, veja o documento EEPROM Library na pagina do IDE Arduino.
Caso seja necessário desconectar o ESP8266 da rede Wi-Fi atual e conectá-lo em outra rede Wi-Fi, será necessário utilizar uma interrupção externa. Para saber mais sobre interrupções externas, veja o documento AttachInterrupt na pagina do IDE Arduino.
//Define bibliotecas ESP8266. #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <EEPROM.h> //Define DEBUG serial. #define DBG_OUTPUT_PORT Serial //Define variaveis. unsigned long previousMillis = 0; const long interval = 5000; volatile bool wasConnected = false; volatile long wpsStateTime = 0; //Define WpsButton na GPIO 13 - pino D7. #define wpsButton D7 //Define LED na GPIO 0 - pino D3. #define LED D3 bool isConected() { //Se o Wi-Fi nao estiver conectado, retorna FALSE. if (WiFi.status() != WL_CONNECTED) { return false; } else { return true; } } bool isWPSMode() { String value; value += char(EEPROM.read(255)); if (value == "#") { EEPROM.write(255, 0); EEPROM.commit(); return true; } return false; } void wpsOn() { DBG_OUTPUT_PORT.println("Pressione wpsButton por 4 Seg."); //Ativa interrupcao externa no pino D7/GPIO 13 detachInterrupt(wpsButton); attachInterrupt(wpsButton, wpsOnFinal, FALLING); wpsStateTime = millis(); } void wpsOnFinal() { detachInterrupt(wpsButton); attachInterrupt(wpsButton, wpsOn, RISING); if (wpsStateTime + 4000 < millis()) { if (WiFi.status() == WL_CONNECTED) { WiFi.disconnect(); } EEPROM.write(255, 35); EEPROM.commit(); ESP.restart(); } } void connected() { //Caso a ESP8266 esteja conectada ao Wi-Fi mostra no monitor serial qual o IP e retorna TRUE. DBG_OUTPUT_PORT.print(F("Conectado! Endereco IP é: ")); DBG_OUTPUT_PORT.println(WiFi.localIP()); wasConnected = true; } void setup(){ EEPROM.begin(512); //Atraves do monitor serial é possivel verificar o status da conexao Wi-Fi, colocar em 115200 Baud-Rate. DBG_OUTPUT_PORT.begin(115200); //Ativa status de mensagem sempre que houver bibliotecas externas. DBG_OUTPUT_PORT.setDebugOutput(true); DBG_OUTPUT_PORT.println(F("ESP8266 - wpsButton")); //Define wpsButton como entrada. pinMode(wpsButton, INPUT); //Define LED como saida. pinMode(LED, OUTPUT); attachInterrupt(wpsButton, wpsOn, RISING); //Se WPS Flag habilitar a EPROM, inicia WPS. if (isWPSMode()) { DBG_OUTPUT_PORT.println(F("Inicia WPS\n")); WiFi.beginWPSConfig(); WiFi.mode(WIFI_STA); } //Nunca habilitar WiFi.begin(); //Utilizado apenas quando for inserido o SSID e PASSWORD no código fonte. //Esperar conexao com o roteador. int z = 0; while (!isConected()) { delay(200); DBG_OUTPUT_PORT.print("."); if (z == 50) { break; } z++; } DBG_OUTPUT_PORT.println("\n"); //Caso a conexao nao seja estabelecida, exibir no serial monitor. if (!isConected()) { DBG_OUTPUT_PORT.println(F("Roteador nao encontrado")); //Pressionar o WPS do roteador rapidamente - 1 Pulso. DBG_OUTPUT_PORT.println(F("Roteador : Pressione o WPS do roteador apenas 1 pulso.")); //Pressionar o wpsButton na ESP8266 cerca de 4 Seg. DBG_OUTPUT_PORT.println(F("ESP : Pressione o wpsButton na ESP8266 por 4 Seg.\n")); } else { connected(); } } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (!isConected() && wasConnected) { delay(200); ESP.restart(); } } //Caso a conexao com a internet seja estabelecida, LED pisca 4X. for(int i=0; i<4; i++) { digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } /* adicionar o seu programa principal aqui*/ }
Resultado ao conectar o NodeMCU no Wi-Fi via WPS do roteador
Após carregar o código fonte para a ESP8266 NodeMCU, abra o serial monitor (com baudrate em 115200 bauds) para acompanhar o que ela está processando. De acordo com a figura abaixo, podemos verificar que a ESP8266 NodeMCU não se conectou em nenhuma rede Wi-Fi ainda.
Agora pressione o botão WPS do roteado (apenas um pulso para que o roteador não reinicie para as configurações de fábrica).
Em seguida pressione o botão WPS da ESP8266 NodeMCU por aproximadamente 4 segundos. Solte-o após o tempo determinado.
Pronto! É possível visualizar o LED piscando 4 vezes indicando que a ESP8266 NodeMCU foi conectada na rede Wi-Fi através da configuração WPS.
Gostou de como Conectar a ESP8266 NodeMCU no Wi-Fi através do Botão WPS do Roteador ? Deixe seu comentário logo abaixo.
Até a Próxima!
Olá, bom dia. Já utilizou a função WPS com RTL8720DN?
Há um erro na execução:
ISR not in IRAM!
User exception (panic/abort/assert)
Dando uma pesquisada, me parece que houve uma atualização nas bibliotecas do EPS8266 que demanda o atributo “ICACHE_RAM_ATTR”
Vocês poderia atualizar a postagem para funcionar com os pacotes atuais?
In function ‘void setup()’:
wps_denemesi:127:12: error: a function-definition is not allowed here before ‘{‘ token
wps_denemesi:140:1: error: expected ‘}’ at end of input
exit status 1
a function-definition is not allowed here before ‘{‘ token
“What is the reason I am getting an error like this?”
Olá,
Código corrigido. Acredito que não há mais erros.
Abraço!
Rosana – Equipe MakerHero
Infelizmente não funcionou aqui, erro ao compilar o código.
Bruno,
Qual erro ocorre?
Abraços!
Diogo – Equipe MakerHero
Gostaria de saber como faço para obter esse arquivo???
Seria possível o nodemcu receber comandos por html através de outra rede de wifi. O nodemcu na rede wifi domiciliar e um smartphone utilizando a rede móvel de uma operadora? Ou seja, em redes diferentes e a longa distância!
Sim Paulo, no meu projeto eu criei um banco de dados no Firebase conectado a um app android, assim consigo controlar e visualizar os recursos que programei no meu nodemcu. Abs