Opa pessoal, tudo beleza? Hoje vamos aprender a como estar monitorando ambiente com NodeMCU. Assim, este exemplo se aplica muito na área de IoT – Internet of Things (Internet das Coisas). Em resumo, nós iremos realizar a interação de sensores no mundo físico, tudo isso focado em seu processamento e resultados no mundo virtual (internet).
Mas, o intuito desse post é demonstrar a aplicação de um Webserver local integrado à um LDR, DHT22, DS18b20 (mais conhecido como sensor de temperatura à prova d’água). Ou seja, realizar um monitoramento de ambiente com o NodeMCU.
Mas calma, primeiro leia isso.
Primeiramente, para melhor compreensão desse post, recomendo que você já tenha algum conhecimento de programação aplicada à módulos de internet, nessa aplicação o módulo NodeMCU V3 e saiba o básico de html (Para o melhor desenvolvimento de um layout de página amigável).
Onde posso aplicar esse projeto?
Então, essa integração possui inúmeras aplicações físicas no mundo, desde o simples monitoramento residencial para makers e developers, até aplicação industrial. Mas chega de balela, e vamos direto ao assunto.
Componentes do Projeto
- LDR (Light Depending Resistor) ou Resistência dependente de Luz;
- DHT 22
- DS18b20 – Um sensor de temperatura à prova d’água (ideal para aplicações aquáticas) com uma resolução incrível de 0,5ºC;
- NodeMCU V3 ESP12E (Wemos);
- Resistor de 4,7k(DS18b20);
- Resistor de 10k (LDR);
- Protoboard
- Jumpers
Esquema de montagem
Entendendo o Código
Primeiramente, vamos por partes agora, conhecendo cada trecho, pra ficar fácil :). Em seguida, foram utilizadas as bibliotecas DHT e DallasTemperature, que podem ser encontradas nos seguintes links:
Dessa forma, a configuração de cada um desses sensores, e inicializá-lo é algo simples e de fácil entendimento. Mas há uma dica, sempre que for utilizar/aplicar um sensor, seja ele analógico ou digital, siga sempre 3 palavras:
Informar, iniciar e ler
– Informar quais bibliotecas usadas, e qual configuração do sensor (porta, frequência de leitura, etc.);
– Iniciar o sensor, no setup;
– Ler o sensor, através de chamadas de leituras.
Então, sabia que todas essas informações são obtidas destrinchando a biblioteca. Vamos nessa?
Parte do código referente ao set do DHT22:
– Informei qual biblioteca usar “…DHT.h.”, qual porta está “…DHTPIN 4; DHT dht(DHTPIN, DHTTYPE,11)” e quais variáveis (t,h).
– Iniciei o sensor “dht.begin()”;
– Li o sensor “..t = readTemp e h = readHumi..”.
#include <DHT.h> #define DHTTYPE DHT22 // DHT 22 (AM2302) #define DHTPIN 4 // GPIo4 ou porta D2 do NodeMCU DHT dht(DHTPIN, DHTTYPE,11); //Criação do objeto de leitura DHT float t,h; //variáveis que armazenarão os valores lidos de temperatura e umidade; void setup(){ dht.begin(); //Inicia o sensor } void loop(){ t=dht.readTemperature(); //Função de leitura da temperatura h=dht.readHumidity();//Função de leitura da umidade }
Parte do código referente ao set do DS18B20:
– Informei = “..OneWire ; DallasTemperature ; ONE_WIRE_BUS ; oneWire, Dallas…);
– Iniciei = “sensors…”;
– Li = “t2 = …”
#include <OneWire.h> #include <DallasTemperature.h #define ONE_WIRE_BUS 16 //GPI016 ou porta D0 do NodeMCU OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //Criação do objeto sensors. void setup(){ sensors.begin();// Inicia o objeto sensors. } void loop(){ sensors.requestTemperatures(); t2 = sensors.getTempCByIndex(0); }
Parte do código referente ao set do LDR:
O LDR tem somente uma mudança em relação aos outros sensores, pra uso prático, não há necessidade da utilização de uma biblioteca, então:
– Informo (… ldr, valorldr);
– Leio (valor ldr = analogRead(A0)
int ldr = 0; //Setando a utilizaçâo do LDR à porta ADC A0 do Nodemcu int valorldr = 0;//variável para armazenar a leitura do ldr. void loop(){ valorldr = analogRead(ldr); }
Por fim, vamos a parte do código referente ao set do Webserver e envio de dados para o mesmo.
Portanto, para iniciar e rodar um Webserver, deve-se informar algum parâmetros – tais como nome e senha da rede de internet à ser conectada, qual porta de conexão deverá se utilizar (normalmente utiliza-se à 80) – algum métodos devem ser seguidos, que podem ser visto no código abaixo.
#include <ESP8266WiFi.h> const char* ssid = "sua-rede"; const char* password = "sua-senha"; WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); // Conecta à rede WiFi. Serial.println(); Serial.println(); Serial.print("Conectando à "); Serial.println(ssid); WiFi.begin(ssid, password); // Inicia o wifi while (WiFi.status() != WL_CONNECTED) { delay(500); //Condição de verificação que ENQUANTO a rede não conectar, ele continurá printando “.”. Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); // Inicia o servidor server.begin(); Serial.println("Webserver rodando"); // Te mostra qual IP foi adquirido junto ao roteador, guarde bem o número desse IP, pois seu webservice poderá ser acessado pelo navegador através dele Serial.println(WiFi.localIP()); } void loop() { // Afim de prevenir erros, verifica se o webservice ainda está conectado WiFiClient client = server.available(); if (!client) { return; } while(!client.available()){ delay(1); } // Lê A PRIMEIRA LINHA DA REQUISIÇÃO de envio String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // Como resposta a “aceitação” à requisição de envio String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nEscreva algum texto aqui. "; s += “variável a ser lida"; s += "</html>\n"; // Mostra resposta ao cliente, para quem foi enviado client.print(s); delay(1); Serial.println("Client disconnected"); // The client will actually be disconectado // when the function returns and 'client' object is detroyed }
Obs: Como forma de enxugar o código, somente nesta parte, foi utilizada o Example da IDE Arduino – “WifiWebserver”.
Resultado do Projeto
Algumas informações importantes:
Primeiramente, na linha 56, há um requisito de impressão WiFi.localIP(). Aqui, é mostrado qual IP o módulo adquiriu junto ao roteador. Então, copie esse endereço, vá ao navegador, e acompanhe seu trabalho completo!
Código Completo do Projeto
#include <ESP8266WiFi.h> #include <DHT.h> #include <OneWire.h> #include <DallasTemperature.h> #define DHTTYPE DHT22 // DHT 22 (AM2302) #define DHTPIN 4 // GPIo4 ou porta D2 do NodeMCU DHT dht(DHTPIN, DHTTYPE,11); #define ONE_WIRE_BUS 16 //GPI016 ou porta D0 do NodeMCU OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); const char* ssid = "Familia Pereira"; //Configuração de sua rede WiFI const char* password = "04091327"; float t,h;//variáveis que armazerão temperatura e umidade lidas do DHT22 float t2; //variável para o sensor ds18b20 int ldr = 0; //Setando a utilizaçâo do LDR à porta ADC A0 do Nodemcu int valorldr = 0;//variáveis aplicadas ao LDR int id = 1; //Identificação de qual conjunto de sensores está sendo enviado aquela informação (Caso você deseje aplicar mais de um conjunto de sensores) signed long rssi = WiFi.RSSI(); //Função "medir" a intensidade do sinal WiFi - interessante para aplicaçôes onde há muitas barreiras, até o ponto onde está localizado o roteador. String myIPAddrStr; //Variável para armazenamento do IP gerado para acesso do Webservice. // As funções abaixo são para definiçâo de IPFixo - Caso deseje configurar, basta descomentar as linhas 14,15,16. //IPAddress ip(192,168,72,171); //Alterar aqui para o IP Desejado //IPAddress gateway(192,168,72,1); //Gateway da rede //IPAddress subnet(255,255,255,0);//Mascara da rede WiFiServer server(80); //Definição para o webservice utilizar a porta 80. void setup() { Serial.begin(9600); sensors.begin(); dht.begin(); delay(10); // Aqui começa a conexão com a rede Serial.println(); Serial.println(); Serial.print("ESP8266 Conectando à "); Serial.println(ssid); WiFi.begin(ssid, password); //Inicia a conexão WiFi, utilizando os parametros fornecidos. //WiFi.config(ip, gateway, subnet); //Ao setar IP Fixo, descomentar essa linha while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Conectado"); server.begin(); myIPAddrStr = String(WiFi.localIP().toString()); Serial.println(WiFi.localIP()); //Acesse seu webserver atráves do IP gerado aqui. } void loop() { delay(2000); t = dht.readTemperature(); //Chamada de leitura do sensor DHT22 h = dht.readHumidity(); sensors.requestTemperatures(); t2 = sensors.getTempCByIndex(0); // //Chamada de leitura do sensor DS18b20 rssi = WiFi.RSSI(); valorldr = analogRead(ldr); WiFiClient client = server.available(); // Comparação se o cliente Wifi, está disponível if (!client) { return; } Serial.println("Webserver gerado."); while(!client.available()){ delay(1); } String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); String url = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n"; //Geração da página HTML url += "<html>\r\n"; url += "<title>Monitoramento remoto</title>"; url += "<center><h1>Os parâmetros ambientais lidos são:</h1>"; url += "<br/>"; url += "<br/>"; url += "<br/>"; url += "<b>Temperatura (DHT22) = </b>"; url += t; url +="ºC"; url += "<br/>"; url +="<b>Umidade (DHT22) = </b>"; url += h; url +="%"; url += "<br/>"; url += "<b>Temperatura (DS18b20) = </b>"; url += t2; url += "ºC"; url += "<br/>"; url += "ID = "; url += id; url += "<br/>"; url += "<b>Luminosidade = </b>"; url += valorldr; url += "<br/>"; url += "<b>Intens. Sinal = </b> "; url += rssi; url += "<br/>"; url += "<b>IP = </b>"; url += String(myIPAddrStr); url += "<br/>"; url += "<input type=""button"" value=""Atualizar"" onClick=""history.go(0)"">" ; //Essa linha gera um botão p/ atualizar a página do webservice. url += "<br/>"; url += "<br/>"; url += "<br/>"; url += "<br/>"; url += "<br/>"; url += "<br/>"; url += "<b>www.autocorerobotica.blog.br </b> por <b> I.A.P </b>"; url += "</center></html>\n"; client.print(url); Serial.println(); Serial.println("Fechando a conexão"); delay(30000); //Espera 30 segundos e recomeça o loop. }
Por fim, não percam o próximo post – Monitoramento de segurança com SENSOR PIR e Arduíno!
Então, tem opniões? Dúvidas? Sugestões de projetos?Deixem nos comentários abaixo!
Sou fã e me espelho no jeito visionário do Elon Musk e dele vem minha frase favorita:
“Fracasso é uma possibilidade por aqui. Se as coisas não estão fracassando, você não está inovando o suficiente.”