Introdução
O DS18B20 é um sensor de temperatura digital de alta precisão amplamente utilizado em aplicações de monitoramento e controle térmico. Ele é fabricado pela Maxim Integrated e é conhecido por sua simplicidade e confiabilidade. Possui uma faixa de medição de temperatura de -55°C a +125°C, com uma precisão de ±0,5°C na faixa de -10°C a +85°C. Ele também possui uma resolução configurável, permitindo que o usuário escolha entre 9, 10, 11 ou 12 bits de precisão na leitura da temperatura.
Uma das principais características do DS18B20 é o fato de ser um sensor de temperatura de 1 fio, o que significa que ele requer apenas uma conexão para comunicação com um microcontrolador ou dispositivo compatível. Isso torna sua instalação e integração muito mais simples em comparação com outros sensores de temperatura. Comercialmente esse sensor possui duas formas disponíveis. O primeiro formato é bem parecido com um transistor, encapsulamento TO-92 e outro envolve o sensor em uma ponta de prova metálica à prova de água.
Nesse artigo vamos mostrar como utilizar o DS18B20 com a Franzininho WiFi e explorar os recursos disponíveis para configurar e realizar as leituras.
Instalação da Biblioteca DS18B20
Nesta seção vamos instalar na Arduino IDE a biblioteca responsável por comunicar a Franzininho WiFi para realizar as leituras de temperatura do D18B20. Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools -> Manager Libraries)

Após acessar o Gerenciador de biblioteca aguarde surgir uma janela como mostrado na imagem abaixo. Digite no campo de texto: ds18b20 e aguarde o resultado da pesquisa finalizar. Procure pela biblioteca e clique em Install, para concluir a instalação e clique em Close. Pronto já estamos aptos a utilizar a biblioteca.
Biblioteca DS18B20
Nesta seção apresentaremos os métodos utilizados pela biblioteca DallasTempeture.h e no OneWire.h usadas no exemplo de projeto.
begin()
Configura a GPIO que vai operar dentro do protocolo 1-Wire.
bool begin();
Retorna true, configurou corretamente e false, não foi possível configurar.
getDeviceCount()
Busca o número de dispositivos presente conectado a GPIO configurada pelo método begin.
int getDeviceCount();
Retorna o número de dispositivos “pendurados” no barramento.
search()
Método da biblioteca OneWire.h para buscar os endereços do(s) dispositivo(s)
int search(uint8_t *Newaddr);
- Newaddr : ponteiro para receber a variável correspondente ao endereço
Retorna true, caso tenha encontrado dispositivo e false, não foi encontrado nenhum dispositivo.
resquestTempetures()
Solicita por meio de comandos a leitura de temperatura e aguarda recebê -las .
request_t requestTempeture();
O resultado dessas leituras são postas em uma estrutura de dados chamada request_t. Internamente há o valor da temperatura.
getTempCByIndex()
Pega o valor mais recente de temperatura de acordo com o índice, esse índice indica qual sensor conectado ao barramento está buscando ler, por exemplo, se houvesse 3 sensores teríamos que buscar do índice 0 ao 2.
float getTempCByIndex(uint8_t index);
- index : indice ordenado de cada sensor (0-128)
Retorna valor da temperatura em Celsius.
Materiais necessários
Os materiais necessários para desenvolver nossa aplicação são:
- Placa Franzininho WiFi
- Sensor DS18B20
- Resistor 4k7 ohms
- Jumpers
- Arduino IDE
Circuito
No circuito proposto vamos utilizar a GPIO3 para criar uma comunicação bidirecional através do protocolo OneWire, a escolha desse pino foi arbitrária podendo ser qualquer GPIO disponível para realizar as leituras de temperatura. É necessário colocar um resistor de pull -up para interface com o sensor. Caso tenha interesse em conhecer mais sobre o componente acesse o datasheet.
- VCC: conectar no 3.3v da Franzininho WiFi
- GND: conectar no GND da Franzininho WiFi
- DQ: pino responsável por trafegar as requisições (comandos) e as leituras de temperatura
Código para DS18B20
No projeto proposto realizaremos as leituras de temperatura, verificar a quantidade de sensores conectados à GPIO e extrair o endereço do sensor. O código abaixo realiza a leitura de apenas um sensor, contudo há a possibilidade de utilizar múltiplos sensores.
#include <OneWire.h>
#include <DallasTemperature.h>
// Definir qual pino está conectado o sensor DS18B20
#define DS_18B20 3
//Declara construtor para responsável pela comunicação
OneWire one_wire(DS_18B20);
//Declara construtor para responsável pela leitura do sensor DS18B20
DallasTemperature sensor(&one_wire);
//Declara as variáveis
int num_sensor;
uint8_t addr[8];
float temp;
void setup()
{
// Inicializa a comunicação Serial em 115200 bps
Serial.begin(115200);
delay(2000);
Serial.println("Iniciando a demo do DS18B20...");
// Inicia a configura a GPIO
sensor.begin();
Serial.println("Procurando sensores ...");
// Verifica a quantidade de sensores conectados ao pino
num_sensor = sensor.getDeviceCount();
//Caso tenha encontrado algum sensor
if(num_sensor >0)
{
Serial.print("Encontrou ");
Serial.print(num_sensor);
Serial.println(" sensores");
}
// Caso não tenha encontrado nenhum sensor
else
{
Serial.println(" Não encontrou o(s) sensor(es)");
return;
}
// Identifica o endereço do sensor
if(one_wire.search(addr))
{
Serial.print("Endereço : ");
//Procura apenas o primeiro endereço dos sensores
for(int i =0; i<8; i++)
{
Serial.print("0x");
if(addr[i]<0x10) Serial.print("0");
Serial.print(addr[i],HEX);
if(i < 7) Serial.print(":");
}
Serial.println();
}
}
void loop() {
//Envia comando para realizar a leitura de temperatura
sensor.requestTemperatures();
// Realiza as leituras de temperatura
temp = sensor.getTempCByIndex(0);
//Caso receba o valor válido de temperatura
if(temp != DEVICE_DISCONNECTED_C)
{
Serial.print("Temperatura - ");
Serial.print(temp);
Serial.println("C");
}
//Caso valor de temperatura não válido
else
{
Serial.println("[Erro] : Não foi possível realizar a leitura do sensor");
}
delay(1000);
}
Simule esse exemplo no Wokwi: https://wokwi.com/projects/368693283900956673
Explicação do Código
Incluímos as duas bibliotecas responsáveis pela comunicação Onewire (OneWire.h) e por habilitar os métodos para realizar a leitura e envio de comando(s) ao sensore(s) (DallasTemperature.h).
#include <OneWire.h>
#include <DallasTemperature.h>Define o pino onde o sensor está conectado:
// Definir qual pino está conectado o sensor DS18B20
#define DS_18B20 3Declara os construtores que serão responsáveis por acessar os métodos de leitura e envio de comandos na comunicação OneWire, vale observar que um construtores utiliza como parâmetro o objeto declarado anteriormente.
//Declara construtor para responsável pela comunicação
OneWire one_wire(DS_18B20);
//Declara construtor para responsável pela leitura do sensor DS18B20
DallasTemperature sensor(&one_wire);Declara as variáveis para receber a quantidade de sensores (num_sensor), receber o endereço do sensor, vetor de oito posições(addr[8]) e o valor da temperatura (temp).
//Declara as variáveis
int num_sensor;
uint8_t addr[8];
float temp;
No setup, vamos inicializar a comunicação serial e configurar a GPIO conectada ao sensor pelo método (sensor.begin()).
// Inicializa a comunicação Serial em 115200 bps
Serial.begin(115200);
delay(2000);
Serial.println("Iniciando a demo do DS18B20...");
// Inicia a configura a GPIO
sensor.begin();
A próxima etapa é fazer a busca da quantidade de sensores conectados ao GPIO e caso não tenha nada conectado a execução da demonstração do sensor é finalizada.
Serial.println("Procurando sensores ...");
// Verifica a quantidade de sensores conectados ao pino
num_sensor = sensor.getDeviceCount();
//Caso tenha encontrado algum sensor
if(num_sensor >0)
{
Serial.print("Encontrou ");
Serial.print(num_sensor);
Serial.println(" sensores");
}
// Caso não tenha encontrado nenhum sensor
else
{
Serial.println(" Não encontrou o(s) sensor(es)");
return;
}
Buscar o endereço do sensor e mostrar no monitor serial o seu valor em hexadecimal, formato normalmente utilizado para mostrar endereço.
// Identifica o endereço do sensor
if(one_wire.search(addr))
{
Serial.print("Endereço : ");
//Procura apenas o primeiro endereço dos sensores
for(int i =0; i<8; i++)
{
Serial.print("0x");
if(addr[i]<0x10) Serial.print("0");
Serial.print(addr[i],HEX);
if(i < 7) Serial.print(":");
}
Serial.println();
}No loop, a execução do programa requisita as leituras do sensor de temperatura a partir de comandos bit a bit definidos internamente dentro do dispositivo e retorna pelo método getTempCByIndex tendo como parâmetro o índice desejado, nesse caso como temos apenas 1 sensor, então desejado pegar o primeiro sensor conectado.
//Envia comando para realizar a leitura de temperatura
sensor.requestTemperatures();
// Realiza as leturas de temperatura
temp = sensor.getTempCByIndex(0);
Após receber o valor do método, verificamos se é uma leitura válida e imprimimos na serial, caso contrário avisa com uma mensagem de erro e aguarda 1 segundo para executar a requisição de leitura.
//Caso receba o valor válido de temperatura
if(temp != DEVICE_DISCONNECTED_C)
{
Serial.print("Temperatura - ");
Serial.print(temp);
Serial.println("C");
}
//Caso valor de temperatura não válido
else
{
Serial.println("[Erro] : Não foi possível realizar a leitura do sensor");
}
delay(1000);Conclusão
Nesse artigo aprendemos usar o versátil sensor de temperatura DS18B20. Vimos como é fácil fazer a instalação do sensor no circuito e a fácil utilização da biblioteca. Recomendamos que teste a utilização de mais sensores no mesmo barramento e faça as leituras. Outro desafio sugerido é exibir os valores de temperatura em um display.
Gostaríamos de ver seus projetos, fique a vontade para contribuir com novos exemplos e/ou variações deste exemplo.





