Primeiros passos com sensor de temperatura DS18B20

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.

Montagem do projeto.

 

 

 

 

 

 

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.

 

Biblioteca DallasTemperature.
Biblioteca OneWire.

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.

Exemplo de saída.

 

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.

Sensor DS18B20

 

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.

Referências

Datasheet DS18B20

Sobre Danilo Almeida 5 artigos
Bacharel em Ciência da computação, pela Universidade Federal de Viçosa - Campus Florestal, e atualmente mestrando em Ciência da computação na área de arquitetura de computadores, é um entusiasta na área de sistemas embarcados e robótica, buscando sempre aprimorar e compartilhar o conhecimento obtido através de bastante estudo e noites sem dormir :) .

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*