segunda-feira, 3 de outubro de 2016

Relógio de precisão/Termômetro/Higrômetro com o DS3231, HDC1080 e PIC16F1503

        Recentemente a Texas Instruments me forneceu duas amostras de seu novo sensor de umidade/temperatura HDC1080 com interface I²C. Há muito tempo queria montar um relógio preciso que medisse estas grandezas assim como não perdesse a hora quando falta energia elétrica.
         Este sensor usa um encapsulamento com terminais muito pequenos, assim montei uma placa adaptadora.
Sensor HDC1080 montado por baixo da placa, com a abertura expondo a parte sensora no centro do furo.

        A medição do tempo é feita pelo DS3231, um RTC de alta precisão com o cristal de quartzo incorporado no encapsulamento, com compensação de temperatura e com interface I²C. Este RTC vem num SOIC de 16 pinos dos quais somente metade é usada. Fiz um adaptador DIP para ele.
        Para controlar tudo, usei um PIC16F1503, que só consegui com encapsulamento SOIC, também tendo que fazer um adaptador DIP.

Placa do relógio, com o PIC16F1503 e o DS3231 com seus horrendos adaptadores DIP. Há também a bateria de lítio pendurada.
Vista de baixo.
        O display usado é um Winstar WO1602, de 16x2 caracteres também com interface I²C (comprado na TATO Equipamentos Eletrônicos). Este tem um backlight simples de LED e usa o controlador Sitronix ST7032. Para operar em 3,3V, este display usa um charge pump composto de dois capacitores, assim montei uma pequena placa com os mesmos mais o IC TC54 para fazer o RESET e adaptar os pequenos pinos de interface.  Preferi usar um display LCD em vez do OLED porque este tem uma vida útil muito maior, pois o OLED perde o brilho com o tempo.

Pinagem do display Winstar WO1602.
Esquema para ligar em 3V ou 5V.

Display Winstar WO1602 com a placa adaptadora e os fios para ligar o backlight. Esta placa tem os mesmo 4 pinos do display OLED para ser intercambiável.
Vista de baixo. Note os terminais do display que tem metade do espaçamento dos furos da placa.
Vista de frente.

Relógio em operação mostrando a data completa, temperatura e umidade relativa.

     Para comunicar com o display, uso duas rotinas:

Rotina de envio de comando:
Envia I²C START bit
Envia ST7032_I2C_ADDRESS=0x7C + bit de escrita pela enterface I²C=0
Envia seleção de dado/comando 0x00 (Co, RS, 0, 0, 0, 0, 0, 0)
RS=0, COMMAND
Co=0, (continuation bit)
Envia I²C STOP bit

Rotina de envio de dado:
Envia I²C START bit
Envia ST7032_I2C_ADDRESS=0x7C + bit de escrita pela enterface I²C=0
Envia seleção de dado/comando 0x40 (Co, RS, 0, 0, 0, 0, 0, 0)
RS=1, DATA
Co=0, (continuation bit)
Envia I²C STOP bit


     Para iniciar o display, envio os seguintes comandos através das rotinas mostradas acima:

RESET,  feito por hardware pelo IC TC54;

FUNCTION SET=0x38 (0, 0, 1, DL, N, DH, 0, IS)
DL 1=8bit, 0=4bit
N 1=2lines, 0=1line
DH 1=double (N must be 0), 0=normal
IS 1=extended inst., 0=normal inst.

ENTRY MODE SET=0x06 (0, 0, 0, 0, 0, 1, I/D, S)
I/D 1=cursor/blink moves to right & ddram address is incremented, 0=cursor/blink moves to left & ddram address is decremented
S 1=shift of entire display, 0=no shift

CURSOR/DISPLAY SHIFT=0x14 (0, 0, 0, 1, S/C, R/L, 0, 0)
S/C 1=screen controlled by R/L, 0=cursor controlled by R/L
R/L 1=right, 0=left

FUNCTION SET=0x39 (0, 0, 1, DL, N, DH, 0, IS)
DL 1=8bit, 0=4bit
1=2lines, 0=1line
DH 1=double (N must be 0), 0=normal
IS 1=extended inst., 0=normal inst.

INTERNAL OSC FREQUENCY=0x14 (0, 0, 0, 1, BS, F2, F1, F0)
BS 1=1/4bias, 0=1/5bias
F2 F1 F0  3V FREQ.  5V FREQ. (2 LINE MODE)
0   0   0   122Hz     120Hz
0   0   1   131Hz     133Hz
0   1   0   144Hz     149Hz
0   1   1   161Hz     167Hz
1   0   0   183Hz     192Hz
1   0   1   221Hz     227Hz
1   1   0   274Hz     277Hz
1   1   1   347Hz     347Hz

CONTRAST SET=0x71 (0, 1, 1, 1, C3, C2, C1, C0)
C3~C0 contrast low nibble

POWER/ICON CONTROL/CONTRAST SET=0x54 (0, 1, 0, 1, ION, BON, C5, C4)
ION 1=display ON, 0=display OFF
BON 1=booster ON (OPF1=0, OPF2=0), 0=booster OFF
C5~C4 contrast high nibble

FOLLOWER CONTROL=0x6F (0, 1, 1, 0, FON, RAB2, RAB1, RAB0)
FON 1=internal follower ON (OPF1=0, OPF2=0), 0=internal follower OFF
RAB2~RAB0 V0 generator amplified ratio

DISPLAY ON/OFF=0x0C (0, 0, 0, 0, 1, D, C, B)
D 1=entire dsiplay ON
C 0=cursor OFF
B 0=cursor position OFF

CLEAR DISPLAY=0x01


        Para enviar os caracteres:
Envia o comando SET DDRAM ADDRESS=0x80 + DDRAM ADDRESS
Envia dado com o caractere ASCII


Nenhum comentário:

Postar um comentário