sábado, junho 20, 2009

Monitorando Temperatura Ambiente com DS1820 & Linux

Época de frio, faremos um termômetro digital para monitorar a variação de temperatura do ambiente.

O grande desafio aqui é interfacear um sensor de temperatura com PC servidor, sem uso de circuitos complexos ou microcontroladores para conversão dos dados. Sensores de Temperaturas de uso comum disponível no mercado, como o LM35 , necessitam de filtros e conversores A/D para tratar o sinal por ele gerado, não queremos um hardware tão "complexo" assim.


Em uma pesquisa descobrimos que a Maxim-IC/Dallas Semicondutor fabrica um sensor 100% digital, o DS1820 (DS18S20 , DS18B20) que opera na faixa de -55 a +125 ºC com precisão de 0,5ºC nas faixas de 10 a 85ºC. Um grande problema é a dificuldade de encontrar esse sensor aqui no Brasil, além de seu preço ser um pouco mais salgado (+- R$20,00) se comparado com o LM35 (+-R$ 3,50).
Com muita luta, encontramos o mesmo na Sta. Efigênia em São Paulo.

Uma vez de posse de 2 sensores DS1820, o desafio de interfacear os meninos tem início. Pesquisas web nos levam aos mais diversos circuitos para interface, porém um projeto me chamou a atenção.
Monitor temperatures with Linux, Nagios, and DS1820

Com base neste desenvolvi o meu com 2 sensores. Note que este sensor utiliza barramento de dados de apenas 1 fio, 1-Wire Bus, usando transmissão estilo "Half-Simplex" ;-)
Ou seja, pelo mesmo fio, envia-se os comandos de busca, inicialização e conversão de temperatura para o sensor, e após 700ms temos o retorno do valor da temperatura pelo mesmo barramento. Num mesmo barramento podemos ter ate 255 sensores diferentes, estes são diferenciados através de seu endereço ROM únicos.

Uma característica legal do DS1820 é o modo parasita, se seu barramento de dados (DQ) fornecer corrente suficiente para o sensor, o mesmo NÃO precisa ser ligado em fonte externa, logo podemos excluir o pino Vcc do sensor, isso mesmo, utilizaremos apenas 2 pinos, o Data e o GND.

Material Necessário para confecção:

1 Conector DB9 + Capinha
1 Placa fenolite, grande o suficiente para montar o circuito e pequena o suficiente para ser acoplada dentro do conector DB9
1 Diodo Zener 3V9 - 1/4W (como alternativa pode usar 3V6 )
1 Diodo Zener 6V2 - 1/4W
2 Diodos 1N5819 - 1/4W (Diodos de alta velocidade)
1 Resistor 1K5 - 1/4W
1 metro cabo manga - 2 vias

o diagrama de ligações do circuito pode ser visto abaixo:

Note que não temos a conexão do pino Vcc do DS1820, este pino deve ser isolado e não utilizado.

Após a montagem temos algo parecido com



Na outra extremidade do cabo (não ligado ao circuito) faremos uma derivação paralela, logo teremos 2 terminais DQ e 2 terminais GND para os 2 sensores, observe que os 2 sensores permanecem ligados a um único ponto do circuito.

Acoplamos os sensores nessas extremidades e pronto. Temos o conversor 1-Wire -> RS232 pronto para o uso. O Trabalho final pode ser visto abaixo.


Uma vez que nossos sensores estejam devidamente montados, seguiremos agora para o software responsável pela comunicação PC -> DS1820 via Serial.

Utilizaremos o Digitemp, disponível para Linux & Windows. Maiores detalhes pode ser encontrado no site do projeto.

Abaixo a configuração passoa-a-passo utilizando Ubuntu 9.04

No terminal (alt+F2 -> xterm)

Instalação pacote digitemp
# sudo apt-get install digitemp

Após a instalação, o primeiro passo é descobrir os sensores que estão conectados através do comando
# digitemp_DS9097 -i -s /dev/ttyS0

onde ttySO (COM-1) é a porta serial onde está conectado nossos sensores.

Você deverá obter uma resposta como abaixo:DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane

GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
10A427530108005F : DS1820/DS18S20/DS1920 Temperature Sensor
10BF4A5301080001 : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 10A427530108005F
ROM #1 : 10BF4A5301080001


Note que o endereço da ROM é unico para cada sensor, isso torna possível diferenciar os vários sensores conectados aos mesmo barramento.
Uma vez que nossos sensores respondem corretamente, configuramos o digitemp para que não seja mais necessário ficar "descobrindo" os sensores antes de cada consulta de temperatura, para isto no terminal
# digitemp_DS9097 -i -c /etc/digitemp.conf -s /dev/ttyS0

Como resultado, temos
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
10A427530108005F : DS1820/DS18S20/DS1920 Temperature Sensor
10BF4A5301080001 : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 10A427530108005F
ROM #1 : 10BF4A5301080001
Wrote /etc/digitemp.conf


Mostrando que o arquivo de configuração foi devidamente criado. A opção -c /etc/digitemp.conf cria um arquivo de configuração com as informações necessárias de cada sensor.

O passo final é fazer a consulta de temperatura, para isto basta executar o comando:
# digitemp_DS9097 -c /etc/digitemp.conf -a

O resultado obtido é a temperatura fornecida por cada um dos sensores. A opção -a indica que consultaremos todos os sensores.
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Jun 20 10:54:53 Sensor 0 C: 18.31 F: 64.96
Jun 20 10:54:55 Sensor 1 C: 18.44 F: 65.19


Para obtermos as temperaturas individualmente de cada sensor, basta executar
# digitemp_DS9097 -c /etc/digitemp.conf -t 0
onde o parâmetro -t indica o número do sensor. Neste exemplo para o sensor 0 temos a saida
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Jun 20 10:57:28 Sensor 0 C: 18.31 F: 64.96


Já para o sensor 1
# digitemp_DS9097 -c /etc/digitemp.conf -t 1
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Jun 20 10:57:31 Sensor 1 C: 18.44 F: 65.19


Note que temos as temperaturas em escalar ºC e F, parâmetros extras permitem obter apenas um tipo de escala, conforme abaixo:
# digitemp_DS9097 -c /etc/digitemp.conf -o "%C" -t 0

temos como resultado apenas a temperatura em ºC
# 18.312500

Viajando um pouco no shell, deixei uma madrugada inteira o PC capturando as temperaturas de 10 em 10 minutos, de tal forma a obter as variações de temperatura durante a madrugada.
# while [ 1 ] ; do digitemp_DS9097 -c /etc/digitemp.conf -o "%C" -t 0 | egrep '^[0-9]' >> /tmp/temp.txt && sleep 600; done


Com ajudinha do OpenOffice (pode-se usar o RRDTool também) temos o gráfico de variação da temperatura


É isso, solução fácil, rápido e de "baixo custo" para monitoramento de temperatura de Ambientes, Data-Center, ou até mesmo Aplicação Laboratoriais de medições.

6 comentários:

Fábio Navarro disse...

Boa... interessante. Sempre quis ter um esquema assim... hehehehe
Quem sabe agora...

¡HardŃeck disse...

Muito bom esse circuito vou monta lo.
Quando o fizer posto um comentário.

Anônimo disse...

Como faço para gerar os gráficos através do rrdtool???

Marsolla disse...

No proprio site tem o manual ensinando, o RRDTool nao é o escopo deste post, ficando a cada um descobrir como tratar os resultados gerados.
http://oss.oetiker.ch/rrdtool/

João Neves disse...

Faz tempo que vc postou, mas poderia me indicar qual loja da Santa Efigência você encontrou esse sensor

Obrigado

Marsolla disse...

Opa, Multi Comercial, R. Timbiras