Você está na página 1de 11

Placar Cronômetro com Display TM1637 e Arduino (com

funcionalidades de pausa, reset e placar) e LCD 1602

Curitiba,
Novembro 2023

Centro Universitário UniDomBosco


Curso de Análise e Desenvolvimento de Sistemas

Placar Cronômetro com Display TM1637 e Arduino (com


funcionalidades de pausa, reset e placar) e LCD 1602

Projeto Arduino do curso de


Análise e Desenvolvimento de
Sistemas desenvolvido pelos alunos
Gabriela Berdak Martins,
Karina de Andrade Faria,
Guilherme Marcelo Gonçalves,
Ana Flávia Miranda Morais.

Curitiba,
Novembro 2023
Introdução
Desenvolvimento de um cronômetro utilizando um display TM1637 para exibir o
tempo decorrido, com funcionalidades de pausa e reset. Além disso, o projeto inclui
um display LCD 1602, mesmo que esteja com defeito.

Conexões do LCD 1602 (sem adaptador I2C):

​ RS (Register Select): Conectado ao pino digital 12 do Arduino.


​ RW (Read/Write): Conectado ao GND.
​ EN (Enable): Conectado ao pino digital 11 do Arduino.
​ D4: Conectado ao pino digital 7 do Arduino.
​ D5: Conectado ao pino digital 6 do Arduino.
​ D6: Conectado ao pino digital 5 do Arduino.
​ D7: Conectado ao pino digital 4 do Arduino.
​ VSS (Ground): Conectado a um pino GND (terra) no Arduino.

Conexões dos Botões:

​ Botão Pause: Um terminal conectado ao pino digital 8 do Arduino e o outro


terminal ao GND.
​ Botão Reset: Um terminal conectado ao pino digital 9 do Arduino e o outro
terminal ao GND.

Código:

​ Importa as bibliotecas necessárias, incluindo LiquidCrystal_I2C e


TM1637Display.
​ Define os pinos CLK e DIO para o TM1637.
​ Define os pinos para os botões de pausa e reset.
​ Declaração de variáveis para controle do modo, tempo de pausa, timer e t.
​ Inicializa objetos para o LCD e o display TM1637.
​ Configura o brilho do display TM1637 e inicia o display LCD.
​ No loop principal, verifica se os botões de pausa ou reset foram pressionados
e realiza as ações correspondentes conforme o modo atual.
​ Existem três modos principais: resetMode (zera o cronômetro), pauseMode
(pausa o cronômetro) e runMode (roda o cronômetro e exibe o tempo nos
displays).
​ O código também inclui uma verificação para o defeito no display LCD 1602.

Explicação Detalhada:

​ Setup:

Inicializa a comunicação serial.

Configura o brilho do display TM1637.

Inicializa o display LCD e exibe um título.

Configura os pinos dos botões como entrada com pull-up interno.


​ Loop:

Verifica se os botões de pausa ou reset foram pressionados.

Seleciona o modo com base nos botões pressionados.

Executa as ações correspondentes a cada modo.

​ Modos:

runMode: Calcula e exibe o tempo decorrido nos displays TM1637 e


LCD.

resetMode: Zera o cronômetro, exibe zero nos displays e aguarda o


botão de pausa ser pressionado para iniciar.

pauseMode: Pausa o cronômetro e aguarda o botão de pausa ser


pressionado novamente para retomar.

​ Display LCD Defeituoso:

O código inclui uma verificação para o defeito no display LCD 1602,


mas não especifica as ações tomadas em caso de defeito.

Código:

#include <LiquidCrystal_I2C.h> // Inclui a biblioteca LiquidCrystal_I2C (LCD)

#include <TM1637Display.h> // 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;

Referências

https://youtu.be/O4eZgCR9h9s

Arduino Word Clock : 31 Passos (com Fotos) - Instructables

Você também pode gostar