Pular para o conteúdo principal

6) Contador de Milênios v2 (relógio digital)


Desde a versão 1 do Contador de Milênios, existiram duas outras versões não construídas (v1.2 e v1.3), que contribuíram com melhorias na configuração de hora e na estrutura do circuito, deixando a versão 2 infinitamente melhor que a primeira. Além dessas melhorias, a maior delas sem dúvida é o uso do ci ds1307, que é um chip dedicado apenas a contagem de tempo com consumo muito baixo de corrente (RTC = Real Time Clock), mantendo assim a hora ajustada mesmo quando a alimentação do PIC é rompida (através do uso de uma bateria de 3V na placa).
A comunicação do 1307 com o PIC é feita através do uso de comunicação I2C. Como não entendo muito sobre a programação com esse recurso, copiei o código desse site https://microcontroladores-c.blogspot.com/2010/11/usando-rtc-ds1307.html?m=0 com algumas adaptações na função main, responsáveis por transformar a leitura da hora do 1307 para os displays e verificar se o botão de ajuste de hora é pressionado:

void main() 
{
int config=0;
unsigned int a,b,c,d; //just variables
unsigned int seg[]={0b00111111, //Hex value to display the number 0
                    0b00000110, //Hex value to display the number 1
                    0b01011011, //Hex value to display the number 2
                    0b01001111, //Hex value to display the number 3
                    0b01100110, //Hex value to display the number 4
                    0b01101101, //Hex value to display the number 5
                    0b01111101, //Hex value to display the number 6
                    0b00000111, //Hex value to display the number 7
                    0b01111111, //Hex value to display the number 8
                    0b01101111  //Hex value to display the number 9
                   }; //End of Array for displaying numbers from 0 to 9
                   
set_tris_b(ALL_OUT);
set_tris_d(ALL_OUT);
set_tris_a(ALL_IN);
output_b(0b00000000);
output_d(0b00000000);

DS1307_ler_datas();

while(1)
{
while(config == 0)
{
DS1307_ler_datas();

a = segundos%10; //6th digit is saved here
b = segundos/10;
c = b%10; //5rd digit is saved here
d = b/10;
output_d(seg[a]);output_high(s1);
delay_ms(1);output_low(s1);
output_d(seg[c]);output_high(s2);
delay_ms(1);output_low(s2);

a = minutos%10; //4nd digit is saved here
b = minutos/10;
c = b%10; //3st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s3);
delay_ms(1);output_low(s3);
output_d(seg[c]);output_high(s4);
delay_ms(1);output_low(s4);

a = horas%10; //2st digit is saved here
b = horas/10;
c = b%10; //1st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s5);
delay_ms(1);output_low(s5);
output_d(seg[c]);output_high(s6);
delay_ms(1);output_low(s6);

if(input(ADJ_SALVAR) == 1) // AJUSTAR HORA
{
delay_ms(100);
config = 1;
}
}

a = segundos%10; //6th digit is saved here
b = segundos/10;
c = b%10; //5rd digit is saved here
d = b/10;
output_d(seg[a]);output_high(s1);
delay_ms(5);output_low(s1);
output_d(seg[c]);output_high(s2);
delay_ms(5);output_low(s2);

a = minutos%10; //4nd digit is saved here
b = minutos/10;
c = b%10; //3st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s3);
delay_ms(5);output_low(s3);
output_d(seg[c]);output_high(s4);
delay_ms(5);output_low(s4);

a = horas%10; //2st digit is saved here
b = horas/10;
c = b%10; //1st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s5);
delay_ms(5);output_low(s5);
output_d(seg[c]);output_high(s6);
delay_ms(5);output_low(s6);

if(input(ADJ_SEGUNDOS) == 1) // MINUTOS AJUSTE
{
if(segundos > 58)
{
segundos = 0;
delay_ms(100);
}
else
{
segundos = segundos + 1;
delay_ms(100);
}
}

if(input(ADJ_MINUTOS) == 1) // MINUTOS AJUSTE
{
if(minutos > 58)
{
minutos = 0;
delay_ms(100);
}
else
{
minutos = minutos + 1;
delay_ms(100);
}
}

if(input(ADJ_HORAS) == 1) // HORAS AJUSTE
{
if(horas > 22)
{
horas = 0;
delay_ms(100);
}
else
{
horas = horas + 1;
delay_ms(100);
}
}

if(input(ADJ_SALVAR) == 1) // SALVAR
{
DS1307_programar_tempo();
delay_ms(100);
config = 0;
}
}

}



Positivos:
- Contagem de hora independente da alimentação
- Consumo baixo de energia

Negativos:
- Conector USB esquerdo com mal contato
- Ás vezes a placa o PIC não recebe energia ao conectar

Comentários

Postagens mais visitadas deste blog

Tutorial: PCB pelo método fotográfico

Existem diferentes formas de se fazer uma placa de circuito. O método normalmente utilizado pelos iniciantes é desenhando o circuito a mão na placa através de uma caneta permanente. Apesar desse método ser extremamente consistente, isto é, dificilmente as trilhas apresentarão falhas, ele não permite circuitos complexos e bem acabados. Para uma maior complexidade, é necessário montar o  circuito em algum software e imprimi-lo. O desafio, no entanto, é passar do circuito impresso para a placa, formando assim os famosos PCB's (Printed Circuit Board). Optei por investir no método fotográfico, que depois de alguns meses e muitas tentativas, finalmente valeu a pena. Com ele dá para fazer placas dupla face e com mascara de solda, como demonstrarei a seguir: Materiais fundamentais para esse método: Tinta fotossensível; Fotolito ou papel vegetal; Luz negra; Revelador (barrilha/carbonato de sódio); Removedor (soda cáustica). Outros materiais importantes: Secador de cab...

Tutorial: Medição de qualquer grandeza com o ICL7107

O ICL7107 é um ci conversor analógico-digital de três dígitos e meio. O que isso significa é que apesar de usar quatro displays, sua escala absoluta de leitura vai de -1999 até 1999. Ele consegue converter sinais analógios de baixa intensidade (escala de mV) nesses três dígitos e meio, o que permite a leitura de qualquer grandeza que faça variar de forma linear tensão, seja através de um sensor ou não. Para medição de grandezas diretamente delas (sem intermédio de sensores), como tensão, corrente, resistência, etc, temos a seguinte configuração de circuito: Temos duas variáveis de ajuste, uma dada pelo divisor de tensão na entrada e outra dada pela tensão no terminal 36. Essas variáveis nos permite manipular a escala de leitura. Vamos considerar a escala inicial de leitura como sem nenhuma divisão de tensão na entrada e 100mV no terminal 36. Nesse caso, podemos ler de -199,9mV até 199,9mV, traduzidos nos displays como -1999 até 1999. Observe que tudo que precisa...

3) Módulo V (voltímetro digital)

Pesquisando sobre voltímetros, encontrei circuitos que utilizam do ci ICL7107, que é um conversor analógico-digital. Outros circuitos utilizam de PIC's, mas não haviam muitas outras opções (pelo menos eu não encontrei). Decidi montar um voltímetro com o 7107 para utilizar junto da minha fonte, como um módulo (daí o nome). Após finalizado, posso dizer que a aplicação foi um sucesso!! (nunca duvidei) Módulo V em paralelo com o circuito da protoboard, medindo 5,1V Fiz um post detalhando o que aprendi sobre o 7107  https://tictorslab.blogspot.com/2018/12/tutorial-medicao-de-qualquer-grandeza.html . Segui majoritariamente o circuito abaixo, com algumas alterações: Modifiquei os displays MAN para os de 7 segmentos de anodo comum e alimentei o circuito com uma bateria de 9V junto de um regulador para 5V (é recomendável alimentá-lo a parte, sem utilizar a própria tensão que está sendo medida). O problema em fazer isso é que as baterias de 9V não duram muito. Além d...