Timer Regressivo Ajustável DIY com Arduino Mega 2560
Componentes e Materiais
| Arduino Mega 2560 (qualquer Arduino funciona) | 1 |
| Display 7 segmentos 4 dígitos | 1 |
| Botão push button | 4 |
| Buzzer | 1 |
| Fios jumpers (genéricos) | 21 |
| Protoboard tamanho completo | 1 |
Sobre o Projeto
Timer regressivo é provavelmente o projeto mais natural para display 7 segmentos de 4 dígitos. Explorando o que está disponível online, encontrei vários projetos, mas não achei o que tinha em mente: um timer regressivo ajustável autônomo que você possa ajustar convenientemente com botões (e não modificando e recarregando o código). Então decidi fazer um.
Gastei tempo escrevendo um código que torne fácil usar e ajustar o timer, para que possa ser usado na prática.
O código incluído também serve para outros projetos com display 7 segmentos 4 dígitos. Em particular, tem a função que exibe um número (0-9999) por um intervalo de tempo. Talvez essa funcionalidade exista em alguma biblioteca, mas uma busca rápida não revelou. Como programar este display é um pouco complicado (pois só mostra um dígito por vez), tal função é muito útil.
Código
Timer regressivo display 7 segmentos 4 dígitos C/C++
O código contém a função de timer regressivo que inicia a contagem regressiva mostrada no display. Também tem a função útil PrintNumber que mostra um número de 4 dígitos no display por um tempo determinado. Pode ser usado em outros projetos.
#include <math.h>
int digit_pin[] = {6, 9, 10, 11}; // Pinos PWM dos dígitos do display da esquerda para direita
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH
int segA = 2;
int segB = 3;
int segC = 4;
int segD = 5;
int segE = A0; // pino 6 usado pelo display 1 para PWM
int segF = 7;
int segG = 8;
int button1 = 13;
int button2 = 12;
int button3 = 16;
int button4 = 17;
int countdown_time = 60;
struct struct_digits {
int digit[4];
};
void setup() {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(digit_pin[i], OUTPUT);
}
pinMode(speakerPin, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
}
void playTone(int tone, int duration) {
for (long k = 0; k < duration * 1000L; k += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
switch (numberToDisplay) {
case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_OFF); break;
case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break;
case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break;
case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break;
case 10: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break;
}
}
void SwitchDigit(int digit) {
for (int i = 0; i < 4; i++) {
if (i == digit) { digitalWrite(digit_pin[i], DIGIT_ON); }
else { digitalWrite(digit_pin[i], DIGIT_OFF); }
}
}
struct struct_digits IntToDigits(int n) {
struct struct_digits dig;
int zeros = 0;
int d;
for (int i = 0; i < 4; i++) {
d = n / pow(10, 3 - i);
zeros += d;
n = n - d * pow(10, 3 - i);
if (zeros != 0 || i == 3) { dig.digit[i] = d; }
else { dig.digit[i] = 10; }
}
return dig;
}
void PrintNumber(int n, int time) {
struct struct_digits dig;
dig = IntToDigits(n);
for (int i = 0; i <= time / 20; i++) {
if (digitalRead(button2) == LOW) { return; }
for (int j = 0; j < 4; j++) {
SwitchDigit(j);
lightNumber(dig.digit[j]);
delay(5);
}
}
}
bool Countdown(int n, int del) {
for (int q = n; q > 0; q--) {
PrintNumber(q, del);
if (digitalRead(button2) == LOW) { return false; }
}
PrintNumber(0, 0);
playTone(1519, 1000);
return true;
}
void reset() {
int m, zeros, d, pressed3 = 0, pressed4 = 0;
m = countdown_time;
struct struct_digits dig;
dig = IntToDigits(countdown_time);
while (digitalRead(button1) == HIGH) {
for (int j = 0; j < 4; j++) {
SwitchDigit(j);
lightNumber(dig.digit[j]);
delay(5);
}
if (digitalRead(button3) == LOW) {
if (pressed3 == 0 || pressed3 > 30) {
if (countdown_time > 0) { countdown_time -= 1; }
dig = IntToDigits(countdown_time);
}
pressed3 += 1;
} else if (digitalRead(button4) == LOW) {
if (pressed4 == 0 || pressed4 > 30) {
if (countdown_time < 9999) { countdown_time += 1; }
dig = IntToDigits(countdown_time);
}
pressed4 += 1;
}
if (digitalRead(button3) == HIGH) { pressed3 = 0; }
if (digitalRead(button4) == HIGH) { pressed4 = 0; }
}
}
void loop() {
reset();
while (!Countdown(countdown_time, 962)) { reset(); }
while (digitalRead(button2) == 1) {};
}
Esquemáticos

Processo de manufatura
- Display de Cristal Líquido (LCD): Tecnologia, Fabricação e Perspectivas Futuras
- Dominando Sobrecarga de Métodos em C#: Conceitos, Exemplos e Boas Práticas
- Primal Display: Construa Monitor de Temperatura LCD com Raspberry Pi
- Como Instalar Display TFT 3.5″ Kuman no RetroPie – Guia Passo a Passo
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Construa o Clássico Jogo Pong no Arduino UNO com Display OLED – Tutorial Passo a Passo
- Entendendo o Watchdog Timer: Como Ele Impede Travamentos do Microcontrolador
- Kit Caça-Níqueis Alienígena com ATmega328P
- Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
- Amortecedores Ajustáveis: Melhorando Altura de Rodagem e Desempenho