Com poucos componentes e usando um chip de apenas 8 pinos!
Recentemente, tive acesso a um termômetro desses usados em garrafas térmicas vendidas na internet (tipo SmartCup). Resolvi estudar suas ligações, seus componentes e o modo de operação, pois achei o circuito compacto e com poucos componentes. Ainda não descobri qual microcontrolador original ele usa. Talvez um PIC SMD de 8 pinos. A precisão não era das melhores, então resolvi montar um mais preciso, usando um sensor DS18B20 ao invés de um NTC de 100k (original). Usei um PIC12f675 para rodar um novo programa. Retirei o microcontrolador original e liguei 5 fios para conectar esta placa de leds ao PIC.
A montagem teria agora um novo objetivo: medir a temperatura ambiente de uma sala com seus modestos 2 dígitos! Para funcionar ele foi ligado a uma fonte chaveada pequena, de 3 volts.
O circuito ficou conforme a figura abaixo:

UM POUCO DE TEORIA SOBRE A MULTIPLEXAÇÃO USADA NESTE CIRCUITO
O circuito usa o mesmo método do original, fazendo os leds acenderem pelo método ‘tristate multiplexing’ ou ‘charlieplex’.
São usados 15 leds brancos, 1 verde (VD) e 1 vermelho (VM) sendo ligados conforme o esquema acima. Os leds tem uma queda de tensão de 2,8 volts (sob 2 mA de corrente). É importante este valor pois com leds que tenham valores menores como 1,8 ou 2,0 volts não irá funcionar corretamente. Usei a plaquinha original com os leds e puxei apenas 5 fios para conectar com a plaquinha do PIC12F675.
A multiplexação é feita em 5 etapas:

Nesta etapa 1 podem acender apenas 4 leds dos seguimentos A1, B1, C1 e D1. Todos estes leds tem seus cátodos ligado ao pino 7 do PIC que nesta ocasião é uma saída em ‘0’. Os pinos 2 a 6 são saídas em ‘1’ para leds acesos ou entradas para leds apagados. Os valores corretos para cada número de 0 a 9 são obtidos de 4 tabelas , uma para cada etapa, e armazenados nos registradores 07dd, 06dd,05du, 03du. Estes valores são transferidos para a GPIO na etapa correspondente ao registrador.
Já os valores para determinar o sentido das portas são obtidos por uma operação de XOR entre estes registradores e um valor para cada etapa. Os resultados desta operação são armazenados nos registradores t7dd, t6dd, t5du, t3du. Estes valores são transferidos para a TRISIO na etapa correspondente ao registrador.

Nesta etapa 2 podem acender apenas 4 leds dos seguimentos F1, E1, G1 e A0. Todos estes leds tem seus cátodos ligado ao pino 6 do PIC que nesta ocasião é uma saída em ‘0’.

Nesta etapa 3 podem acender apenas 3 leds dos seguimentos F0, B0 e D0. Todos estes leds tem seus cátodos ligado ao pino 3 do PIC que nesta ocasião é uma saída em ‘0’. Importante: Ao buscar a tabela desta etapa, deve ser salvo o valor do seguimento ‘A0’ para uso na etapa 2.

Nesta etapa 4 podem acender apenas 4 leds dos seguimentos G0, E0, C0 e °C. Todos estes leds tem seus cátodos ligado ao pino 5 do PIC que nesta ocasião é uma saída em ‘0’.

Nesta última etapa ou seja, a etapa 5, podem acender apenas 2 leds : VM e o VD. Estes leds tem seus cátodos ligado ao pino 3 do PIC que nesta ocasião é uma saída em ‘0’. Esta etapa não usa tabela, mas a rotina deverá ou não setar os bits 0 e 1 do registrador O2LED para acende-los ou apaga-los.
A rotina para a multiplexação ficou desta forma:
void multiplexa(){
trisio=0xff;//desliga todos os leds
gpio=o7dd;//carrega o valor da GPIO para a etapa 1
trisio=t7dd;//carrega o valor da TRISIO para a etapa 1
delay_ms(1);//tempo que leds ficam ligados
trisio=0xff;//desliga todos os leds
gpio=o6dd;//carrega o valor da GPIO para a etapa 2
trisio=t6dd;//carrega o valor da TRISIO para a etapa 2
delay_ms(1);//tempo que leds ficam ligados
trisio=0xff;//desliga todos os leds
gpio=o5du;//carrega o valor da GPIO para a etapa 3
trisio=t5du;//carrega o valor da TRISIO para a etapa 3
delay_ms(1);//tempo que leds ficam ligados
trisio=0xff;//desliga todos os leds
gpio=o3du;//carrega o valor da GPIO para a etapa 4
trisio=t3du;//carrega o valor da TRISIO para a etapa 4
delay_ms(1);//tempo que leds ficam ligados
trisio=0xff;//desliga todos os leds
gpio=o2led;//carrega o valor da GPIO para a etapa 5
trisio=t2led;//carrega o valor da TRISIO para a etapa 5
delay_ms(1);//tempo que leds ficam ligados
}
SOBRE O SENSOR DS18B20
A escolha do sensor DS18B20 é baseada na facilidade de uso e na sua ótima precisão. Abrange escala de – 55 graus centígrados a 125 graus centígrados. No nosso caso, com uso de 2 dígitos a leitura máxima possível é 99 graus. Logicamente, a temperatura ambiente provavelmente nunca passará de 45 graus mesmo em calor extremo!
A comunicação com este sensor é feita apenas com um único fio e é chamada 1-Wire.
Na rotina, quando a temperatura ambiente for positiva então deverá acender o led vermelho. Quando a temperatura ambiente for negativa, como acontece em invernos extremos, apenas o led verde acenderá.
Obs. Esta montagem é experimental, sendo de caráter didático, montada apenas em placa experimental (do tipo “Protoboard”), sujeita a “bugs” ainda não detectados. Está sendo fornecido os arquivos para que cada hobista possa alterar o programa segundo suas necessidades.
Abaixo temos uma pasta zipada para download, com os arquivos desta montagem:
Manuais
Curiosidades:
A língua do beija-flor — Teve um Projeto?
Um elemento químico fantástico!
Outros assuntos
Como controlar as preocupações
Meu filho deve ter um smartphone?
Será que eu devo largar a escola?
Até o próximo artigo!