#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
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
sevseg1:CLK
sevseg1:DIO
sevseg1:VCC
sevseg1:GND
sevseg2:CLK
sevseg2:DIO
sevseg2:VCC
sevseg2:GND
bz1:1
bz1:2
led1:A
led1:C