terça-feira, julho 09, 2013

Sensor de Temperatura DS18B20

Vimos recentemente aqui o sensor de temperatura LM35.  Vamos ver agora um outro sensor, o DS18B20 (datasheet em pdf), que é um bem mais sofisticado.


O DS18B20 também é um sensor de alta precisão, fornecendo erro máximo de meio grau centígrado na faixa -10 a +85°C  (a faixa completa de operação é de -55°C a +125°C).A primeira grande diferença em relação ao LM35 é que ele contém internamente um conversor A/D, fornecendo o resultado já digitalizado em 9 a 12 bits.

Este resultado é disponibilizado é através de uma comunicação serial bidirecional e multiponto, que requer apenas uma conexão para dados (mais o terra) - o chamado "1-wire". A alimentação do circuito pode também ser fornecida através da conexão de dados (para temperaturas de até 100°C, algumas restrições se aplicam). Em outras palavras, podemos ter vários sensores DS18B20 "pendurados" em um varal com dois fios (dados e terra):



Esta comunicação requer pequenos cuidados no lado do hardware: a porta do microcontrolador precisa operar em "três estados" (nível alto, nível baixo e alta impedância - o que corresponde a poder ser alternado entre saída e entrada durante a comunicação), o resistor de pull-up e o mosfet (se a alimentação for feita através da linha de dados).

Do lado do software as coisas são bem mais complicadas. De um modo simplificado:
  • Mantendo a linha de dados baixa por um tempo "longo", o microcontrolador forçado um reset nos dispositivos conectados. Em seguida estes dispositivos geram um pulso para indicar a sua presença.
  • As comunicações são feitas, é claro, de modo serial, com cada bit ocupando um "slot" de tempo.O microcontrolador inicia as comunicações mantendo a linha de dados baixa por um certo tempo. Para enviar um "0" a linha deve ser mantida baixa durante todo o slot, para enviar um "1" a linha deve ser solta (para voltar a um) após um certo tempo. Quando o microcontrolador está aguardando uma resposta, ele mantém a linha baixa por um tempo curto e depois solta a linha para ela ser controlada pelo dispositivo.
  • Cada dispositivo tem um endereço de 64 bits. A descoberta dos endereços dos dispositivos conectados é feita bit a bit. O protocolo permite descobrir quando existem dispositivos com um determinado bit diferente no endereço e fazer um filtro. Ilustrando com endereços de apenas 3 bits, com os dispositivos 001, 010 e 011 conectados. Descobrimos primeiro que todos os dispositivos tem o primeiro bit igual a 0. Em seguida descobrimos que alguns dispositivos tem o segundo bit em 0 e outros em 1. Fazemos um filtro em 0 neste bit e descobrimos que para o último bit só temos dispositivos com bit 1 e assim obtemos o primeiro endereço (001). Repetimos o procedimento, porem filtramos o segundo bit em 1 e obtemos os outros dois endereços (010 e 011).
  • Uma vez descobertos os endereços, podemos usar um comando para "endereçar" um dispositivo e aí usar outros comandos para, por exemplo, fazer uma leitura de temperatura.
Felizmente, já existem bibliotecas prontas para vários microcontroladores, particularmente para o Arduino.

O DS18B20 tem outras capacidades além de simplesmente ler a temperatura. Ele possui 8 registradores internos, três dos quais (limites de temperatura e configuração) são não voláteis (isto é, o valor é mantido mesmo sem alimentação).

Em posts futuros veremos mais detalhes e algumas montagens práticas.

Nenhum comentário: