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?