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]
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:
- LM35 – Medindo temperatura com Arduino
- DHT11 e DHT22 – Sensor de Humidade e Temperatura com Arduino
- Termopar tipo K + MAX 6675 – Medindo temperatura
O sensor de temperatura DS18B20
O sensor de temperatura DS18B20 é um termômetro digital produzido pela Dallas Instruments.
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.
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.
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.
Veja que dentro do encapsulamento metálico podemos encontrar o DS18B20 em seu formato original:
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
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
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.
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.
17 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Existe alguma maneira de usar o mesmo sensor em 2 microcontroladores ao mesmo tempo?
Boa noite. insira o comando no void loop: Serial.println(“Celsius”);. VAI RESOLVER ESSE PROBLEMA.
Olá Daniel,
Para mim só está retornando temperatura zero grau.
Já revisei diversas vezes o circuito e está tudo certo.
Saberia me ajudar?
Agradeço desde já
Olá Daniel, me tire uma dúvida se possível. Se sensores “recebem” dados variáveis, porque eles são colocados nas portas digitais e não nas analógicas?
Olá, boa tarde! Obrigado por compartilhar isso. Fiz exatamente como vc, mas só me retorna -127. Sabe o que pode ser?
Você é fantástico, salvou meu dia. Fiquei o dia todo tentando conectar meu ESP8266 com o DS18B20 e o que me retornava era apenas -127ºC. Com seu código, deu certo ! Muito obrigado.
olá
qual é o número máximo de sensores DS18B20, que o Arduino suporta?
obrigado
Ilton
coloquei o codigo e a formaçao correta do sistema na protoboard, mas esta aparecendo apenas -127 no monitor serial.
Também estou com esse problema
Olá, poderia me enviar as biblioteca e esse programa por email? [email protected]
Posso utilizar o arduino mega 2560 nessa aplicação?
Gostei muito da página.
Olá Daniel. Eu liguei 4 sensores e em bancada funcionaram, mas qdo liguei em campo, ele reconhece somente dois sensores, se eu ligo 4, ele diz que não tem nenhum. Os sensores devem ter uns 10 de cabo com malha, não sei a impedância do cabo que possa interferir na leitura,ou oque poderia poderia resolver esse problema?
Estes tutoriais são maravilhosos. Um motor na roda.
Saberia dizer o raio de medição que esse sensor abrange ?
Olá Daniel!
Você poderia enviar o scket desse projeto e suas bibliotecas? Meu email é: [email protected]
no meu esta dano erro me parece que tem uma chave a mais
ola bom dia tudo certo era somente o ponto e virgula que vc esqueceu na 3 linho do void setup e na segunda linha do void loop ficou faltando o a no barrmento perfeito cara muito bom!!! simpes e direto! e o codigo ficou bem pequeno gostei de mais!
muito obrigado, me ajudou bastante, se me permite uma sugestão… vc popodiam criar uma plataforma onde quem quiser sei la fazer uma doação ou uma aula particular, eu tenho interesse!
Pode me enviar o arquivo do fritzing?