Reconexão automática do ESP8266 NodeMCU na rede Wi-Fi Deixe um comentário

A placa Wi-Fi ESP8266 NodeMCU faz parte de uma plataforma muito interessante, pois é capaz de fornecer I/O’s programáveis, entrada microUSB para programação através do Arduíno IDE ou LUA, regulador de tensão 5/3,3 Vcc, conexão Wi-Fi e conversor FTDI integrado, ou seja, tudo isso reunido em um só dispositivo que pode ser facilmente implementado em projetos IoT, entretanto por alguns motivos externos tais como queda de energia ou falha na rede proveniente do sinal Wi-Fi os dados enviados e recebidos podem ser alterados ou perdidos, fazendo com que haja falha de comunicação entre cliente/servidor sem uma reconexão automática do ESP8266.

Ruim, não é? Então através deste post exemplificaremos como podemos acabar de vez com estes problemas.

O Projeto Controle de umidade e temperatura com reconexão automática através da ESP8266 NodeMCU, consiste em fazer a placa enviar dados de umidade e temperatura medida para um canal criado no site ThingSpeak.com, porém caso haja instabilidade ou falha de conexão na rede Wi-Fi principal é possível se conectar a outra rede Wi-Fi auxiliar através de uma reconexão automática criando o que chamamos de redundância de sinal Wi-Fi, fazendo com que não haja perda de informações por longo período de tempo, e melhor, tudo isso sem a necessidade de reconfigura-la novamente.

montagem da Reconexão automática do ESP8266

Gostou da idéia? Então através deste post exemplificaremos como criar a reconexão automática de sinal Wi-Fi usando o sensor DHT11 e a plataforma ThingSpeak e acabar de vez com estes problemas.

Para saber mais sobre a plataforma ThingSpeak veja o post da Planta IoT com ESP8266 NodeMCU – Parte 1.

Material Necessário

Neste projeto utilizamos os seguintes componentes:

A alimentação pode ser feita pelo cabo USB (o mesmo cabo utilizado na programação do NodeMCU) ou fonte DC chaveada 5V 2A MicroUSB.

Como Funciona a plataforma ThingSpeaK?

O ThingSpeak.com é um serviço IoT na nuvem que possibilita fazer registros de informações recebidas pelos dispositivos IoT, além de disponibilizar diversas análises sobre estes dados.

Para saber mais sobre a plataforma ThingSpeak veja o post de Pedro Bertoleti, Planta IoT com ESP8266 NodeMCU.

Como Funciona o sensor DHT11?

O sensor DHT11 identifica umidade e temperatura do ar, tem internamente um pequeno microcontrolador de 8 bits que transmite as informações sensoriadas por um protocolo específico que utiliza apenas um pino para dados.

Para saber mais sobre o sensor DHT11 veja o post de Adilson Thomsen Monitorando Temperatura e Umidade com o sensor DHT11.

Setup necessário

É de grande importância, que você tenha o Arduino IDE instalado em sua máquina, de preferência a ultima versão disponível no site site oficial do Arduino.

Para comunicarmos a ESP8266 NodeMCU no sensor de umidade e temperatura DHT11 ao site ThingSpeak precisamos baixar as seguintes bibliotecas abaixo:

Na barra de ferramentas acesse Scketch>Incluir bibliotecas>Gerenciar bibliotecas e digite através do campo de buscas dht11 e clique em instalar:

dht11 na IDE do arduino

Digite também através do campo de buscas thingspeak e clique em instalar:

thingspeak na IDE do arduino

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

Para fazer o uso da funcionalidade da plataforma ThingSpeak é necessário realizar o cadastro no site ThingSpeak, e seguir os passos indicados abaixo:

Preencha os dados abaixo, e-mail, localização, nome e sobrenome.

cadastro Thingspeak

Clicar em “New Channel” e preencher os seguintes campos:

cadastro Thingspeak 2

Copie a chave de escrita gerada e cole no programa a ser compilado pelo Arduino IDE:

cadastro Thingspeak 3

 

Montagem do circuito

Observe o circuito esquemático abaixo, que será usado no projeto controle de umidade e temperatura com reconexão automática através da ESP8266 NodeMCU:

Reconexão automática do ESP8266 com DHT11

Programando a reconexão automática do ESP8266

Este código exemplifica a possibilidade de realizar leitura e escrita de dados sem se preocupar com  falhas de conexão na rede Wi-Fi ou quedas de energia, ou seja, ao realizar a leitura dos dados do sensor DHT11 o módulo ESP8266 NodeMCU se conecta ao site ThingSpeak, e envia as strings de dados contendo informações de umidade e temperatura através da rede Wi-Fi principal, sendo possível acompanhá-las através do serial monitor, porém se a conexão Wi-Fi principal falhar no momento da comunicação o módulo buscará a rede Wi-Fi auxiliar que deverá ser configurada conforme programa abaixo e quando a conexão for restabelecida as strings de dados continuaram a trafegar normalmente através do host configurado “api.thingspeak.com”.

Segue o código-fonte do projeto. Leia atentamente todos os comentários do mesmo.

#include <ESP8266WiFi.h>
#include <DHT.h>

//Habilita pino D4 para envio de dados
#define DHTPIN D4 // pino que estamos conectado
#define DHTTYPE DHT11 // DHT 11

//Define pino e tipo de DHT a ser utilizado
DHT dht(DHTPIN, DHTTYPE);

//Credenciais ThingSpeak
const char* host = "api.thingspeak.com";
String ApiKey = "cole aqui sua chave de escrita";

//Caminho para leitura dos dados
String path_one = "/update?key=" +ApiKey + "&field1=";
String path_two = "&field2=";

//Login e senha do wi-fi principal
char* ssid = "LoginPrincipal"; //coloque aqui o nome da rede principal que se deseja conectar
char* pass = "SenhaPrincipal"; //coloque aqui a senha da rede principal que se deseja conectar

//Define contador igual a zero
int count = 0;


void setup()
{

//Inicia DHT11
  Serial.println("Inicia teste no DHT11!");
  dht.begin();
  Serial.begin(115200);
  Serial.println("Estabelecendo conexão...");
  connect();
  
//Caso o Wi-Fi seja desconectado:
    if(WiFi.status()!=WL_CONNECTED)
      {
        Serial.print("A conexão não foi estabelecida, por favor apertar botão reset ou aguardar...\n");
        return;
      }     
}
void loop() 
{

// A leitura da temperatura e umidade pode levar 250ms!
  // O atraso do sensor pode chegar a 2 segundos.
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // Testa se retorno é valido, caso contrário algo está errado.
  if (isnan(t) || isnan(h)) 
 {
    Serial.println("Falha na leitura do DHT");
 } 
  else
{

    Serial.print("Umidade: ");
    Serial.print(h);
    Serial.print(" %t");
    Serial.print("Temperatura: ");
    Serial.print(t);
    Serial.println(" *C");
 }
//Conexão ao endereço IP específico
WiFiClient client;
const int httpPort = 80;

//Caso não se conecte ao ThingSpeak
if (!client.connect(host, httpPort))
  {
    Serial.println("Falha na conexão, por favor aguarde estabilização da rede");
    if (ssid=="LoginPrincipal") //coloque aqui o nome da rede principal que se deseja conectar
    {
      ssid = "LoginAuxiliar"; //coloque aqui o nome da rede auxiliar que se deseja conectar
      pass = "SenhaAuxiliar"; //coloque aqui a senha da rede auxiliar que se deseja conectar
      Serial.println("Estabelecendo conexão na rede auxiliar");
      connect();

      //Tenta estabelecer nova conexão a rede principal
      if(WiFi.status()!=WL_CONNECTED)
      return;
    }
    else
    {
      ssid = "LoginPrincipal"; //coloque aqui o nome da rede principal que se deseja conectar
      pass = "SenhaPrincipal"; //coloque aqui a senha da rede principal que se deseja conectar
      Serial.println("Estabelecendo conexão na rede principal");
      connect();

      //Tenta estabelecer nova conexão a rede auxiliar
      if(WiFi.status()!=WL_CONNECTED)
      return;
    }
    return;
  }

//Envia os dados de leitura do sensor DHT 11 ao ThingSpeak
         client.print(String("GET ") + path_one + t + path_two + h + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" + 
         "Connection: keep-alive\r\n\r\n");
         delay(1500);
 }
void connect()
{
  //Quando conectado contador volta a zero
  count = 0;
  WiFi.begin(ssid, pass);

  //Enquanto Wi-Fi não estiver conectado e o limite do tempo de conexão não exceder
  while (WiFi.status()!= WL_CONNECTED && count<= 130)
  {
    delay(100);
    Serial.print(".");
    count = count + 1;
  }
  if ((WiFi.status() == WL_CONNECTED))
  {
    Serial.println("");
    Serial.print("Conectado em: ");
    Serial.println(ssid);
    Serial.print("Endereço IP: ");
    Serial.println(WiFi.localIP());
  
   if (ssid=="LoginPrincipal") //coloque aqui o nome da rede principal que se deseja conectar
   {
      Serial.println("Rede principal conectada");
      delay (100);
    
    }
   if (ssid=="LoginAuxiliar") //coloque aqui o nome da rede auxiliar que se deseja conectar
   {
      Serial.println("Rede auxiliar conectada");
      delay(100);
   }
  }
}

Resultado do controle de umidade e temperatura com reconexão automática do ESP8266

Após carregar o código fonte para o NodeMCU, abra o serial monitor (com baudrate em 115200 bauds) para acompanhar o que a NodeMCU está fazendo.

Reconexão automática do ESP8266 teste

De acordo com a figura acima, podemos verificar que a NodeMCU ESP8266 foi conectada na rede principal.

Caso ocorra falha durante o envio de dados, é possível verificarmos a mudança de conexão da rede principal para rede auxiliar, através do monitor serial, conforme figura abaixo:

Reconexão automática do ESP8266 falha

Após a comunicação com a rede Wi-Fi auxiliar os dados serão transmitidos por ela, até o momento que ocorra o RESET da placa ou falha de comunicação fazendo com que a transmissão de dados seja redirecionada a rede Wi-Fi principal.

Abra o site ThingSpeak no canal configurado, assim pode-se ver, em tempo real, a chegada dos dados de controle de umidade e temperatura.

O gráfico resultante será algo semelhante a figura abaixo:

Reconexão automática do ESP8266 resultado

Gostou de como criar redundância de sinal Wi-Fi na ESP8266 NodeMCU? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Até a Próxima !

Deixe uma resposta

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