Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Programa : Relogio com Arduino, DS1307 e Display 7 Seg Autor : FILIPEFLO
- // https://www.filipeflop.com/blog/como-construir-um-relogio-com-arduino/
- #define botaoA A0 // Botao ligado entre A0 e Gnd abre ajuste de horario
- #define botaoS A1 // Botao ligado entre A1 e Gnd ajusta segundos
- #define botaoM A2 // Botao ligado entre A2 e Gnd ajusta minutos
- #define botaoH A3 // Botao ligado entre A3 e Gnd ajusta horas
- #include "Wire.h"
- #include "SevSeg.h"
- #define DS1307_ADDRESS 0x68
- SevSeg display7seg; // Create an instance of the object.
- byte zero = 0x00;
- int flag = 0; // Controle para entrar em rotina de ajuste
- int flagh = 0; // Controle para alternar modo de display
- unsigned long timer1 = 0; // Velocidade do ajuste
- unsigned long timer2 = 0; // Tempo de saida da rotina de ajuste
- unsigned long timer3 = 0; // Controle de alternancia do ponto decimal
- int segundos = 0; // Variavel para guardar segundos
- int old_segundos = 0; // Controle de alternacia do display
- int minutos = 0; // Variavel para guardar minutos
- int horas = 0; // Variavel para guardar horas
- char tempString[10]; // Used for sprintf
- //-----------------------------
- void setup()
- {
- pinMode (botaoA, INPUT_PULLUP); // Port Analogico como digital e pullup
- pinMode (botaoS, INPUT_PULLUP); // Port Analogico como digital e pullup
- pinMode (botaoM, INPUT_PULLUP); // Port Analogico como digital e pullup
- pinMode (botaoH, INPUT_PULLUP); // Port Analogico como digital e pullup
- Wire.begin();
- // int displayType = COMMON_ANODE; // Selecao tipo de display anodo comum
- int displayType = COMMON_CATHODE; // Selecao tipo de display anodo comum
- // // Definicao dos pinos dos digitos
- int digit1 = 10; // Pino Digito1 do display
- int digit2 = 11; // Pino Digito2 do display
- int digit3 = 12; // Pino Digito3 do display
- int digit4 = 13; // Pino Digito4 do display
- // // Pinos ligados aos segmentos A - H
- int segA = 2; // Pino segmento A
- int segB = 3; // Pino segmento B
- int segC = 4; // Pino segmento C
- int segD = 5; // Pino segmento D
- int segE = 6; // Pino segmento E
- int segF = 7; // Pino segmento F
- int segG = 8; // Pino segmento G
- int segDP = 9; // Pino segmento H
- int numberOfDigits = 4; // Define o numero de digitos do display
- // // Inicializa o display
- display7seg.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
- display7seg.SetBrightness(50); // Nivel de brilho do display
- timer3 = millis(); // Atualiza controle do display com millis atual
- }
- //-----------------------------
- void loop()
- {
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_ADDRESS, 7);
- segundos = ConverteparaDecimal(Wire.read());
- minutos = ConverteparaDecimal(Wire.read());
- horas = ConverteparaDecimal(Wire.read() & 0b111111);
- if (digitalRead(botaoH) == LOW) // Se acerta horas foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoH) == LOW) // Se acerta horas continua pressionado
- {
- flagh = 0; // Seleciona opcao de display H/M e PD piscando
- }
- }
- if (digitalRead(botaoM) == LOW) // Se acerta minutos foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoM) == LOW) // Se acerta minutos continua pressionado
- {
- flagh = 1; // Seleciona opcao de display H/M e b/S
- }
- }
- if (flagh == 1) // Se selecionou display H/M e b/S
- {
- if (old_segundos == segundos) // Se nao passou o valor de segundos
- {
- if (millis() - timer3 < 500) // Se tempo < 500
- {
- sprintf(tempString, "%02d%02d", horas, minutos);
- }
- if (millis() - timer3 > 500) // Se tempo > 500
- {
- sprintf(tempString, "%02c%02d", "", segundos);
- }
- display7seg.DisplayString(tempString, 2); // Ponto decimal acesso
- }
- else // Se passou segundos
- {
- timer3 = millis(); // Atualize controle
- old_segundos = segundos; // Atualize old-segundos
- }
- }
- if (flagh == 0) // Se selecionou display H/M e PD piscando
- {
- sprintf(tempString, "%02d%02d", horas, minutos);
- if (millis() - timer3 < 500) // Se tempo < 500
- {
- display7seg.DisplayString(tempString, 3); // Ponto decimal acesso
- }
- if (millis() - timer3 > 500) // Se tempo > 500
- {
- display7seg.DisplayString(tempString, 0); // Ponto decimal apagado
- if (millis() - timer3 > 1000) // Se tempo > 1000
- {
- timer3 = millis(); // Atualize tempo
- }
- }
- }
- if (digitalRead(botaoA) == LOW) // Se botao de acerto foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoA) == LOW) // Se botao de acerto continua pressionado
- {
- flag = 1; // Informa que está em rotina de acerto
- delay(300); // Tempo para ver que entrou em acerto
- acerto(); // Chama rotina de acerto
- } // Em acerto o ponto decimal não pisca
- }
- }
- //-----------------------------
- void SelecionaDataeHora() // Seta a data e a hora do DS1307
- {
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero); // Stop no CI para que o mesmo possa receber os dados
- //As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima
- Wire.write(ConverteParaBCD(segundos));
- Wire.write(ConverteParaBCD(minutos));
- Wire.write(ConverteParaBCD(horas));
- Wire.write(zero);
- Wire.endTransmission();
- }
- //-----------------------------
- byte ConverteParaBCD(byte val) // Converte o n�mero de decimal para BCD
- {
- return ( (val / 10 * 16) + (val % 10) );
- }
- //-----------------------------
- byte ConverteparaDecimal(byte val) // Converte de BCD para decimal
- {
- return ( (val / 16 * 10) + (val % 16) );
- }
- //-----------------------------
- void acerto() // Rotina de acerto
- {
- while (flag) // Faça enquanto flag for 1
- {
- if (digitalRead(botaoS) == LOW) // Se acerta segundos foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoS) == LOW) // Se acerta segundos continua pressionado
- {
- if (millis() - timer1 > 300) // Velocidade de incremento
- {
- segundos++; // Incrementa segundos
- timer1 = millis(); // Tempo de incremento
- }
- if (segundos > 59) segundos = 0; // Se passou de 59, zera
- sprintf(tempString, "%02d%02d", horas, minutos);
- display7seg.DisplayString(tempString, 3);
- }
- }
- if (digitalRead(botaoM) == LOW) // Se acerta minutos foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoM) == LOW) // Se acerta minutos continua pressionado
- {
- if (millis() - timer1 > 300) // Velocidade de incremento
- {
- minutos++; // Incrementa minutos
- timer1 = millis(); // Tempo de incremento
- }
- if (minutos > 59) minutos = 0; // Se passou de 59, zera
- sprintf(tempString, "%02d%02d", horas, minutos);
- display7seg.DisplayString(tempString, 3);
- }
- }
- if (digitalRead(botaoH) == LOW) // Se acerta horas foi pressionado
- {
- delay(10); // Aguadar 10 miliseg (debouncing)
- if (digitalRead(botaoH) == LOW) // Se acerta horas continua pressionado
- {
- if (millis() - timer1 > 300) // Velocidade de incremento
- {
- horas++; // Incrementa horas
- timer1 = millis(); // Tempo de incremento
- }
- if (horas > 23) horas = 0; // Se passou de 23, zera
- sprintf(tempString, "%02d%02d", horas, minutos);
- display7seg.DisplayString(tempString, 3);
- }
- }
- timer2 = millis(); // Tempo de saida da rotina de acerto
- while (digitalRead(botaoA) == LOW) // Se botao de acerto foi pressionado
- {
- if (millis() - timer2 > 2000) // Aguarda 2 segundos
- {
- if (digitalRead(botaoA) == LOW) // Se botao de acerto continua pressionado
- {
- SelecionaDataeHora(); // Salva valores na RTC
- while (digitalRead(botaoA) == LOW) {} // Aguarda soltar o botao de ajuste
- flag = 0; // Sai da rotina de acerto
- }
- }
- sprintf(tempString, "%02d%02d", horas, minutos);
- display7seg.DisplayString(tempString, 3);
- }
- sprintf(tempString, "%02d%02d", horas, minutos);
- display7seg.DisplayString(tempString, 3);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement