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
- Qual é a diferença entre analógico e digital?
- Arquitetura interna do Sensor
- Sobre o Protocolo One-Wire
- Modo Normal de Alimentação
- Modo Parasita
- Teste DS18B20
- DS18B20 com Led
- DS18B20 com Led e Buzzer
- DS18B20 com Led, Buzzer e Cooler
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)
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:
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.
Arquitetura interna do Sensor
De acordo com o diagrama em blocos do retirado do Datasheet do 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.
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.
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Ω;
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.
Depois de já ter instalado as bibliotecas, faremos a ligação conforme o esquemático.
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
*/
/********************************************************************/
/*inclusão das bibliotecas necessárias*/
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
#define dados 2 /*o pino de dados do sensor está ligado na porta 2 do Arduino*/
OneWire oneWire(dados); /*Protocolo OneWire*/
/********************************************************************/
DallasTemperature sensors(&oneWire); /*encaminha referências OneWire para o sensor*/
/********************************************************************/
void setup(void) /*laço de configuração*/
{
Serial.begin(9600); /*definição de Baudrate de 9600*/
Serial.println("Demonstração do funcionamento do sensor"); /*Printa "Demonstração do funcionamento do sensor"*/
sensors.begin(); /*inicia biblioteca*/
}
void loop(void) /*laço de repetição*/
{
/* use sensors.requestTemperatures() para o requerimento de temperatura de todos os dispositivos ligados */
/********************************************************************/
Serial.print(" Requerimento de temperatura...");
sensors.requestTemperatures(); /* Envia o comando para leitura da temperatura */
Serial.println("Pronto"); /*Printa "Pronto" */
/********************************************************************/
Serial.print("A temperatura é: "); /* Printa "A temperatura é:" */
Serial.print(sensors.getTempCByIndex(0)); /* Endereço do sensor */
}
Depois de carregar o programa, verifique o seu sensor em funcionamento no Monitor Serial da IDE do Arduino.
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;
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
*/
/********************************************************************/
/*inclusão das bibliotecas necessárias*/
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
#define dados 2 /*o pino de dados do sensor está ligado na porta 2 do Arduino */
#define led 7 /* o led está ligado a porta 7 do Arduino */
#define alarme 30 /* o alarme será acionado com a temperatura de 30°C */
OneWire oneWire(dados); /* Protocolo OneWire */
/********************************************************************/
DallasTemperature sensors(&oneWire); /* encaminha referências OneWire para o sensor */
/********************************************************************/
void setup(void) /* laço de configuração */
{
pinMode (led, OUTPUT);
Serial.begin(9600); /* definição de Baudrate de 9600 */
Serial.println("Demonstração do funcionamento do sensor"); /* Printa "Demonstração do funcionamento do sensor" */
sensors.begin(); /* inicia biblioteca */
}
void loop(void) /* laço de repetição */
{
/* use sensors.requestTemperatures() para o requerimento de temperatura de todos os dispositivos ligados */
/********************************************************************/
Serial.print(" Requerimento de temperatura...");
sensors.requestTemperatures(); /* Envia o comando para leitura da temperatura */
Serial.println("Pronto"); /* Printa "Pronto" */
/********************************************************************/
Serial.print("A temperatura é: "); /*Printa "A temperatura é:"*/
Serial.print(sensors.getTempCByIndex(0)); /* Endereço do sensor */
if (sensors.getTempCByIndex(0) > alarme) { /* se a temperatura for maior que o alarme*/
digitalWrite(led, HIGH); /* escreve nível lógico alto no LED (acende) */
}
else { /* caso contrário*/
digitalWrite(led, LOW); /*escreve nível lógico baixo no LED (apaga) */
}
}
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.
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;
Para a montagem do projeto, siga o esquemático abaixo, atente-se à polaridade do 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
*/
/********************************************************************/
/* inclusão das bibliotecas necessárias */
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
#define dados 2 /*o pino de dados do sensor está ligado na porta 2 do Arduino */
#define led 7 /* o led está ligado a porta 7 do Arduino */
#define alarme 30 /* o alarme será acionado com a temperatura de 30°C */
#define buzzer 3 /*o buzzer está ligado a porta 3 do Arduino */
OneWire oneWire(dados); /* Protocolo OneWire*/
/********************************************************************/
DallasTemperature sensors(&oneWire); /* encaminha referências OneWire para o sensor */
/********************************************************************/
void setup(void) /*laço de configuração*/
{
pinMode (led, OUTPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600); /*definição de Baudrate de 9600 */
Serial.println("Demonstração do funcionamento do sensor"); /*Printa "Demonstração do funcionamento do sensor" */
sensors.begin(); /* inicia biblioteca */
}
void loop(void) /* laço de repetição */
{
/* use sensors.requestTemperatures() para o requerimento de temperatura de todos os dispositivos ligados */
/********************************************************************/
Serial.print(" Requerimento de temperatura...");
sensors.requestTemperatures(); /* Envia o comando para leitura da temperatura */
Serial.println("Pronto"); /*Printa "Pronto" */
/********************************************************************/
Serial.print("A temperatura é: "); /* Printa "A temperatura é:" */
Serial.print(sensors.getTempCByIndex(0)); /* Endereço do sensor */
if (sensors.getTempCByIndex(0) > alarme) { /*se a temperatura for maior que o alarme */
digitalWrite(led, HIGH); /* escreve nível lógico alto no LED (acende) */
/* configura buzzer para emitir som pulsante*/
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 { /*caso contrário */
digitalWrite(led, LOW); /* escreve nível lógico baixo no LED (apaga)*/
}
}
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- Protoboard;
01- Led vermelho;
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.
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
*/
/********************************************************************/
/*inclusão das bibliotecas necessárias*/
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
#define dados 2 /*o pino de dados do sensor está ligado na porta 2 do Arduino */
#define led 7 /* o led está ligado a porta 7 do Arduino */
#define alarme 30 /* o alarme será acionado com a temperatura de 30°C */
#define buzzer 3 /* o buzzer está ligado a porta 3 do Arduino */
#define cooler 4 /* o pino do cooler está ligado ao 4 do Arduino */
OneWire oneWire(dados);/* Protocolo OneWire */
/********************************************************************/
DallasTemperature sensors(&oneWire); /*encaminha referências OneWire para o sensor */
/********************************************************************/
void setup(void) /*laço de configuração */
{
pinMode (led, OUTPUT); /*configura o pino led como saída */
pinMode(buzzer, OUTPUT); /*configura o pino buzzer como saída */
pinMode(cooler, OUTPUT); /* configura o pino cooler como saída */
Serial.begin(9600); /* definição de Baudrate de 9600 */
Serial.println("Demonstração do funcionamento do sensor"); /*Printa "Demonstração do funcionamento do sensor" */
sensors.begin(); /*inicia biblioteca */
}
void loop(void) /* laço de repetição */
{
/* use sensors.requestTemperatures() para o requerimento de temperatura de todos os dispositivos ligados */
/********************************************************************/
Serial.print(" Requerimento de temperatura...");
sensors.requestTemperatures(); /* Envia o comando para leitura da temperatura */
Serial.println("Pronto"); /* Printa "Pronto" */
/********************************************************************/
Serial.print("A temperatura é: "); /* Printa "A temperatura é:" */
Serial.print(sensors.getTempCByIndex(0)); /* Endereço do sensor */
if (sensors.getTempCByIndex(0) > alarme) { /*se a temperatura for maior que o alarme */
digitalWrite(led, HIGH); /*escreve nível lógico alto no LED (acende) */
digitalWrite(cooler, LOW); /*Liga o cooler */
/*configura buzzer para emitir som pulsante */
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 { /* caso contrário */
digitalWrite(led, LOW); /* escreve nível lógico baixo no LED (apaga) */
digitalWrite(cooler, HIGH); /* para o cooler */
}
}
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
:)
Nesse caso, verifique se o sensor está com defeito ou se a conexão está correta. O resistor foi conectado corretamente ao Sinal e o VCC?
O Arduino está lendo corretamente o Sensor? Através da porta serial do próprio Arduino é possível verificar o recebimento de dados do sensor. Fique atento também ao resistor que é necessário utilizar para ligar o sensor.
Você chegou a criar as tags para lerem os dados enviados pelo Arduino no Elipse SCADA ? Verifique se elas estão configuradas corretamente. Também certifique-se de que o Driver Serial está configurado corretamente para a porta COM do Arduino.
Sobre o código, ele precisa ser alterado, pois cada sensor precisa ser definido separadamente. Cada sensor DS18B20 possui um identificador único chamado ROM ID. Você precisa identificar cada sensor e usar esses IDs para se comunicar com eles individualmente.
É possível acionar o Relé sem um Arduino, no entanto, você perderia o controle necessário para o projeto funcionar.
Se o seu Arduino tiver apenas os sensores, sem ultrapassar 1A, não há necessidade do uso de uma fonte externa.