#include <Keypad.h>
#include <TM1637Display.h>
#define CLK 10
#define DIO 11
TM1637Display display(CLK, DIO);
// -------- Keypad ----------
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5};
byte colPins[COLS] = {6,7,8,9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// -------- Countdown ----------
enum Mode { SET_MMSS, RUNNING, PAUSED };
Mode mode = SET_MMSS;
char mmss[5] = {'0','0','0','0','\0'}; // 4 Ziffern: MMSS
int secondsTotal = 0;
unsigned long lastTick = 0;
void displayMMSS(const char* t) {
int mm = (t[0]-'0')*10 + (t[1]-'0');
int ss = (t[2]-'0')*10 + (t[3]-'0');
if (ss > 59) ss = 59;
int value = mm * 100 + ss;
display.showNumberDecEx(value, 0b01000000, true); // Doppelpunkt an
}
int mmssToSeconds(const char* t) {
int mm = (t[0]-'0')*10 + (t[1]-'0');
int ss = (t[2]-'0')*10 + (t[3]-'0');
if (ss > 59) ss = 59;
return mm * 60 + ss;
}
void secondsToMMSS(int s, char* out4) {
if (s < 0) s = 0;
int mm = s / 60;
int ss = s % 60;
if (mm > 99) mm = 99;
out4[0] = char('0' + (mm / 10));
out4[1] = char('0' + (mm % 10));
out4[2] = char('0' + (ss / 10));
out4[3] = char('0' + (ss % 10));
}
void shiftDigit(char d) {
mmss[0] = mmss[1];
mmss[1] = mmss[2];
mmss[2] = mmss[3];
mmss[3] = d;
}
void resetAll() {
mode = SET_MMSS;
mmss[0]='0'; mmss[1]='0'; mmss[2]='0'; mmss[3]='0';
secondsTotal = 0;
displayMMSS(mmss);
}
void setup() {
display.setBrightness(7);
resetAll();
}
void loop() {
// ---- Keypad lesen ----
char k = keypad.getKey();
if (k) {
// Ziffern nur im Set-Modus annehmen
if (k >= '0' && k <= '9' && mode == SET_MMSS) {
shiftDigit(k);
displayMMSS(mmss);
}
// A = Start
if (k == 'A') {
if (mode == SET_MMSS) {
secondsTotal = mmssToSeconds(mmss);
if (secondsTotal > 0) {
mode = RUNNING;
lastTick = millis();
} else {
// Bei 00:00 nicht starten, im Set-Modus bleiben
resetAll();
}
}
}
// B = Pause/Resume
if (k == 'B') {
if (mode == RUNNING) mode = PAUSED;
else if (mode == PAUSED) { mode = RUNNING; lastTick = millis(); }
}
// C = Reset (immer)
if (k == 'C') {
resetAll();
}
// D = +10 Sekunden im Set-Modus
if (k == 'D' && mode == SET_MMSS) {
int s = mmssToSeconds(mmss);
s += 10;
if (s > 99*60 + 59) s = 99*60 + 59;
secondsToMMSS(s, mmss);
displayMMSS(mmss);
}
// * = Backspace (letzte Ziffer 0 setzen), nur Set-Modus
if (k == '*' && mode == SET_MMSS) {
mmss[3] = '0';
displayMMSS(mmss);
}
}
// ---- Countdown tick ----
if (mode == RUNNING) {
unsigned long now = millis();
if (now - lastTick >= 1000) {
lastTick += 1000;
if (secondsTotal > 0) {
secondsTotal--;
secondsToMMSS(secondsTotal, mmss);
displayMMSS(mmss);
} else {
// AUTOMATISCHER RESET BEI 0
resetAll();
}
}
}
}