// ESP32 Digital Clock + Alarm + Progressive Buzzer
// Wokwi Ready Version
const int buzzerPin = 25;
const int hourBtn = 32;
const int minuteBtn = 33;
const int alarmBtn = 26;
const int pwmFreq = 2000;
const int pwmResolution = 8;
int currentHour = 12;
int currentMinute = 0;
int currentSecond = 45;
int alarmHour = 12;
int alarmMinute = 1;
bool alarmEnabled = true;
bool alarmRunning = false;
bool lastHourState = HIGH;
bool lastMinuteState = HIGH;
bool lastAlarmState = HIGH;
int duty = 0;
unsigned long previousMillis = 0;
unsigned long buzzerMillis = 0;
void setup() {
Serial.begin(115200);
pinMode(hourBtn, INPUT_PULLUP);
pinMode(minuteBtn, INPUT_PULLUP);
pinMode(alarmBtn, INPUT_PULLUP);
ledcAttach(buzzerPin, pwmFreq, pwmResolution);
ledcWrite(buzzerPin, 0);
Serial.println("Clock Started");
}
void loop() {
unsigned long currentMillis = millis();
// CLOCK UPDATE EVERY 1 SECOND
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
currentSecond++;
if (currentSecond >= 60) {
currentSecond = 0;
currentMinute++;
}
if (currentMinute >= 60) {
currentMinute = 0;
currentHour++;
}
if (currentHour >= 24) {
currentHour = 0;
}
printTime();
}
// READ BUTTONS
handleButtons();
// CHECK ALARM CONDITION
if (alarmEnabled &&
currentHour == alarmHour &&
currentMinute == alarmMinute &&
currentSecond == 0 &&
!alarmRunning) {
alarmRunning = true;
duty = 0;
Serial.println("ALARM STARTED");
}
// PROGRESSIVE BUZZER
if (alarmRunning) {
if (currentMillis - buzzerMillis >= 2000) {
buzzerMillis = currentMillis;
// duty += 10;
// if (duty > 200) duty = 200;
// ledcWrite(buzzerPin, duty);
// Serial.print("Buzzer Duty: ");
// Serial.println(duty);
// }
static int freq = 1000;
freq += 500;
if (freq > 5000) freq = 1000;
ledcAttach(buzzerPin, freq, pwmResolution);
ledcWrite(buzzerPin, 128); // constant duty
Serial.print("Frequency: ");
Serial.println(freq);
}
}
}
// ---------------------- FUNCTIONS ----------------------
void handleButtons() {
bool currentHourState = digitalRead(hourBtn);
bool currentMinuteState = digitalRead(minuteBtn);
bool currentAlarmState = digitalRead(alarmBtn);
// Hour button
if (lastHourState == HIGH && currentHourState == LOW) {
alarmHour++;
if (alarmHour >= 24) alarmHour = 0;
Serial.print("Alarm Hour: ");
Serial.println(alarmHour);
while(digitalRead(hourBtn) == LOW);
delay(200);
}
// Minute button
if (lastMinuteState == HIGH && currentMinuteState == LOW) {
alarmMinute++;
if (alarmMinute >= 60) alarmMinute = 0;
Serial.print("Alarm Minute: ");
Serial.println(alarmMinute);
while(digitalRead(minuteBtn) == LOW);
delay(200);
}
// Alarm enable button
if (lastAlarmState == HIGH && currentAlarmState == LOW) {
if (alarmRunning) {
alarmRunning = false;
ledcWrite(buzzerPin, 0);
duty = 0;
Serial.println("Alarm Stopped");
} else {
alarmEnabled = !alarmEnabled;
Serial.println(alarmEnabled ? "Alarm Enabled" : "Alarm Disabled");
}
while(digitalRead(alarmBtn) == LOW);
delay(200);
}
lastHourState = currentHourState;
lastMinuteState = currentMinuteState;
lastAlarmState = currentAlarmState;
}
void printTime() {
Serial.print("Time: ");
Serial.print(currentHour);
Serial.print(":");
Serial.print(currentMinute);
Serial.print(":");
Serial.println(currentSecond);
}