Termômetro IoT com ESP8266 e DHT11
O projeto de hoje é um Termômetro IoT, onde vamos usar uma placa ESP8266 com Sensor de Umidade e Temperatura DHT11 e display Oled integrados.
O nosso termômetro vai mostrar os dados de temperatura no display Oled, e ao mesmo tempo disponibilizar um web server para acesso aos dados através da rede. Vamos lá?
Placa ESP8266 com sensor DHT11 e display Oled
Esta placa vem com o ESP8266 ESP-12F, um conhecido componente utilizado em projetos de Internet das Coisas (IoT) pois conta com wifi embutido. O ESP8266 ESP-12F geralmente vem em placas como o ESP8266 NodeMCU.
A placa já vem com um sensor de temperatura e umidade DHT11 e um display Oled azul e amarelo (uma faixa em amarelo na parte superior e o resto da imagem em azul).
Na imagem abaixo podemos observar os conectores para o DHT11 e do display Oled que vamos utilizar para mostrar as informações do sensor.
Complementando as características da placa, temos dois botões (Reset e Boot) e um conector micro-usb que serve tanto para alimentação da placa (5V) como para comunicação e programação pelo computador. Observe que temos outros pinos do ESP-12F disponíveis, bastando usar jumpers para conexão.
A montagem do conjunto é bem simples: encaixe os componentes na placa conforme a imagem mostrada acima, com o sensor de temperatura DHT11 virado para fora.
Sobre o Oled, ele vem com uma barra de pinos que necessita de solda. Antes de conectá-lo na placa, verifique se a pinagem do display (pinos VCC, GND, SCL e SDA) corresponde a pinagem do conector da placa ESP8266.
Configurando o ESP-12F na IDE Arduino
Primeiramente vamos configurar a placa ESP8266 ESP-12F na IDE Arduino. Para isso, entre na IDE e selecione Arquivo => Preferências. Nas configurações, insira o link abaixo no campo URLs adicionais de Gerenciadores de placas:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Sua tela deve ficar assim:
Clique em OK para voltar à tela principal e agora selecione o menu Ferramentas => Placa => Gerenciador de placas. Dentro do gerenciador de placas, procure por esp8266 by ESP8266 Community e clique em instalar:
Esse procedimento adiciona as placas da linha ESP8266 na lista de placas da IDE do Arduino. Agora basta selecionar a placa NodeMCU 1.0 (ESP-12E module) no menu Ferramentas => Placa, conforme imagem:
Com a IDE configurada, vamos ao programa do nosso termômetro.
Programa termômetro IoT com ESP8266 ESP-12F
Para o programa do termômetro IoT você vai precisar das bibliotecas DHT e ESP8266 SSD1306, que você pode instalar a partir da IDE do Arduino.
Na IDE, selecione o menu Sketch => Incluir Biblioteca => Gerenciar Bibliotecas. No Gerenciador de Biblioteca (tela abaixo), procure por SSD1306 e selecione a biblioteca chamada ESP8266 and ESP32 Oled Driver for SSD1306 Display. Clique em Instalar:
Faça a mesma coisa para a biblioteca DHT11 Sensor Library by Adafruit:
As demais bibliotecas do ESP8266 usadas no programa foram automaticamente instaladas quando incluímos a placa na IDE, ok?
Agora basta carregar o programa abaixo, alterando as linhas 13 e 14 do programa com as informações da rede wifi à qual o ESP irá se conectar para mandar os dados para o browser:
//Programa: Termometro IoT com ESP8266 //Autor: Arduino e Cia #include <Wire.h> #include <SSD1306Wire.h> #include <DHT.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> //Dados da rede wifi #define STASSID "NOME DA SUA REDE WIFI" #define STAPSK "SENHA DA SUA REDE WIFI" const char* ssid = STASSID; const char* password = STAPSK; ESP8266WebServer server(80); //Pino de ligacao do DHT11 #define DHTPIN 5 //Define o tipo de sensor DHT #define DHTTYPE DHT11 // Inicializa o display Oled SDA 2, SCL 14 SSD1306Wire display(0x3c, 2, 14); int minima = 99; int maxima = 0; int t; DHT dht(DHTPIN, DHTTYPE); //Intervalo de tempo entre leituras const long intervalo = 5000; //Armazena o valor (tempo) da ultima leitura unsigned long previousMillis = 0; void setup() { Serial.begin(115200); //Inicializa o Wifi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.println(""); while (WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("."); } Serial.println(""); Serial.print("Conectado na rede "); Serial.println(ssid); Serial.print("Endereco IP: "); Serial.println(WiFi.localIP()); if (MDNS.begin("esp8266")) { Serial.println("MDNS responder started"); } server.on("/", handleRoot); server.on("/inline", []() { server.send(200, "text/plain", "this works as well"); }); server.begin(); Serial.println("HTTP server started"); //Inicializa o display Oled display.init(); display.flipScreenVertically(); //Inicializa o sensor de temperatura dht.begin(); } void handleRoot() { server.send(200, "text/plain", "Oi! Aqui eh o seu termometro IoT!\n\nA temperatura atual e de " + String(t) + " graus\nA maxima foi " + String(maxima) + " graus e\na minima foi " + String(minima) + " graus"); } void Atualiza_Temperatura_Display(int temperatura, int max_s, int min_s) { //Apaga o display display.clear(); //Desenha as molduras display.drawRect(0, 0, 128, 16); display.drawRect(0, 16, 128, 48); display.drawLine(67, 16, 67, 63); display.drawLine(67, 40, 128, 40); //Atualiza informacoes da temperatura display.setFont(ArialMT_Plain_10); display.setTextAlignment(TEXT_ALIGN_CENTER); display.drawString(64, 2, "Termometro IoT ESP8266"); display.setFont(ArialMT_Plain_24); display.drawString(32, 26, String(temperatura)); display.drawCircle(52, 32, 2); //Atualiza maxima e minima display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); display.drawString(73, 24, "Max"); display.setFont(ArialMT_Plain_16); display.drawString(101, 19, String(max_s)); display.setFont(ArialMT_Plain_10); display.drawString(73, 48, "Min"); display.setFont(ArialMT_Plain_16); display.drawString(101, 43, String(min_s)); display.display(); } void loop() { unsigned long currentMillis = millis(); //Verifica se o intervalo já foi atingido if (currentMillis - previousMillis >= intervalo) { //Armazena o valor da ultima leitura previousMillis = currentMillis; //Le a temperatura t = dht.readTemperature(); //Mostra a temperatura no Serial Monitor Serial.print(F("Temperatura: ")); Serial.print(t); Serial.println(F("°C ")); //Atualiza as variaveis maxima e minima, se necessario if (t >= maxima){maxima = t;} if (t <= minima){minima = t;} //Envia as informacoes para o display Atualiza_Temperatura_Display(t, maxima, minima); } server.handleClient(); MDNS.update(); }
Assim que o programa for carregado no ESP8266 o mesmo será reinicializado e você pode conferir no serial monitor o endereço IP recebido na hora da conexão com o roteador. No nosso caso, o IP foi o 192.168.0.133:
Abra o browser de sua preferência, acesse o endereço IP obtido e você terá uma tela parecida com essa:
Não se esqueça que o computador ou o smartphone devem estar conectados na mesma rede para que você possa acessar o ESP8266 pelo browser, ok?
Gostou? Confira outros projetos de IoT aqui mesmo no Arduino e Cia!
Prezados,
Montei o kit e instalei este código de vocês, funcionou com um porém, de forma cíclica aparece uma leitura momentânea e falsa ga temperatura (t) e e o algoritimo coloca este valor gigantesco na variável maxima e lá permaneçe e só com um reset para iniciar novamente com os três valores iguais até que apareça o valor misterioso,
Não consigo visualizar no algoritmo o porque,
Obrigado pela atenção
eu uso um display, U8G2_SSD1306_128X64_NONAME_F_SW_I2C
u8g2(U8G2_R0,/*clock=*/14, /*data=*/12,U8X8_PIN_NONE);, como fazo para utilizar ele nesse codigo?