Conectando o ESP8266 NodeMCU no Wi-Fi através do botão WPS do roteador 9

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.

Imagem 1 - Como conectar o NodeMCU no Wi-Fi via WPS do roteador

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.

Imagem 2 - WPS do roteador

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

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.

Imagem 3 - Circuito para conectar o NodeMCU no Wi-Fi via WPS do roteador

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.

Imagem 4 - Como conectar o NodeMCU no Wi-Fi via WPS do roteador

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.

Imagem 4 - Como conectar o NodeMCU no Wi-Fi via WPS do roteador

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!

Faça seu comentário

Acesse sua conta e participe

9 Comentários

  1. Olá, bom dia. Já utilizou a função WPS com RTL8720DN?

  2. 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?

  3. 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?”

    1. Olá,

      Código corrigido. Acredito que não há mais erros.

      Abraço!
      Rosana – Equipe MakerHero

  4. Infelizmente não funcionou aqui, erro ao compilar o código.

    1. Bruno,

      Qual erro ocorre?

      Abraços!
      Diogo – Equipe MakerHero

  5. Gostaria de saber como faço para obter esse arquivo???

  6. 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!

    1. 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