Sensor de temperatura DS18B20 com ESP8266

Webserver com ESP8266 ESP-01 e sensor de temperatura DS18B20

Faz tempo que o sensor de temperatura DS18B20 não aparece por aqui, e hoje ele volta em grande estilo, em um projeto mostrando como usar esse excelente sensor junto com o módulo wifi ESP8266 ESP-01.

Se quiser relembrar as características do DS18B20 e ver o funcionamento dele com Arduino, sugiro o post Como usar o sensor de temperatura DS18B20 com Arduino.

Conectando o DS18B20 no ESP8266 ESP-01

O sensor de temperatura DS18B20 usa apenas um pino de dados (o pino central, DQ), com os dois outros pinos sendo alimentação: o VDD (Vcc) e o GND.

Também é possível usar o sensor sem alimentação direta, num modo chamado de “parasita”. Nesse modo, a alimentação vem do próprio pino de dados. No nosso exemplo, vamos usar o modo normal, com alimentação direta.

A conexão é feita seguindo o esquema abaixo, com o pino de dados (pino central) do DS18B20 conectado na GPIO2 do ESP-01. Repare que temos um resistor de 4.7K entre o pino de dados e o Vcc. Sem ele, o sensor não irá funcionar, ok?

Os fios verde e amarelo “soltos” na imagem acima são o TX e RX, que vamos usar para programar o ESP-01 via porta serial/UART.

Para programar o ESP-01 via serial usei o mesmo esquema mostrado no post Gravando firmware NodeMCU no ESP8266 ESP-01, com um conversor FTDI FT232. Você também pode usar um Arduino para programar o ESP-01, por exemplo, ou algum outro conversor USB-Serial.

Configurando a IDE Arduino para ESP8266

Agora vamos configurar a IDE do Arduino para que o ESP-01 apareça na lista de placas. Na IDE, acesse o menu Arquivo -> Preferências, e no campo URLs Adicionais para Gerenciadores de Placas coloque o seguinte endereço:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Clique em ok e vá no menu Ferramentas -> Placa -> Gerenciador de Placas, procure por ESP8266 e selecione ESP8266 by ESP8266 Community, clicando em seguida em Instalar:

Para selecionar a placa ESP-01, vá até o menu Placas e selecione Generic ESP8266 Module, conforme mostrado na imagem abaixo:

Com a placa devidamente instalada e configurada, vamos ao próximo passo.

Instalação bibliotecas Dallas e OneWire

Uma característica do DS18B20 é que cada componente contém um endereço único, o que possibilita que você conecte vários sensores no mesmo barramento e obtenha a temperatura de cada um individualmente. Na imagem abaixo temos um exemplo de conexão de 3 sensores na mesma linha de dados:

No post anterior quando usamos Arduino, utilizamos 2 programas: um para descobrir o endereço de cada sensor, e outro para efetuar a leitura da temperatura, sabendo qual o endereço de cada um dos sensores.

Neste exemplo com ESP8266 ESP-01, vamos usar uma biblioteca que realiza uma varredura no barramento, armazena o endereço do sensor na memória e depois exibe o valor da temperatura em uma página web. No nosso circuito de exemplo, teremos apenas um sensor no barramento.

Neste programa vamos precisar de duas bibliotecas, a Dallas, do sensor DS18B20, e a Onewire, ambas instaladas a partir da IDE do Arduino.

Para fazer a instalação da biblioteca Dallas, acesse o menu Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas e procure por Dallas. Selecione a biblioteca DallasTemperature, conforme imagem abaixo e clique em Instalar:

Faça a mesma coisa para a biblioteca OneWire:

Com as bibliotecas instaladas, é hora de carregar o nosso programa.

Programa sensor de temperatura DS18B20 com ESP8266

Carregue o programa abaixo alterando nas linhas 11 e 12 as informações de nome e senha de acordo com a sua rede wifi:

//Programa: Sensor de temperatura DS18B20 com ESP8266
//Autor: Arduino e Cia

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define STASSID "NOME-DA-SUA-REDE-WIFI"
#define STAPSK  "SENHA-DA-REDE-WIFI"

const char *ssid = STASSID;
const char *password = STAPSK;

//Cria um webserver na porta 80
ESP8266WebServer server(80);

//Pino de conexao do sensor de temperatura
#define ONE_WIRE_BUS 2

//Cria uma instancia OneWire para comunicacao com dispositivos no barramento
OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

//Array para armazenar os enderecos dos sensores
DeviceAddress insideThermometer;

void handleRoot()
{
  sensors.requestTemperatures();
  char temp[400];
  float tempC = sensors.getTempC(insideThermometer);

  //Exibe no serial monitor o valor da temperatura lida
  Serial.print("Temperatura medida: ");
  Serial.println(tempC);

  int tmpInt1 = tempC;
  float tmpFrac = tempC - tmpInt1;
  int tmpInt2 = trunc(tmpFrac * 10);

  snprintf(temp, 400,
           "<html>\
  <head>\
    <meta http-equiv='refresh' content='5'/>\
    <title>ESP8266 Demo</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>WebServer DS18B20 com ESP8266</h1>\
    <hr>\
    <h1>Temperatura: %d.%d°</h1>\
    <hr>\
    <h5><i>Arduino e Cia - www.arduinoecia.com.br</i></h5>\
  </body>\
</html>",
           tmpInt1, tmpInt2
          );
  server.send(200, "text/html", temp);
}

void handleNotFound()
{
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup()
{
  Serial.begin(115200);

  //Definicoes e procura do DS18B20
  Serial.println("Sensor de temperatura DS18B20 com ESP8266");
  Serial.println("Localizando sensores DS18B20...");
  sensors.begin();
  Serial.print("Sensores encontrados: ");
  Serial.println(sensors.getDeviceCount(), DEC);
  Serial.print("Modo Parasita: ");
  if (sensors.isParasitePowerMode()) Serial.println("Ligado");
  else Serial.println("Desligado");

  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Endereco nao encontrado para o sensor");

  //Mostra o endereco do sensor encontrado no barramento
  Serial.print("Endereco dispositivo: ");
  printAddress(insideThermometer);
  Serial.println();

  //Define a resolucao do sensor como 9 bits
  sensors.setResolution(insideThermometer, 9);

  Serial.print("Resolucao sensor: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();

  //Definicoes e conexao rede 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 iniciado");
  }

  server.on("/", handleRoot);
  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("Servidor HTTP iniciado!");
}

//Funcao que mostra o endereco do dispositivo
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

void loop()
{
  server.handleClient();
  MDNS.update();
}

Após o carregamento, reinicie o ESP-01 e abra o serial monitor. Serão mostradas as informações do sensor de temperatura detectado e também o seu endereço (no nosso caso, 28626C470B000024), além das informações de conexão da rede wifi:

Na linha “endereço IP” temos o endereço 192.168.43.205 fornecido pelo roteador. Esse endereço IP nós vamos usar para acessar o webserver do ESP-01, que vai fornecer as informações de temperatura via browser.

Para isso, abra um navegador de sua preferência (Chrome, Firefox, etc) e acesse o endereço IP (no nosso caso, 192.168.43.205) conforme imagem abaixo, que fizemos a partir de um smartphone:

As informações de temperatura são atualizadas a cada 5 segundos.

Gostou? Confira outros posts utilizando ESP8266 aqui mesmo no Arduino e Cia!

5/5 - (2 votos)

Related posts

Como usar o sensor de vibração SW-18010P com Arduino

by Arduino e Cia
10 anos ago

Lux Meter – Medidor de intensidade de luz com Arduino e sensor TSL2561

by Arduino e Cia
9 anos ago

Monitor de temperatura com Raspberry Pi e Thingspeak

by Arduino e Cia
4 anos ago
Sair da versão mobile