DS18B20 – Sensor de temperatura inteligente

Neste tutorial iremos demonstrar como desenvolver sistemas de monitoramento de temperatura utilizando o sensor de temperatura DS18B20. Para demonstrar seu funcionamento, utilizaremos o Arduino uno.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Sensores de Temperatura

Os sensores de temperatura são dispositivos que ajudam a identificar o nível de aquecimento de um determinado equipamento ou processo com o objetivo de fazer com que este permaneça em condições adequadas para o seu funcionamento.

Em virtude dos infinitos tipos de aplicações existentes, é fácil perceber a necessidade de uma vasta gama de sensores, os quais, de maneira individual, cumprem requisitos particulares de cada situação.

Aqui em nosso portal nós tempos dois tutoriais muito interessantes sobre medição de temperatura:

O sensor de temperatura DS18B20

O sensor de temperatura DS18B20 é um termômetro digital produzido pela Dallas Instruments.

Sensor DS18B20 produzido pela dallas
Sensor DS18B20 produzido pela dallas

Em geral, sensores de temperaturas são analógicos (entenda Grandezas digitais e analógicas) e fornecem um valor de tensão ou corrente que será interpretado pelo Arduino ou outro microcontrolador.

Já o sensor DS18B20 possui sua própria inteligência. Ele é capaz de ler a temperatura, interpreta-la e enviar a informação do valor de temperatura em graus Celsius para o microcontrolador usando um barramento de apenar um fio (protocolo de comunicação One wire ou 1-wire ).

O sensor de temperatura DS18B20 pode medir temperaturas entre -55 ºC e 125 ºC com uma precisão de cerca de 0,5 ºC na faixa de -10 ºC e +85 ºC.

– Endereço único e fixo

Cada sensor DS18B20 possui um endereço serial exclusivo de 64 bits, de modo que, o desenvolvedor,  pode colocar vários sensores em um mesmo barramento, utilizando apenas uma única porta do microcontrolador e obter os valores de temperatura de cada sensor separadamente.

Esquema retirado do Datasheet do DS18B20
Esquema retirado do Datasheet do DS18B20 – É possível pendurar vários sensores no mesmo barramento 1-wire.

Assim, é simples usar um  microcoontrolador para controlar muitos DS18B20s distribuídos por uma grande área.

– Encapsulamento

O Sensor de temperatura DS18B20 é produzido com encapsulamento TO-92, que é o mesmo formato que o LM35.

Sensor DS18B20 encapsulamento TO-92
Sensor DS18B20 encapsulamento TO-92

Mas é muito comum encontrá-lo com proteção à prova d’água. É o mesmo sensor de temperatura, apenas soldam os fios nas pernas do DS18b20 e o colocam dentro de uma capsula metálica.

Sensor DS18B20 à prova d'água
Sensor DS18B20 à prova d’água

Veja que dentro do encapsulamento metálico podemos encontrar o DS18B20 em seu formato original:

Dentro do encapsulamento metálico do sensor DS18B20 à prova d'água.
Dentro do encapsulamento metálico do sensor DS18B20 à prova d’água.

Devido a sua versatilidade, esses sensores são muito usados e controle de climatização, monitoramento de temperatura de equipamentos e máquinas e monitoramento de processos e sistemas de controle.

É comum encontrá-los também no controle de temperatura de piscinas e banheiras aquecidas.

– Outras vantagens

Esse sensor ainda possui outros recursos muito interessantes que não serão usados nesse tutorial, mas fica a dica para futuros estudos:

  • Modo parasita (Parasitic Power Mode): Ele pode ser alimentado usando o próprio barramento de comunicação, assim, em vez de usar 3 fios para ligar o sensor, seria usado apenas 2. Um para comunicação e alimentação e outro como referência;
  • Alarme programável: É possível programar um alarme de temperatura alta e baixa.  para que quando a temperatura estiver fora desses valores o sensor sinalize. Esse configuração é gravada em uma memória não volátil EEPROM (Entenda o que é memoria não volátil);
  • Resolução configurável: Por fim, é possível configurar qual a resolução que se deseja: 9, 10, 11 ou 12 bits.

Veja mais no Datasheet do sensor DS28b20.


Mãos à obra – Medindo temperaturas com um sensor DS18B20

Componentes necessários

Para desenvolver este projeto, precisaremos dos seguintes componentes:

Montando o projeto

 Sensor de temperatura DS18B20
Hardware montado com Arduino e Sensor de temperatura DS18B20
 Montagem física do projeto de medição de temperatura com DS18b20
Montagem física do projeto de medição de temperatura com DS18b20.

Programando

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

OneWire pino(3);
DallasTemperature barramento(&pino);
DeviceAddress sensor;

void setup(void)
{
  Serial.begin(9600);
  barramento.begin();
  barramento.getAddress(sensor, 0);  
}

void loop()
{
  barramento.requestTemperatures(); 
  float temperatura = barramento.getTempC(sensor);
  Serial.print(temperatura);
  delay(500);
}

Colocando para funcionar

Figura 4 – Projeto funcionando – Lendo valores do  Sensor de temperatura DS18B20

Entendendo a fundo

Hardware

– Protocolo One-Wire

Nesta seção nós vamos falar um pouco do protocolo de comunicação utilizado para fazermos com que os dados provenientes do sensor de temperatura DS18B20 cheguem até o nosso Arduino UNO o protocolo One-Wire (também referenciado como 1-Wire).

O protocolo One-Wire foi desenvolvido pela Dallas Semiconductor e consiste em um protocolo de comunicação cuja estrutura se dá em forma de um barramento, ou seja, sob a forma de uma linha única para transmissão de dados, na qual, podem ser conectados vários dispositivos, de modo que estes possam trocar informações com o nosso Arduino UNO.

Você pode estar pensando neste momento que o protocolo em questão é idêntico ao nosso famoso protocolo SPI, entretanto, apesar de parecerem iguais, o protocolo One-Wire trabalha com taxas de transmissão de dados mais baixas e também com um maior alcance do que o protocolo SPI.

– Endereço One-Wire

Cada elemento inserido no barramento irá possuir um determinado endereço, de modo que, o próprio barramento, através de um algoritmo de busca pode determinar quais são os endereços que estão sendo utilizados pelos dispositivos para que seja possível fazer com que o mestre, em nosso caso, o Arduino UNO possa interagir com os mesmos de maneira rápida e fácil.

Barramento One-Wire de sensores de temperatura DS18B20
Figura 5 – Barramento One-Wire de sensores de temperatura DS18B20

Apenas como uma curiosidade, os endereços dos dispositivos são fixos e não podem ser alterados.

Software

Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível a realização da medição de temperaturas com o sensor de temperatura DS18B20.

– Incluindo as bibliotecas que serão utilizadas

O primeiro passo que devemos realizar para atingir o objetivo proposto consiste na inclusão das bibliotecas adequadas para permitir a interação do sensor de temperatura DS18B20 com o  Arduino UNO. Neste tutorial, nós vamos utilizar duas bibliotecas, estas são: OneWire.h (que pode ser obtida aqui) e a DallasTemperature.h, que por sua vez, pode ser adquirida neste link.

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

– Criando o objeto da classe Onewire

Na parte de criação de objetos, nós devemos criar primeiramente um objeto referente ao o pino que será utilizado para transmissão de dados.

OneWire pino(3);

– Criando o objeto da classe DallasTemperature

Em seguida, nós devemos criar o objeto que será responsável por representar o barramento de sensores em nosso código, associando o mesmo ao objeto pino, criado anteriormente. Neste momento, nós passamos a referência criada anteriormente (o objeto OneWire) para o objeto proveniente da biblioteca DallasTemperature (após a realização deste procedimento, nós iremos manipular somente a biblioteca DallasTemperature.h, de modo que, intrinsecamente ela mesma irá fazer o uso da biblioteca OneWire.h.

DallasTemperature barramento(&pino);

– Criando um objeto para o sensor

Em seguida, nós devemos criar o objeto que será responsável por representar o endereço do sensor de temperatura em nosso código (consequentemente, este objeto acaba representando o sensor em si, pois, ele está diretamente atrelado ao próprio endereço).

DeviceAddress sensor;

Como temos apenas um sensor, basta que nós criemos apenas um objeto do tipo DeviceAddress. No caso de termos mais de um sensor nós deveremos declarar um objeto do tipo DeviceAddress para cada elemento, ou seja, para dois sensores,  por exemplo, criaríamos os objetos sensor1 e sensor2.

– Definindo as configurações iniciais

Na função setup() nós vamos iniciar o nosso barramento de sensores através da sentença sensor.begin() e em seguida vamos armazenar o endereço do único sensor existente no barramento no objeto sensor. Além dos procedimentos realizados, nós vamos também iniciar a comunicação serial do nosso Arduino com a IDE do Arduino para imprimir os valores.

void setup() {
  Serial.begin(9600);
  barramento.begin(); 
  barramento.getAddress(sensor, 0)
}

Caso a nossa aplicação necessite a utilização de vários sensores nós podemos incluir alguns trechos de código responsáveis por fazer com que o barramento seja lido pelo Arduino e em seguida por fazer com que este informe para o leitor quantos sensores existem no mesmo. Estas linhas de código irão demonstrar os endereços físicos de cada sensor para o usuário, de modo que, caso testados um a um, será possível construir uma lista que possibilite identificar o sensor em aplicações que possuam vários sensores. Estas linhas de código podem ser inseridas após a sentença barramento.begin().

 Serial.print("Neste barramento foram encontrados ");
 Serial.print(barramento.getDeviceCount(), DEC);
 Serial.println(" sensores.");

Quando nós temos vários sensores em um mesmo barramento, os endereços dos mesmos serão armazenados de acordo com certos índices (começados com 0), que por sua vez, são utilizados para identificar os endereços existentes. Portanto, para dois sensores, por exemplo, podemos associar os endereços físicos encontrados pelo Arduino aos objetos do tipo DeviceAddress da seguinte forma:

barramento.getAddress(sensor1, 0)
barramento.getAddress(sensor2, 1)

– Realizando as medidas de temperatura

Dentro da função loop(), utilizamos a sentença barramento.requestTemperatures() para fazer a requisição das temperaturas obtidas ao longo do barramento e a sentença barramento.getTempC() para selecionar o valor referente à temperatura proveniente do nosso sensor e em seguida, armazenamos o mesmo dentro de uma variável do tipo float chamada temperatura.

void loop() 
{
  barramento.requestTemperatures();
  float temperatura = barrmento.getTempC(sensor);
  Serial.print(temperatura);
  delay(500);
}

De maneira análoga, no caso da existência de mais de um sensor de temperatura, basta utilizarmos a sentença barramento.getTempC() com o objeto do tipo DeviceAddress referente ao sensor desejado como parâmetro.


Considerações finais

Neste tutorial, demonstramos como você deve proceder para realizar medições de temperatura com um sensor DS18B20. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Privacy Preference Center