#include <Arduino.h>
#include "TM1637.h" // Grove 4-Digit Display library
#define CLK 2 // CLK pin of TM1637 to Arduino Nano pin 2
#define DIO 3 // DIO pin of TM1637 to Arduino Nano pin 3
#define BUTTON_1 9 // Button 1 connected to pin 9
bool firstStart = true;
TM1637 display(CLK, DIO);
int8_t TimeDisp[] = { 0x00, 0x00, 0x00, 0x00 }; // Array to hold values for each digit
const long interval = 1000; // Interval for blinking colon (1 second)
bool colonState = false; // State of colon (on/off)
bool timerRunning = false; // Flag to indicate if the timer is running
bool timerPaused = false; // Flag to indicate if the timer is paused
unsigned long previousMillis = 0; // Variable to hold previous tiem
unsigned long startTime = 0; // Timestamp when the timer starts
unsigned long elapsedTime = 0; // Elapsed time since timer started
void setup() {
pinMode(BUTTON_1, INPUT_PULLUP); // Set button 1 pin as input with pull-up
}
void loop() {
// Check if button 1 is pressed
if (digitalRead(BUTTON_1) == LOW) {
if (firstStart) {
display.init(); // Initialize display
display.set(); // Clear display
display.point(true); // Enable colon
firstStart = false;
}
if (!timerRunning) { // If timer was not running start it
startTime = millis() - elapsedTime;
timerRunning = true;
} else if (!timerPaused) { // If Previously timer is working then pause it on button press
timerPaused = true;
} else {
stopTimer();
display.point(false);
display.clearDisplay();
}
delay(500); // Debounce delay
}
// Update timer display
if (timerRunning && !timerPaused) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
elapsedTime = currentMillis - startTime;
updateDisplay(elapsedTime / 1000);
toggleColon(); // Toggle colon every second
}
}
}
void updateDisplay(int seconds) {
int hours = seconds / 3600;
seconds %= 3600;
int minutes = seconds / 60;
TimeDisp[0] = hours / 10;
TimeDisp[1] = hours % 10;
TimeDisp[2] = minutes / 10;
TimeDisp[3] = minutes % 10;
display.display(TimeDisp);
}
void toggleColon() { // Function to invert colon state
colonState = !colonState; // Invert previous colon state
display.point(colonState);
}
void stopTimer() {
timerRunning = false;
timerPaused = false;
elapsedTime = 0;
TimeDisp[0] = 0;
TimeDisp[1] = 0;
TimeDisp[2] = 0;
TimeDisp[3] = 0;
display.display(TimeDisp);
}