/******************************************************************************* * * I12: Cronômetro com display TM1637 e Arduino - pause com sensor infravermelho * (usando a interrupção por timer) * Autor: Angelo Luis Ferreira * Data: 07/07/2021 * * http://squids.com.br/arduino * *******************************************************************************/ // incluindo bibliotecas #include // Inclui a biblioteca LiquidCrystal_I2C (LCD) #include // Inclui a biblioteca TM1637Display #include // Inclui a biblioteca TimerOne // definições pinos do Arduino const byte CLK = 2; // Define pino 2 como CLK const byte DIO = 3; // Define pino 3 como DIO const byte pinButPause = 8; // Define a porta digital 8 para o push button (pausa) const byte pinButReset = 9; // Define a porta digital 12 para o push button (reset) const byte pinoFototransistor = A2; // Pino analógico conectado ao fototransistor (pause) // declarações de variáveis byte mode = 0; unsigned long cSegundos = 0; unsigned int segundos = 0; unsigned int referencia = 600; // referência para acionar o sensor IR // Cria o array position[] para armazenar os valores do cronômetro no TM1637 uint8_t position[] = { 0, 0, 0, 0 }; // // Cria o objeto "lcd" (display no endereço 0x27) LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // Cria o objeto "display" da biblioteca TM1637 TM1637Display display(CLK, DIO); void setup() { // define o timer Timer1.initialize(10000); // define contagem a cada centésimo (1/100) de segundo // ajusta displays display.setBrightness(3); // Ajusta o brilho para do do TM1637 lcd.begin (16,2); // inicia o display LCD // exibe título no display LCD lcd.setCursor(1,0); lcd.print("Cron"); lcd.write(239); lcd.print("metro"); // define pinMode dos botões pinMode(pinButPause, INPUT_PULLUP); // Habilita o pull up interno do Arduino pinMode(pinButReset, INPUT_PULLUP); // Habilita o pull up interno do Arduino } void loop() { // verifica se o botão Pause (pushbutton) está pressionado e muda o controle if (!digitalRead(pinButPause)) { mode = 1; // vai para pauseMode while (!digitalRead(pinButPause)) { } //esperera soltar o botão delay(50); } // verifica se o botão Reset (pushbutton) está pressionado e muda o controle if (!digitalRead(pinButReset)) { mode = 0; // vai para resetMode while (!digitalRead(pinButReset)) { } //esperera soltar o botão delay(50); } // verifica se o sensor infravermelho foi acionado if(analogRead(pinoFototransistor) > referencia) mode = 1; // vai para pauseMode // menu de controle switch (mode) { case 0: resetMode(); break; case 1: pauseMode(); break; case 2: runMode(); break; default: resetMode(); } } // Modo RUN - roda o cronômetro void runMode() { // conta o tempo do cronômetro Timer1.attachInterrupt(contadorTempo); // Calculo individual para posição no display position[0] = display.encodeDigit((segundos / 60) / 10); // Dezena de minuto position[1] = display.encodeDigit((segundos / 60) % 10); // Unidade de minuto position[1] = position[1] + 128; // coloca o separador ":" position[2] = display.encodeDigit((segundos % 60) / 10); // Dezena de segundo position[3] = display.encodeDigit((segundos % 60) % 10); // Unidade de segundo //Mostra os valores no display TM1637 display.setSegments(position); //Mostra os valores no display LCD lcd.setCursor(1,1); lcd.print((segundos / 60) / 10); // Dezena de minuto lcd.setCursor(2,1); lcd.print((segundos / 60) % 10); // Unidade de minuto lcd.setCursor(3,1); lcd.print(":"); lcd.setCursor(4,1); lcd.print((segundos % 60) / 10); // Dezena de segundo lcd.setCursor(5,1); lcd.print((segundos % 60) % 10); // unidade de segundo lcd.setCursor(6,1); lcd.print(","); lcd.setCursor(7,1); lcd.print((cSegundos / 10) % 10); // Décimo de segundo lcd.setCursor(8,1); lcd.print((cSegundos % 10) % 10); // Centésimo de segundo // Define máximo de 60 minutos -> vai para pause if (segundos == 3600) { pauseMode(); // vai para pauseMode } } // mod RESET -> zera o cronômetro void resetMode() { // interrompe contador de tempo Timer1.detachInterrupt(); // remover interrupção do timer // Zera o display position[0] = display.encodeDigit(0); // Dezena de minuto position[1] = display.encodeDigit(0); // Unidade de minuto position[2] = display.encodeDigit(0); // Dezena de segundo position[3] = display.encodeDigit(0); // Unidade de segundo // coloca o separador dois pontos (:) position[1] = position[1] + 128; //Mostra os valores no display TM1637 display.setSegments(position); //Zera display LCD lcd.setCursor(1,1); lcd.print("00:00,00"); // Aguarda pressionar o botão Pause while(digitalRead(pinButPause)) { } // espera apertar o botão para iniciar while (!digitalRead(pinButPause)) { } //esperera soltar o botão delay(50); cSegundos = 0; // zera o contador de tempo mode = 2; } // mode Pause -> pausa o cronômetro void pauseMode() { // interrompe contador de tempo Timer1.detachInterrupt(); // remover interrupção do timer // Aguarda pressionar o botão Pause para reiniciar while(digitalRead(pinButPause)) { // verifica se o botão Reset (pushbutton) está pressionado e muda o controle if (!digitalRead(pinButReset)) { while (!digitalRead(pinButReset)) { } //esperera soltar o botão Reset delay(50); resetMode(); // vai para modeReset break; } } // espera apertar o botão while (!digitalRead(pinButPause)) { } //esperera soltar o botão Pause delay(50); mode = 2; } void contadorTempo() { cSegundos++; segundos = cSegundos / 100; }