Hub 012 - Cronômetro com botões de pause e reset - Arduino

Básico - Hub 012

Cronômetro com pause e reset

 

Sugerido por: Wagner G L ENVIAR SUGESTÃO

Objetivo

O objetivo é adaptar o Projeto 64 - Cronômetro com display TM1637 e Arduino acrescentando botões de pause (congelar tempo) e reset (zerar cronômetro). Também deve ser acrescentado a um display LCD para visualizar minutos, segundos e centésimos de segundos.

Obs.: O cronômetro sugerido é limitado até 60 minutos.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1  
Módulo TM1637

Módulo TM1637 - 4 dígitos(anodo comum)

 

1 Módulo TM1637 com display 4 dígitos - Controlador TM1637
- Alimentação: 3.3 à 5V DC
- Display 7 segmentos 4 dígitos anodo comum

datasheet

Push Button

Push button 6X6X5mm

2  
Display LCD Display LCD 16X2  1

LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)

O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)

Módulo I2C para display LCD 

Módulo I2C com CI PCF8574

(opcional)

1 Módulo I2C display LCD Arduino

O módulo I2C poderá vir separado ou já soldado no display LCD

(datasheet)

Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador

Arduino UNO Arduino UNO R3 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Referências

Projeto 64 - Cronômetro com display TM1637 e Arduino

Projeto 63 - Usando o módulo TM1637 (display 4 dígitos) com Arduino

Projeto 48 - Como controlar um display LCD com o módulo I2C

Projeto 38 - Controlando um display LCD (instalação e comandos básicos) - Caso opte por usar o LCD sem o módulo I2C

Bibliotecas

Para controlarmos o módulo TM1637 vamos precisar das bibliotecas TM1637Display ({source}download{/source}) e para o display LCD com módulo I2C precisaremos da biblioteca NewliquidCrystal_1.3.4.zip ({source}download{/source}).

Após fazer o download dos arquivos das bibliotecas com todos os arquivos compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Para conhecer outras bibliotecas para módulos veja a Tabela Biblioteca para Módulos.

Código do Projeto (Sketch)

Faça o download e abra o arquivo hub012.ino no IDE do Arduino: DOWNLOAD - hb012.ino

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Hub 12: Cronômetro com display TM1637 e Arduino (pause e reset)
*    Autor: Angelo Luis Ferreira
*    Data: 21/06/2021
*    
*             http://squids.com.br/arduino             
*
*******************************************************************************/
#include   // Inclui a biblioteca LiquidCrystal_I2C (LCD)
#include  // Inclui a biblioteca TM1637Display
 
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)

// declarações de variáveis
byte mode = 0;
uint32_t tempoPause = 0;
uint32_t timer = 0;
uint32_t t = 0;

// 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() {
  Serial.begin(9600);    
  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);
  }
  
    // 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() {
   // Armazena em segundos o tempo ligado do Arduino
  timer = (millis() - t) + tempoPause;

   // Armazena em segundos o tempo ligado do Arduino
  uint32_t segundos = timer / 1000;
  
  // 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((timer / 100) % 10); // Décimo de segundo
  lcd.setCursor(8,1);
  lcd.print((timer % 100) % 10); // Centésimo de segundo 

  // Define máximo de 60 minutos -> vai para pause
  if (((segundos / 60) / 10) == 6) {
    pauseMode();
  }                  
}

// mod RESET -> zera o cronômetro
void resetMode() {
  // 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);
  tempoPause = 0;
  timer = 0; 
  t = millis();
  mode = 2;  
}

// mode PAUSE -> pausa o cronômetro
void pauseMode() {
  // 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();
      break;
    }  
  } // espera apertar o botão
  while (!digitalRead(pinButPause)) { }  //esperera soltar o botão Pause
  delay(50);
  tempoPause = timer;
  t = millis();
  mode = 2; 
}

Vídeo

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores