Ao desenvolvermos sistemas de monitoramento, variáveis como temperatura e umidade são de grande importância para que sejamos capazes de entender a situação de um determinado ambiente, e com isso tomar uma ação. Sabendo disso, neste tutorial iremos aprender a utilizar o sensor de temperatura DS18B20, um sensor bastante versátil e que com seu encapsulamento a prova d’água possibilita a medição de forma mais segura.
Montando o projeto
Para este tutorial, iremos precisar de um Arduino Nano, que será responsável pela comunicação com o sensor. Também iremos utilizar o sensor DS18B20 e por fim, iremos também utilizar um resistor de 10k, que fará um pull-up entre a alimentação do sensor e o pino de comunicação utilizado. A tabela com todos os componentes utilizados pode ser vista logo abaixo:
O esquema de montagem do projeto é bem simples, e pode ser visto na figura abaixo:

Basicamente iremos conectar o pino D4 ao pino amarelo do sensor de temperatura, o 5V ao pino Vermelho do sensor e o pino GND ao pino preto do sensor de temperatura. Também será necessário adicionar ao pino amarelo um resistor de 10k entre o pino vermelho e amarelo do sensor.
Não esqueça de fazer a montagem do pull-up entre a alimentação e o pino de dados, caso contrário o sensor não será identificado pelo microcontrolador.
Veja só como ficou a montagem do projeto na breadboard :D.

Desenvolvimento do código
Agora que montamos a nossa estrutura de medição iremos partir para o código de leitura dos sensores. Este código será capaz de se comunicar com todos os sensores conectados ao nosso Arduino nano, e ler a temperatura de cada um deles.
#include <OneWire.h>; // Biblioteca de comunicação One Wire
#include <DallasTemperature.h> // Biblioteca do sensor de temperatura
#define PINO_ONE_WIRE 4 // Pino onde os sensores devem estar conectados
#define PRECISAO_TEMPERATURA 12 // Precisão da temperatura lida do sensor ( pode variar entre 9 mínimo e 12 máximo )
#define TEMPOESPERA 2000 // Tempo de espera entre leituras
OneWire oneWire(PINO_ONE_WIRE); // Objeto responsável pela comunicação onewire
DallasTemperature sensores(&oneWire); // Objeto responsável pela configuração e leitura de todos os sensores de temperatura
DeviceAddress enderecoDispositivo; // Endereço do dispositivo que realizaremos a leitura
int dispositivosConectados = 0; // Quantidade de dispositivos conectados ao barramento One-Wire
void setup() {
Serial.begin(9600); // Inicialização da serial
sensores.begin(); // Inicialização do objeto de comunicação com os sensores
dispositivosConectados = sensores.getDeviceCount(); // Conta o número de dispositivos conectados ao barramento One-Wire
Serial.print("Dispositivos Encontrados: "); // Mostra a quantidade dispositivos conectados ao barramento
Serial.println(dispositivosConectados,DEC);
for (int i=0; i<dispositivosConectados; i++){ // Itera sob todos os dispositivos conectados no barramento One Wire
if (sensores.getAddress(enderecoDispositivo,i)){ // Se um dispositivo estiver conectado
Serial.println("Dispositivo Encontrado"); // Mostro que o dispositivo foi encontrado e o endereço onde ele está
Serial.print("Endereço do dispositivo: ");
mostrarEndereco();
sensores.setResolution(enderecoDispositivo,PRECISAO_TEMPERATURA); // Configuro a taxa de precisão do sensor de temperatura ( 9 mínimo e 12 máximo)
Serial.print("Sensor: ");
Serial.print(i);
Serial.print(" Configurado com precisão de: ");
Serial.print(PRECISAO_TEMPERATURA);
Serial.println(" Bits");
}
}
}
void mostrarEndereco(){ // Função que mostra o endereço do dispositivo conectado ao barramento
for (byte i=0; i<8; i++){ // Endereço composto por um de 8 bytes (64 bits)
if (enderecoDispositivo[i]<16){ // Se o número for menor que 16 escrevemos o valor 0
Serial.print("0");
}
else{
Serial.print(enderecoDispositivo[i],HEX); // Caso contrário escrevemos o byte correspondente ao endereço
}
}
Serial.println();
}
void loop() {
sensores.requestTemperatures(); // Envia um comando em broadcast para que todos os sensores realizem a leitura da temperatura
for (int i=0; i<dispositivosConectados; i++){ // Realizo uma iteração sob todos os sensores conectados
if (sensores.getAddress(enderecoDispositivo,i)){ // Se um dispositivo estiver conectado
float temperaturaCelsius = sensores.getTempC(enderecoDispositivo); // Pego a temperatura do sensor ( valor em Celsius )
Serial.print("Temperatura sensor: "); // Mostro o valor da tempratura em celsius e Fahrenheit
Serial.print(i);
Serial.print(" Celsius: ");
Serial.print(temperaturaCelsius);
Serial.print(" Fahrenheit: ");
Serial.println(DallasTemperature::toFahrenheit(temperaturaCelsius));
}
}
delay(TEMPOESPERA); // Aguardo o intervalo de tempo necessário entre as leituras
}
Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Vamos compartilhar conhecimento!
Mergulhando no projeto
Agora que elaboramos o nosso código, vamo entender como cada parte dele funciona, incluindo todas a bibliotecas que iremos precisar.
Bibliotecas necessárias
Neste projeto, iremos utilizar duas bibliotecas que por padrão não estão incluidas na IDE do Arduino, que são as bibliotecas One-Wire e DallasTemperature. Para fazer o download das duas, basta pesquisar por OneWire no gerenciador de bibliotecas.


Para acessar o Gerenciador de bibliotecas, basta clicar no menu Sketch>Incluir Biblioteca> Gerenciar Bibliotecas.
Variáveis Definidas:
– Defines
- PINO_ONE_WIRE: pino onde o sensor será conectado.
- PRECISAO_TEMPERATURA: precisão utilizada para configurar o sensor ( 9 mínimo 12 máximo).
- TEMPOESPERA: tempo de espera entre cada leitura dos sensores.
– Objetos
- oneWire: objeto responsável por estabelecer a comunicação utilizando o protocolo de comunicação oneWire.
- sensores: objeto responsável por se comunicar com todos os sensores de temperatura conectados ao barramento.
- enderecoDispositivo: objeto responsável por armazenar temporáriamente o endereço de todos os dispositivos conectados.
– Variáveis
- dispositivosConectados: armazena a quantidade de sensores de temperatura conectados ao sistema.
Função setup
dentro da função setup, iremos inicializar e configurar os sensores conectados ao nosso microcontrolador. Também iremos inicializar a comunicação serial para leitura dos dados obtidos.
- Serial.begin(9600): Inicializa a comunicaçao serial.
- sensores.begin(): Inicializa a comunicação com os sensores de temperatura.
- sensores.getDeviceCount(): retorna a quantidade de sensores conectados ao microcontrolador.
Logo em seguida realizamos uma iteração em todos os sensores conectados ao microcontrolador, utilizando o comando for e utilizando o comando sensores.getAddress() buscamos por sensores disponíveis. Ao encontrar um sensor disponível, configuramos a sua precisão através do comando sensores.setResolution() e mostramos o seu identificador através da função mostrarEndereco().
Função mostrarEndereço
O sensor de temperatura DS18B20 possui em sua memória, um endereço único composto por 64 bits, esta função tem como objetivo mostrar o endereço de cada um dos sensores conectados ao nosso microcontrolador. Para isso, a função irá escrever através da serial o valor destes sensores percorrendo as 8 posições do objeto enderecoDispositivo, onde estes dados vão estar armazenados.
Função loop
Por fim, dentro da função loop, iremos enviar uma mensagem em broadcast ( todos os dispositivos conectados ) solicitando a temperatura de cada um deles. Logo em seguida faremos novamente uma iteração em todos os dispositivos conectados ao microcontrolador utilizando o comando for. ao verificar cada um dos dispositivos, iremos obter a temperatura de cada um deles através do método getTempC. Por fim iremos mostrar a temperatura de cada um dos sensores tanto em Celsius quanto Fahrenheit através da serial.

Hardware
Sensor de temperatura DS18B20
O sensor de temperatura DS18B20 é um circuito termômetro digital, capaz de medir temperaturas entre -55°C e +125°C. Seu uso com o protocolo One-Wire, permite com que vários dispositivos possam ser conectados ao mesmo pino de comunicação. E seu encapsulamento a prova d’agua o torna ideal para medições submersas ou locais de alta úmidade.

Especificações Técnicas:
- Tensão de funcionamento: 3 – 5.5 Volts.
- Precisão da leitura: Configurável de 9 até 12 bits.
- Modelos: Encapsulamento a prova d’agua ou encapsulamento .
- Pinos: Vermelho VCC, Preto GND, Amarelo Dados.
- Protocolo de comunicação: One-Wire.
- Faixa de medição: -55°C e +125°C (Erro +/- 0,5 ºC ).
Conclusão
Neste tutorial, aprendemos a como utilizar o sensor de temperatura DS18B20, um módulo que pode ser utilizado em diversos cenários para análise de temperatura. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Deixe uma resposta