Construindo um termômetro digital

Agora que você entende um pouco mais sobre seu Stamp e o LCD, podemos adicionar outro componente e criar um termômetro digital. Para criar um termômetro, usaremos um chip chamado DS1620. Este chip contém:
  • um dispositivo sensor de temperatura
  • um conversor analógico-digital (A/D) para o dispositivo sensor de temperatura
  • um registro de deslocamento para ler os dados do conversor A/D
  • uma pequena EEPROM (memória apenas de leitura programável e apagável eletricamente) para armazenar as configurações

O DS1620 possui dois modos: em um modo, ele age como um chip de termostato próprio, e em outro modo você o acopla a um computador e o usa como um termômetro. A EEPROM  armazena lembra do modo atual bem como das temperaturas ajustadas para o termostato.

Conectar o DS1620 ao Stamp é muito fácil. O DS1620 vem como um chip de 8 pinos. Alimente o pino 8 do DS1620 com +5 volts do Stamp. Aterre o pino 4 do DS1620. Então você usa três pinos de E/S do Stamp para acionar três pinos no DS1620:

  • o pino 1 no DS1620 é o pino de dados. Você lê e grava bits de dados neste pino;
  • o pino 2 no DS1620 é o pino do relógio. Você temporiza o deslocamento de dados como entrada e saída do registrador de deslocamento com este pino;
  • o pino 3 no DS1620 é o pino de reset/seleção. Você configura o pino 3 alto para selecionar o chip e comunicar-se com ele.
Para este código do exemplo, é assumido que:
  • o pino de dados vai para o pino 2 de E/S do Stamp
  • o pino do relógio vai para o pino 1 de E/S do Stamp
  • o pino de reset/seleção vai para o pino 0 I/O do Stamp
As fiações completas tê m esta aparência:


Você pode obter um DS1620 da Jameco (peça número 146456) ou da Parallax (peça número 27917) num "kit de aplicação" que inclui o chip, o capacitor, boa documentação e códigos de exemplo. Ou você pode comprar somete o chip da Jameco (peça número 114382). Eu sugiro comprar um kit de aplicação na primeira vez que você usar o DS 1620 porque a documentação é muito útil.

Você pode montar o DS1620 na área de prototipagem da placa portadora do Stamp ou numa placa de montagem separada. Uma vez que você o tenha montado, conecte seu visor LCD no pino 3 de E/S do Stamp, e então carregue e execute o seguinte programa:

symbol RST = 0
 ' linha seleciona/reseta em 1620     
symbol CLK = 1
 ' linha de clock para registradores de deslocamento no 1620     
symbol DQ = 2
  ' linha de dados no 1620     
symbol DQ_PIN = pin2
 ' representação do pino para DQ     
symbol LCD = 3
  ' liha de dados para o LCD        
inicio:     
low RST
  ' deseleciona o 1620 a menos que esteja conversando com ele    
high CLK
  ' pino de clock do 1620 por "default" em nível alto
pause 1000
  ' esperar a inicialização do termômetro e do LCD        
setup:     
high RST
  ' seleciona o 1620   
b0 = $0C
  ' $0c é o byte de comando do 1620
  '   dizendo "Write Config"     
gosub shift_out
  ' envia-o ao 1620   
b0 = %10
  ' %10 é o byte de comando do 1620
  '   para configurar o modo do termômetro    
gosub shift_out
  ' envia-o ao 1620   
low RST
  ' deseleciona o 1620   
pause 50
  ' atraso de 50ms para a EEPROM  
start_convert:   
b0 = $EE
  ' $EE é o byte de comando do 1620
  '   para iniciar conversões  
high RST
  ' selecionar o 1620  

gosub shift_out
  ' envia-o ao 1620     
low RST
  ' desseleciona o 1620
  ' Este é o loop principal
  ' - lê e mostra a temperatura a cada segundo     
loop_principal:       
  high RST
   ' selecionar o 1620       
  b0 = $AA
   ' $AA é o byte de comando do1620
   '   para ler a temperatura       
  gosub shift_out
   ' enviá-lo ao 1620       
  gosub shift_in
   ' lê a temperatura
   '   a pertir do 1620       
  low RST
   ' deselecionar o DS1620.       
  gosub display
   ' mostra a temperatura em graus C       
  pause 1000
   ' aguarda um segundo    
goto loop_principal  
 ' A subrotina shift_out envia o que estiver no
 ' byte b0 para o 1620   
shift_out:     
output DQ
 ' configura o pino DQ para
 '   modo de saída     
for b2 = 1 to 8       
  low CLK
  ' preparar para carregar o bit
  '   no 1620       
  DQ_PIN = bit0
  ' envia o bit de dados      
  high CLK
  ' carrega o bit de dados no 1620       
  b0 = b0/2
  ' desloca todos os bits para a direita
  '   na direção ao bit 0     
next     
return   
' A subrotina shift_in obtêm a     
' temperatura em 9 bits do 1620     
shift_in:     
input DQ
   ' configura o pino DQ para
   '   modo de entrada     
w0 = 0
   ' limpa w0     
for b5 = 1 to 9       
  w0 = w0/2
   ' desloca a entrada para a direita.       
  low CLK
   ' pede ao 1620 o próximo bit       
  bit8 = DQ_PIN
 ' lê o bit       
  high CLK
 ' alterna o pino do clock     
next     
return
    ' Mostra a temperatura em graus C     
mostra:     
if bit8 = 0 then pos
    ' if bit8=1
    '   então a temperatura é negativa       
  b0 = b0 and/ b0
    ' inverter b0 com o uso de NAND
    '   a operação NAND com ele mesmo     
  b0 = b0 + 1     
pos:     
serout LCD, n2400, (254, 1)
    ' limpar o LCD     
serout LCD, n2400, ("Temp = ")
    ' mostrar "Temp="                  
    '   no visor  
bit9 = bit0
    ' gravar o meio grau   
b0 = b0 / 2
    ' converter para graus     
if bit8 = 1 then neg
    ' ver se a temperatura é negativa       
  serout LCD, n2400, (#b0)
    ' mostra temperatura positiva     
  goto meio     
neg:       
  serout LCD, n2400, ("-", #b0)
    ' mostra temperatura negativa     
meio:       
  if bit9 = 0 then zero         
     serout LCD, n2400, (".5 C")
     ' mostra o meio grau        
     goto pronto     
zero:        
     serout LCD, n2400, (".0 C")
     ' mostra o meio grau   
Pronto:     
return  

Se você executar este programa, você verá que ele mostra a temperatura em graus Celsius com uma precisão de meio grau.

O DS1620 mede a temperatura em metades de graus Celsius. Ele retorna a temperatura em num número de 9 bits em complemento de 2s  numa faixa de -55 a 125ºC. Se você dividir o número que receber por dois obtém a temperatura real. Números binários em complemento de 2s são uma maneira conveniente de representar valores negativos. A lista a seguir mostra os valores para um número de 4 bits em complemento de 2s:

    0111 : 7     
    0110 : 6     
    0101 : 5     
    0100 : 4     
    0011 : 3     
    0010 : 2     
    0001 : 1     
    0000 : 0     
    1111 : -1     
    1110 : -2     
    1101 : -3     
    1100 : -4     
    1011 : -5     
    1010 : -6     
    1001 : -7     
    1000 : -8
Você pode ver que ao invés de 4 bits representando valores de 0 a 15, em num numero de 4 bits em complemento de 2s, ele representa os valores -8 a 7. Você pode olhar para o bit mais à esquerda para determinar se o número é negativo ou positivo. Se o número for negativo, você inverte os bits e adiciona 1 para ter a representação positiva do número.

Aqui está o que acontece com o programa do termômetro digital mostrado:

  1. ele usa a palavra-chave symbol para configurar várias constantes que tornam o programa um pouco mais fácil de ler (e também facilitam mover o chip para diferentes pinos de E/S no Stamp):
  2. ele configura os pinos CLK e RST no DS1620 para seus valores esperados;
  3. ele escreve um byte de comando na EEPROM do DS1620 para mandar o chip operar em "modo termômetro". Como o modo está armazenado na EEPROM, você só precisa fazer isso uma vez, então poderia tecnicamente retirar esta seção do código do programa após executar o programa uma vez (para poupar espaço de programa);
  4. o programa envia o comando $EE ("$" significa "número hexadecimal" - $EE é 238 em decimal) para dizer ao termômetro para iniciar seu processo de conversão.

O programa então entra em um loop. A cada segundo, ele envia um comando ao DS1620 dizendo ao DS1620 para retornar a temperatura atual e então lê o valor de 9 bits que o DS1620 retorna à variável w0. O Stamp envia e recebe dados de 1 bit por vez alternando a linha CLK no DS1620. Lembre-se que a variável w0 (16-bit) sobrepõe as variáveis b0/b1 (8 bits), que sobrepõe as variáveis bit0/bit1/.../bit15 (1 bit). Então quando você insere um bit do DS1620 num bit 8 e divide w0 por 2, o que você está fazendo é transferindo cada bit para o local correto da temperatura de 9 bits do DS1620 no w0. Uma vez que a temperatura tenha sido salva em w0, a subrotina mostrada determina se o número é positivo ou negativo e o mostra adequadamente no LCD como temperatura em graus Celsius. A conversão de graus C em F é:

    dF = dC * 9/5 + 32

Neste ponto, tivemos sucesso em criar um termômetro extremamente caro. O que você pode fazer com isso? Aqui vai uma idéia. Digamos que você trabalhe em uma indústria farmacêutica e está transportando medicamentos pelo país e que devem permanecer numa certa temperatura todo o caminho ou os medicamentos se deteriorarão. O que você pode fazer com o Stamp é criar um termômetro de registro de dados. Tanto a Jameco (peça número 143811) quanto a Parallax (part number 27960) vendem um equipamento chamado "módulo RAM Pack". Ele contém um chip RAM de 8 kilobytes (ou 32 kilobytes opcionalmente) de baixa potência com uma interface serial. Você pode adicionar este componente (ou algo similar) ao seu Stamp e escrever códigos que gravam leituras de temperatura na RAM a cada minuto. Você pode então colocar seu Stamp no transporte de medicamentos e ao final da viagem recuperar o Stamp. O módulo RAM conteria o histórico de temperatura de toda a viagem e você saberia se os medicamentos foram danificados.

Há muitos tipos de equipamentos interessantes e úteis que você pode construir com seu Stamp agora que você sabe como funcionam os microcontroladores.

Para mais informações sobre microcontroladores ou tópicos relacionados, visite os links da próxima página.