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!