Como usar o Sensor de Temperatura – DS18B20

Com a pandemia do Covid-19, é comum a preocupação com a temperatura da população como uma medida de diminuir o risco de transmissão do vírus. Para isso, muitos projetos estão sendo desenvolvidos com o uso de sensores de temperatura, e é por isso que conheceremos o Sensor de Temperatura DS18B20 e desenvolveremos um projeto com ele. O mesmo pode ser utilizado em projetos de aquário, estufa, pesqueiros, panelas elétricas, entre outros. Esse tutorial será definido nos seguintes tópicos, clique em algum título para ir ao trecho correspondente.

Sensor de Temperatura DS18B20

O Sensor de Temperatura DS18B20 é um sensor digital que realiza medições na faixa de -55° a 125°C, em ambiente seco, úmido ou submerso, não necessitando de um componente externo para isso, além de apresentar os valores em graus celsius.

O DS18B20 conta com precisão de ±0,5°C na faixa de medição de -10°C a 85°C, outrossim, apresenta faixas de medição distintas, podendo ter o incremento de 0,5°C (9 bits), 0,25°C (10bits), 0,125°C (11 bits) e  0,0625°C (12 bits), sendo essa última a resolução padrão.  O sensor tem Protocolo One-Wire, ou seja, a sua comunicação é feita através de um único fio de dados, além do VCC e do GND. Ademais, cada DS18B20 conta com um código ID próprio de 64 bits, deste modo é possível que até 127 sensores funcionem em um mesmo barramento, poupando espaço do microcontrolador.

Além do já exposto, o sensor conta com alarme programável, veremos um pouco sobre essa função mais adiante, mas de forma prévia, é possível realizar a configuração definindo uma temperatura mínima ou máxima, sendo que os valores que estão fora dessa faixa disparam o alarme.

O sensor em questão se faz útil para projetos de Controle Ambiental, de Climatização, Monitoramento de temperatura, sistemas de monitoramento e controle de processos e é comercializado em três modelos, sendo estes:

O DS18B20 tipo sonda:


DS18B20 tipo TO92

 

DS18B20U (versão SMD)

SMD 18B20
Em nosso catálogo do site temos os modelos: DS18B20 e DS18B20 tipo TO92.

A diferença entre os modelos está apenas na estrutura deles e no fato do tipo sonda ser a prova d’água.

Suas principais Características são:

  • Chip: DS18B20;
  • Tensão de operação: 3 a 5VDC;
  • Consumo: 1,5mA;
  • Comunicação: 1 fio;
  • Faixa de medição: -55° a 125°C;
  • Resolução de saída: 9 a 12 bits (programável);
  • Tempo de conversão: 750ms (12-bits);
  • Precisão: ±0,5 entre -10°C e 85°C;

O datasheet que os descreve está disponível abaixo:

DS18B20

Qual é a diferença entre Analógico e Digital?

Um sensor analógico consiste em um sensor que gera um sinal contínuo e oscilante que varia de acordo com o tempo, apresentando intermédios entre os valores. De forma oposta, o sinal digital conta com valores discretos e descontínuos ao longo do tempo.

A linha cinza ilustra um sinal analógico e a vermelha o sinal digital.

analógico x digital

Arquitetura interna do Sensor

De acordo com o diagrama em blocos do retirado do Datasheet do DS18B20

datasheet DS18B20

O sensor interno de temperatura (temperature sensor) varia de tensão em concordância com a temperatura, que por sua vez é digitalizada e memorizada em dois bytes no bloco scratchpad. Além disso, este bloco permite o acesso aos registros de alarme programável (TH e TL).

Através deste também é possível fazer a configuração de registro, possibilitando a definição da resolução da conversão. Todos esses dados são armazenados em uma memória não volátil, ou seja, os dados são conservados mesmo com a desenergização do sistema.


Sobre o Protocolo One-Wire

O sensor, como mencionado, utiliza apenas um fio para envio de dados, sendo este um coletor aberto de um transistor NPN, neste transistor o pino emissor é conectado ao GND, fazendo-se necessário o uso de um resistor pull-up.

Quando conectamos um ou mais sensores no mesmo barramento, podemos notar o comportamento no padrão Mestre-Escravo, em que o Microcontrolador por sua vez faz o papel de Mestre e os sensores atuam como Escravos.


Modo Normal de Alimentação

No modo Normal de alimentação, utilizamos o pino data, fio azul no exemplo, ligado ao digital do microcontrolador, o resistor pull-up entre o VCC e o data, o VCC ligado na tensão de alimentação (3.3 ou 5V) e o GND ligado ao Terra. Confira o diagrama abaixo para verificar o padrão de ligação para mais de um sensor.

 DS18B20 no modo normal de alimentação

Modo Parasita        

No Modo de energia parasita, usamos a energia da própria linha de dados, no entanto, esse modo só pode ser utilizado em casos de medição de tensão de acima de 100°C, por isso não demonstraremos nesse tutorial. Além disso, para uso desse método é necessário o uso de um Mosfet em Pull-up, devido ao aumento de corrente. Para mais informações acerca do modo, consulte o datasheet do componente, mas em linhas gerais esse modo não é muito recomendado pelos usuários.

 DS18B20 no modo parasita

Teste DS18B20

Para realizar o teste do sensor, serão utilizados os seguintes componentes:

 

Lista de Materiais

01- Placa Microcontroladora (Utilizada: Arduino Uno Compatível com Cabo USB);

01- Sensor de Temperatura DS18B20;

01- Resistor de 4,7KΩ;

01- Protoboard 400 pontos;

Kit de jumpers;

Bibliotecas do DS18B20

Para desenvolvimento do programa, é necessário o uso de duas bibliotecas, sendo estas: OneWire.h e DallasTemperature.h, você pode baixa-las na própria IDE do Arduino indo em Sketch > Incluir Biblioteca> Gerenciar Bibliotecas...
Seguidamente realizando uma busca pelos seus nomes.

DallasTemperature biblioteca 
onewire biblioteca

Depois de já ter instalado as bibliotecas, faremos a ligação conforme o esquemático.

sensor de temperatura arduino

projeto DS18B20

Com a montagem pronta, abra o exemplo de teste disponível na biblioteca DallasTemperature em Arquivo> Exemplos> DallasTemperature> Tester.

 

/********************************************************************
 * Projeto de medição de temperatura com DS18B20
 * Desenvolvido pela Curto Circuito com base no exemplo Simple
 */
/********************************************************************/


#include <OneWire.h>  
#include <DallasTemperature.h>
/********************************************************************/

#define dados 2 

OneWire oneWire(dados);  
/********************************************************************/
DallasTemperature sensors(&oneWire); 
/********************************************************************/ 
void setup(void) 
{ 
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 
/********************************************************************/
 Serial.print(" Requerimento de temperatura..."); 
 sensors.requestTemperatures(); 
 Serial.println("Pronto");  
/********************************************************************/
 Serial.print("A temperatura é: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
}

 

Depois de carregar o programa, verifique o seu sensor em funcionamento no Monitor Serial da IDE do Arduino.

 monitor serial DS18B20


DS18B20 com Led

Como foi mencionado em outro trecho do tutorial, o sensor de temperatura conta com a opção da emissão de um alarme caso o mesmo ultrapasse determinada temperatura, vamos utilizar um Led para emitir um sinal visual de alerta quando isso ocorrer.

Para esse exemplo você precisará dos seguintes materiais.

Lista de Materiais

01- Placa Microcontroladora (Utilizada: Arduino Uno Compatível com Cabo USB);

01- Sensor de Temperatura DS18B20;

01- Resistor de 4,7KΩ;

01- Protoboard;

01- Led vermelho;

Kit de jumpers;

 

Agora acrescentaremos algumas linhas de código no programa Simple para a inserção do Led e configuração do alarme, o Led deve ser ligado a porta 7 do Arduino, além disso deve ser definido que o alarme acione quando a temperatura estiver acima do valor escolhido, eu optei por 30°C por ser uma temperatura relativamente baixa e fácil de se alcançar para demonstração.

#define dados 2
#define led 7
#define alarme 30
OneWire oneWire(dados);

E em void setup configuraremos o Led como saída (OUTPUT).

void setup(void)
{ 
 pinMode (led, OUTPUT);
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor");
 sensors.begin(); 
}

Por fim, no void loop definiremos que o Led irá ligar quando a temperatura for maior do que a definida em "alarme", do contrário, será desligado.

void loop(void) 
{ 
 Serial.print(" Requerimento de temperatura..."); 
 sensors.requestTemperatures(); 
 Serial.println("Pronto");  
 Serial.print("A temperatura é: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
if (sensors.getTempCByIndex(0) > alarme) {
     digitalWrite(led, HIGH);
   }
   else { 
digitalWrite(led, LOW); 
   }
} 

O programa completo com todas as modificações está disponível abaixo, copie e cole em sua IDE para análise do projeto com Led:

/********************************************************************
 * Projeto de medição de temperatura com DS18B20 e LED
 * Desenvolvido pela Curto Circuito com base no exemplo Simple
 */
/********************************************************************/


#include <OneWire.h>  
#include <DallasTemperature.h>
/********************************************************************/

#define dados 2 
#define led 7 
#define alarme 30 
OneWire oneWire(dados);  
/********************************************************************/
DallasTemperature sensors(&oneWire); 
/********************************************************************/ 
void setup(void) 
{ 
 pinMode (led, OUTPUT);
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 
/********************************************************************/
 Serial.print(" Requerimento de temperatura..."); 
 sensors.requestTemperatures(); 
 Serial.println("Pronto");  
/********************************************************************/
 Serial.print("A temperatura é: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 if (sensors.getTempCByIndex(0) > alarme) { 
     digitalWrite(led, HIGH); 
   }
   else {          
digitalWrite(led, LOW); 
   }
}

 

Depois de carregar, verifique o funcionamento, note que quando eu aqueço o sensor com a minha mão, o mesmo acende o led por atingir uma temperatura maior do que 30°C.

 

Essa ideia pode ser utilizada em diversos projetos que precisam de um sinal de alarme quando algum componente ou o ambiente ultrapassa uma temperatura específica.

DS18B20 com Led e Buzzer


Para o projeto ficar ainda mais interessante, podemos inserir um buzzer para emitir um alerta sonoro que irá funcionar em conjunto com o emissor visual, o led.

Lista de Materiais

01- Placa Microcontroladora (Utilizada: Arduino Uno Compatível com Cabo USB);

01- Sensor de Temperatura DS18B20;

01- Resistor de 4,7KΩ;

01- Protoboard;

01- Led vermelho;

01- Buzzer Auto oscilante 5V;

Kit de jumpers;

 

Para a montagem do projeto, siga o esquemático abaixo, atente-se à polaridade do buzzer.

ds18b20 projeto com buzzer

Quanto a programação, continuaremos com o mesmo programa, mas faremos as modificações necessárias para a inserção deste novo componente.

Definiremos buzzer como o pino 3 do Arduino

#define dados 2
#define led 7
#define alarme 30
#define buzzer 3
OneWire oneWire(dados);

E no laço de configuração determinaremos o pino buzzer como saída

void setup(void) 
{ 
 pinMode (led, OUTPUT); 
 pinMode(buzzer, OUTPUT);
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin();
}

Em seguida, incluiremos o buzzer na condição que criamos no void loop, e configuraremos um delay para dar intervalos, dessa forma emitindo um som pulsante.

if (sensors.getTempCByIndex(0) > alarme) { 
     digitalWrite(led, HIGH); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250);
     delay(250); 
     
   }

 

Depois de realizar todas as configurações, carregue em sua IDE e verifique o funcionamento, o programa pronto está disponível abaixo:

 

/********************************************************************
 * Projeto de medição de temperatura com DS18B20 e LED
 * Desenvolvido pela Curto Circuito com base no exemplo Simple
 */
/********************************************************************/


#include <OneWire.h>  
#include <DallasTemperature.h>
/********************************************************************/

#define dados 2 
#define led 7 
#define alarme 30 
#define buzzer 3 
OneWire oneWire(dados);  
/********************************************************************/
DallasTemperature sensors(&oneWire); 
/********************************************************************/ 
void setup(void) 
{ 
 pinMode (led, OUTPUT);
 pinMode(buzzer, OUTPUT);
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 
/********************************************************************/
 Serial.print(" Requerimento de temperatura..."); 
 sensors.requestTemperatures(); 
 Serial.println("Pronto");  
/********************************************************************/
 Serial.print("A temperatura é: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 if (sensors.getTempCByIndex(0) > alarme) { 
     digitalWrite(led, HIGH); 
     
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250);
     delay(250); 
     
   }
   else {          
digitalWrite(led, LOW); 
   }
}

DS18B20 com Led, Buzzer e Cooler

Para finalizar, eu vou inserir um Cooler ligado ao pino 4 do Arduino, a intenção é de que ele ligue quando a temperatura atingir 30°C, contribuindo para o resfriamento do ambiente em que o sensor está incluído.

Lista de Materiais

01- Placa Microcontroladora (Utilizada: Arduino Uno Compatível com Cabo USB);

01- Sensor de Temperatura DS18B20;

01- Resistor de 4,7KΩ;

01- Protoboard;

01- Led vermelho;

01- Buzzer Auto oscilante 5V;

Kit de jumpers;

01- Micro Ventilador 12V

01- Conversor DC/DC- Boost- XL6009

01- Módulo Relé 1 Canal com Optoacoplador - 5V/10A

 

Como o ventilador é de 12V e as tensões disponibilizadas pelo Arduino são de 3V e 5V, eu inseri um conversor de tensão do tipo boost (elevador de tensão) em conjunto com o módulo relé para acionamento.

 

ds18b20 com cooler

Em seguida incluiremos as linhas de configuração e controle do cooler, primeiramente definiremos a porta correspondente a ligação do mesmo com o Arduino.

#define dados 2
#define led 7
#define alarme 30
#define buzzer 3
#define cooler 4
OneWire oneWire(dados);

No laço de configuração ajustaremos o cooler como saída.

void setup(void) 
{ 
 pinMode (led, OUTPUT); 
 pinMode(buzzer, OUTPUT); 
 pinMode(cooler, OUTPUT); 
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin(); 
}

E em void loop faremos as declarações necessárias para que o cooler ligue quando necessário e desligue quando não for mais.

if (sensors.getTempCByIndex(0) > alarme) { 
     digitalWrite(led, HIGH);
     digitalWrite(cooler, LOW); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250);
     delay(250); 
     
   }
   else {       
digitalWrite(led, LOW); 
digitalWrite(cooler, HIGH); 
   }
}

O programa finalizado e comentado está disponível abaixo, carregue em sua placa e veja o funcionamento.

 

/********************************************************************
 * Projeto de medição de temperatura com DS18B20 e LED
 * Desenvolvido pela Curto Circuito com base no exemplo Simple
 */
/********************************************************************/


#include <OneWire.h>  
#include <DallasTemperature.h>
/********************************************************************/

#define dados 2        
#define led 7          
#define alarme 30      
#define buzzer 3       
#define cooler 4       
OneWire oneWire(dados);
/********************************************************************/
DallasTemperature sensors(&oneWire); 
/********************************************************************/ 
void setup(void) 
{ 
 pinMode (led, OUTPUT); 
 pinMode(buzzer, OUTPUT); 
 pinMode(cooler, OUTPUT); 
 Serial.begin(9600); 
 Serial.println("Demonstração do funcionamento do sensor"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 
/********************************************************************/
 Serial.print(" Requerimento de temperatura..."); 
 sensors.requestTemperatures(); 
 Serial.println("Pronto");  
/********************************************************************/
 Serial.print("A temperatura é: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 if (sensors.getTempCByIndex(0) > alarme) { 
     digitalWrite(led, HIGH); 
     digitalWrite(cooler, LOW); 
     
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250); 
     delay(250);
     tone(buzzer, 1000, 250);
     delay(250); 
     
   }
   else {          
digitalWrite(led, LOW); 
digitalWrite(cooler, HIGH); 
   }
}

 

Abaixo pode ser visto o vídeo deste projeto finalizado, note que eu utilizei um relé de 2 canais, mas assim como demonstrado no esquemático, apenas um canal é utilizado, eu fiz uso deste pois era o módulo que eu tinha em mãos.

 

 

Conclusão

Em conformes com o que foi apresentado, a possibilidade de criação com o DS18B20 é muito ampla, podendo ser utilizado em diversos projetos de monitoramento de temperatura e controle em conjunto com outros componentes, como demonstrado. O funcionamento do sensor se provou eficaz e prático, sendo o modelo a prova d'água perfeito para projetos de medição de temperatura em líquidos e congelados.
Para qualquer dúvida, opinião ou sugestão, deixe o seu comentário.

Abraços, Curto Circuito

:)