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.
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:
- Módulo WiFi ESP8266 NodeMcu ESP-12
- Sensor de Umidade e Temperatura DHT11
- Kit Jumpers Macho-Macho x65 Unidades
- Fonte DC Chaveada 5V 2A Micro USB
- Protoboard 400 Pontos
- Resistor 4.7KΩ 1/4W
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:
Digite também através do campo de buscas thingspeak e clique em instalar:
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.
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.
Clicar em “New Channel” e preencher os seguintes campos:
Copie a chave de escrita gerada e cole no programa a ser compilado pelo Arduino IDE:
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:
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.
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:
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:
Gostou de como criar redundância de sinal Wi-Fi na ESP8266 NodeMCU? Deixe seu comentário logo abaixo.
Até a Próxima !
Como faço para entrar em contato com o autor do artigo ?
Olá Paulo Henrique, qualquer dúvida estou a disposição!
Segue e-mail para tirar dúvidas: [email protected]
Atenciosamente.