Advertisement
RuiViana

Clock_7_Seg_OC

Dec 6th, 2017
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.16 KB | None | 0 0
  1. //Programa : Relogio com Arduino, DS1307 e Display 7 Seg  Autor : FILIPEFLO
  2. //  https://www.filipeflop.com/blog/como-construir-um-relogio-com-arduino/
  3. #define botaoA A0                               // Botao ligado entre A0 e Gnd abre ajuste de horario
  4. #define botaoS A1                               // Botao ligado entre A1 e Gnd ajusta segundos
  5. #define botaoM A2                               // Botao ligado entre A2 e Gnd ajusta minutos
  6. #define botaoH A3                               // Botao ligado entre A3 e Gnd ajusta horas
  7. #include "Wire.h"
  8. #include "SevSeg.h"
  9. #define DS1307_ADDRESS 0x68
  10.  
  11. SevSeg display7seg;                             // Create an instance of the object.
  12. byte zero = 0x00;
  13. int flag = 0;                                   // Controle para entrar em rotina de ajuste
  14. int flagh = 0;                                  // Controle para alternar modo de display
  15. unsigned long timer1 = 0;                       // Velocidade do ajuste
  16. unsigned long timer2 = 0;                       // Tempo de saida da rotina de ajuste
  17. unsigned long timer3 = 0;                       // Controle de alternancia do ponto decimal
  18. int segundos = 0;                               // Variavel para guardar segundos
  19. int old_segundos = 0;                           // Controle de alternacia do display
  20. int minutos = 0;                                // Variavel para guardar minutos
  21. int horas = 0;                                  // Variavel para guardar horas
  22. char tempString[10];                            // Used for sprintf
  23. //-----------------------------
  24. void setup()
  25. {
  26.   pinMode (botaoA, INPUT_PULLUP);               // Port Analogico como digital e pullup
  27.   pinMode (botaoS, INPUT_PULLUP);               // Port Analogico como digital e pullup
  28.   pinMode (botaoM, INPUT_PULLUP);               // Port Analogico como digital e pullup
  29.   pinMode (botaoH, INPUT_PULLUP);               // Port Analogico como digital e pullup
  30.   Wire.begin();
  31.   //  int displayType = COMMON_ANODE;           // Selecao tipo de display anodo comum
  32.   int displayType = COMMON_CATHODE;             // Selecao tipo de display anodo comum
  33.   //                                            // Definicao dos pinos dos digitos
  34.   int digit1 = 10;                              // Pino Digito1 do display
  35.   int digit2 = 11;                              // Pino Digito2 do display
  36.   int digit3 = 12;                              // Pino Digito3 do display
  37.   int digit4 = 13;                              // Pino Digito4 do display
  38.   //                                            // Pinos ligados aos segmentos A - H
  39.   int segA = 2;                                 // Pino segmento A
  40.   int segB = 3;                                 // Pino segmento B
  41.   int segC = 4;                                 // Pino segmento C
  42.   int segD = 5;                                 // Pino segmento D
  43.   int segE = 6;                                 // Pino segmento E
  44.   int segF = 7;                                 // Pino segmento F
  45.   int segG = 8;                                 // Pino segmento G
  46.   int segDP = 9;                                // Pino segmento H
  47.   int numberOfDigits = 4;                       // Define o numero de digitos do display
  48.   //                                            // Inicializa o display
  49.   display7seg.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
  50.  
  51.   display7seg.SetBrightness(50);                // Nivel de brilho do display
  52.   timer3 = millis();                            // Atualiza controle do display com millis atual
  53. }
  54. //-----------------------------
  55. void loop()
  56. {
  57.   Wire.beginTransmission(DS1307_ADDRESS);
  58.   Wire.write(zero);
  59.   Wire.endTransmission();
  60.   Wire.requestFrom(DS1307_ADDRESS, 7);
  61.   segundos = ConverteparaDecimal(Wire.read());
  62.   minutos = ConverteparaDecimal(Wire.read());
  63.   horas = ConverteparaDecimal(Wire.read() & 0b111111);
  64.  
  65.   if (digitalRead(botaoH) == LOW)                 // Se acerta horas foi pressionado
  66.   {
  67.     delay(10);                                    // Aguadar 10 miliseg (debouncing)
  68.     if (digitalRead(botaoH) == LOW)               // Se acerta horas continua pressionado
  69.     {
  70.       flagh = 0;                                  // Seleciona opcao de display H/M e PD piscando
  71.     }
  72.   }
  73.   if (digitalRead(botaoM) == LOW)                 // Se acerta minutos foi pressionado
  74.   {
  75.     delay(10);                                    // Aguadar 10 miliseg (debouncing)
  76.     if (digitalRead(botaoM) == LOW)               // Se acerta minutos continua pressionado
  77.     {
  78.       flagh = 1;                                  // Seleciona opcao de display H/M e b/S
  79.     }
  80.   }
  81.   if (flagh == 1)                                       // Se selecionou display H/M e b/S                            
  82.   {
  83.     if (old_segundos == segundos)                       // Se nao passou o valor de segundos
  84.     {
  85.       if (millis() - timer3 < 500)                      // Se tempo < 500
  86.       {
  87.         sprintf(tempString, "%02d%02d", horas, minutos);
  88.       }
  89.       if (millis() - timer3 > 500)                      // Se tempo > 500
  90.       {
  91.         sprintf(tempString, "%02c%02d", "", segundos);
  92.       }
  93.       display7seg.DisplayString(tempString, 2);         // Ponto decimal acesso
  94.     }
  95.     else                                                // Se passou segundos
  96.     {
  97.       timer3 = millis();                                // Atualize controle
  98.       old_segundos = segundos;                          // Atualize old-segundos
  99.     }
  100.   }
  101.   if (flagh == 0)                                       // Se selecionou display H/M e PD piscando
  102.   {
  103.     sprintf(tempString, "%02d%02d", horas, minutos);
  104.     if (millis() - timer3 < 500)                        // Se tempo < 500
  105.     {
  106.       display7seg.DisplayString(tempString, 3);         // Ponto decimal acesso
  107.     }
  108.     if (millis() - timer3 > 500)                        // Se tempo > 500
  109.     {
  110.       display7seg.DisplayString(tempString, 0);         // Ponto decimal apagado
  111.       if (millis() - timer3 > 1000)                     // Se tempo > 1000
  112.       {
  113.         timer3 = millis();                              // Atualize tempo
  114.       }
  115.     }
  116.   }
  117.     if (digitalRead(botaoA) == LOW)                     // Se botao de acerto foi pressionado
  118.     {
  119.       delay(10);                                        // Aguadar 10 miliseg (debouncing)
  120.       if (digitalRead(botaoA) == LOW)                   // Se botao de acerto continua pressionado
  121.       {
  122.         flag = 1;                                       // Informa que está em rotina de acerto
  123.         delay(300);                                     // Tempo para ver que entrou em acerto
  124.         acerto();                                       // Chama rotina de acerto
  125.       }                                                 // Em acerto o ponto decimal não pisca
  126.     }
  127.   }
  128.   //-----------------------------
  129.   void SelecionaDataeHora()                             // Seta a data e a hora do DS1307
  130.   {
  131.     Wire.beginTransmission(DS1307_ADDRESS);
  132.     Wire.write(zero);                                   // Stop no CI para que o mesmo possa receber os dados
  133.  
  134.     //As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima
  135.     Wire.write(ConverteParaBCD(segundos));
  136.     Wire.write(ConverteParaBCD(minutos));
  137.     Wire.write(ConverteParaBCD(horas));
  138.     Wire.write(zero);
  139.     Wire.endTransmission();
  140.   }
  141.   //-----------------------------
  142.   byte ConverteParaBCD(byte val)                        // Converte o n�mero de decimal para BCD
  143.   {
  144.     return ( (val / 10 * 16) + (val % 10) );
  145.   }
  146.   //-----------------------------
  147.   byte ConverteparaDecimal(byte val)                    // Converte de BCD para decimal
  148.   {
  149.     return ( (val / 16 * 10) + (val % 16) );
  150.   }
  151.   //-----------------------------
  152.   void acerto()                                         // Rotina de acerto
  153.   {
  154.     while (flag)                                        // Faça enquanto flag for 1
  155.     {
  156.       if (digitalRead(botaoS) == LOW)                   // Se acerta segundos foi pressionado
  157.       {
  158.         delay(10);                                      // Aguadar 10 miliseg (debouncing)
  159.         if (digitalRead(botaoS) == LOW)                 // Se acerta segundos continua pressionado
  160.         {
  161.           if (millis() - timer1 > 300)                  // Velocidade de incremento
  162.           {
  163.             segundos++;                                 // Incrementa segundos
  164.             timer1 = millis();                          // Tempo de incremento
  165.           }
  166.           if (segundos > 59) segundos = 0;              // Se passou de 59, zera
  167.           sprintf(tempString, "%02d%02d", horas, minutos);
  168.           display7seg.DisplayString(tempString, 3);
  169.         }
  170.       }
  171.       if (digitalRead(botaoM) == LOW)                   // Se acerta minutos foi pressionado
  172.       {
  173.         delay(10);                                      // Aguadar 10 miliseg (debouncing)
  174.         if (digitalRead(botaoM) == LOW)                 // Se acerta minutos continua pressionado
  175.         {
  176.           if (millis() - timer1 > 300)                  // Velocidade de incremento
  177.           {
  178.             minutos++;                                  // Incrementa minutos
  179.             timer1 = millis();                          // Tempo de incremento
  180.           }
  181.           if (minutos > 59) minutos = 0;                // Se passou de 59, zera
  182.           sprintf(tempString, "%02d%02d", horas, minutos);
  183.           display7seg.DisplayString(tempString, 3);
  184.         }
  185.       }
  186.       if (digitalRead(botaoH) == LOW)                   // Se acerta horas foi pressionado
  187.       {
  188.         delay(10);                                      // Aguadar 10 miliseg (debouncing)
  189.         if (digitalRead(botaoH) == LOW)                 // Se acerta horas continua pressionado
  190.         {
  191.           if (millis() - timer1 > 300)                  // Velocidade de incremento
  192.           {
  193.             horas++;                                    // Incrementa horas
  194.             timer1 = millis();                          // Tempo de incremento
  195.           }
  196.           if (horas > 23) horas = 0;                    // Se passou de 23, zera
  197.           sprintf(tempString, "%02d%02d", horas, minutos);
  198.           display7seg.DisplayString(tempString, 3);
  199.         }
  200.       }
  201.       timer2 = millis();                               // Tempo de saida da rotina de acerto
  202.       while (digitalRead(botaoA) == LOW)               // Se botao de acerto foi pressionado
  203.       {
  204.         if (millis() - timer2 > 2000)                   // Aguarda 2 segundos
  205.         {
  206.           if (digitalRead(botaoA) == LOW)               // Se botao de acerto continua pressionado
  207.           {
  208.             SelecionaDataeHora();                       // Salva valores na RTC
  209.             while (digitalRead(botaoA) == LOW) {}       // Aguarda soltar o botao de ajuste
  210.             flag = 0;                                   // Sai da rotina de acerto
  211.           }
  212.         }
  213.         sprintf(tempString, "%02d%02d", horas, minutos);
  214.         display7seg.DisplayString(tempString, 3);
  215.       }
  216.       sprintf(tempString, "%02d%02d", horas, minutos);
  217.       display7seg.DisplayString(tempString, 3);
  218.     }
  219.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement