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

Placa ESP8266 com sensor de temperatura DHT11 e display Oled

Na imagem abaixo podemos observar os conectores para o DHT11 e do display Oled que vamos utilizar para mostrar as informações do sensor.

Detalhes placa ESP8266

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:

IDE Arduino - Preferências

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:

Instalação placa ESP8266 na IDE Arduino

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:

Biblioteca ESP8266 ESP32 Oled SSD1306

Faça a mesma coisa para a biblioteca DHT11 Sensor Library by Adafruit:

Biblioteca DHT 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:

Termômetro IoT Serial Monitor Endereço IP ESP8266

Abra o browser de sua preferência, acesse o endereço IP obtido e você terá uma tela parecida com essa:

Termômetro IoT dados no browser

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!

5/5 - (2 votes)