#include <Arduino.h>
#include <TM1637.h>

// Define display connections
#define CLK_PIN 18 // Shared CLK pin for both displays
#define DIO1_PIN 33
#define DIO2_PIN 32

TM1637 display1(CLK_PIN, DIO1_PIN);
TM1637 display2(CLK_PIN, DIO2_PIN);

// Define button pins
const int buttonPins[6] = {5, 17, 16, 4, 2, 15};

// Define buzzer pin
#define BUZZER_PIN 25

// Define default time values
int hours1 = 12, minutes1 = 0;
int hours2 = 7, minutes2 = 0;

bool alarmEnabled = true;
bool alarmActive = false;
unsigned long buttonPressTime[6] = {0};
bool buttonLongPress[6] = {false};

// Timing variables
unsigned long previousMillis = 0;
const long interval = 60000; // 1 minute interval
const int pressTime = 2000;

void setup() {
  Serial.begin(115200);

  // Initialize displays
  display1.set(7); // Brightness 7 (max)
  display2.set(7); // Brightness 7 (max)

  // Initialize button pins
  for (int i = 0; i < 6; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }

  // Initialize buzzer pin
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  // Set default time on displays
  updateDisplay1();
  updateDisplay2();
}

void loop() {
  unsigned long currentMillis = millis();

  // Check button states and handle long presses
  for (int i = 0; i < 6; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {
      if (buttonPressTime[i] == 0) {
        buttonPressTime[i] = currentMillis;
        Serial.println("IF 1");
      } else if (currentMillis - buttonPressTime[i] > pressTime) {
        buttonLongPress[i] = true;
        handleButtonPress(i);
        Serial.println("IF 2");
        Serial.print("Button press time: ");
        Serial.println(currentMillis - buttonPressTime[i]);
        delay(500); // Delay for continuous increment
      }
    } else {
      if (buttonLongPress[i]) {
        buttonLongPress[i] = false;
        Serial.println("IF 3");
      } else if (buttonPressTime[i] != 0) {
        Serial.println("IF 4");
        if (currentMillis - buttonPressTime[i] < pressTime) {
        Serial.println("IF 4.5");
          handleButtonPress(i);
          delay(300);
        }
        buttonPressTime[i] = 0;
      }
    }
  }

  // Increment the time on display1 every minute
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    incrementTime(hours1, minutes1);
    updateDisplay1();
    checkAlarm();
  }
}

void handleButtonPress(int buttonIndex) {
  switch (buttonIndex) {
    case 0: // Button 1: Increment hours on display1
      incrementHour(hours1);
      updateDisplay1();
      break;
    case 1: // Button 2: Increment minutes on display1
      incrementMinute(minutes1);
      updateDisplay1();
      break;
    case 2: // Button 3: Increment hours on display2
      incrementHour(hours2);
      updateDisplay2();
      break;
    case 3: // Button 4: Increment minutes on display2
      incrementMinute(minutes2);
      updateDisplay2();
      break;
    case 4: // Button 5: Toggle alarm
      alarmEnabled = !alarmEnabled;
      if (!alarmEnabled) {
        digitalWrite(BUZZER_PIN, LOW);
      }
      break;
    case 5: // Button 6: Stop buzzer
      digitalWrite(BUZZER_PIN, LOW);
      alarmActive = false;
      break;
  }
}

void incrementHour(int &hours) {
  hours = (hours + 1) % 24;
}

void incrementMinute(int &minutes) {
  minutes = (minutes + 1) % 60;
}

void incrementTime(int &hours, int &minutes) {
  minutes++;
  if (minutes >= 60) {
    minutes = 0;
    hours++;
    if (hours >= 24) {
      hours = 0;
    }
  }
}

void updateDisplay1() {
  display1.display(0, hours1 / 10);
  display1.display(1, hours1 % 10);
  display1.display(2, minutes1 / 10);
  display1.display(3, minutes1 % 10);
}

void updateDisplay2() {
  display2.display(0, hours2 / 10);
  display2.display(1, hours2 % 10);
  display2.display(2, minutes2 / 10);
  display2.display(3, minutes2 % 10);
}

void checkAlarm() {
  if (alarmEnabled && !alarmActive && hours1 == hours2 && minutes1 == minutes2) {
    digitalWrite(BUZZER_PIN, HIGH);
    alarmActive = true;
  }
}
Loading
esp32-devkit-c-v4
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r
btn6:1.l
btn6:2.l
btn6:1.r
btn6:2.r
4-Digit Display
sevseg1:CLK
sevseg1:DIO
sevseg1:VCC
sevseg1:GND
4-Digit Display
sevseg2:CLK
sevseg2:DIO
sevseg2:VCC
sevseg2:GND
bz1:1
bz1:2
led1:A
led1:C