#include const int SPEAKER_PIN = D7; bool blink = true; void setup() { pinMode(SPEAKER_PIN, OUTPUT); Serial.begin(115200); delay(5000); Serial.println("PC Speaker Doorbell Ready!"); pinMode(LED_BUILTIN,OUTPUT); } // Function to play a tone using PWM void playTone(int frequency, int duration) { if (frequency == 0) { delay(duration); return; } // Calculate the period in microseconds int period = 1000000L / frequency; int halfPeriod = period / 2; // Calculate how many cycles we need for the duration long cycles = (long)frequency * duration / 1000; for (long i = 0; i < cycles; i++) { digitalWrite(SPEAKER_PIN, HIGH); delayMicroseconds(halfPeriod); digitalWrite(SPEAKER_PIN, LOW); delayMicroseconds(halfPeriod); } } // Classic Ding-Dong chime void dingDong() { playTone(1047, 500); // Ding (C6) delay(50); playTone(784, 1200); // Dong (G5) delay(750); playTone(1047, 500); // Ding (C6) delay(50); playTone(784, 1200); // Dong (G5) } // Two-tone chime void twoTone() { playTone(880, 150); // A5 delay(100); playTone(660, 250); // E5 } // Westminster chime (4 notes) void westminster() { int notes[] = {1047, 1175, 1319, 1568}; // C6, D6, E6, G6 for (int i = 0; i < 4; i++) { playTone(notes[i], 200); delay(50); } } void loop() { // Play different chimes in sequence (for testing) blink = !blink; digitalWrite(LED_BUILTIN,blink); dingDong(); delay(2000); twoTone(); delay(2000); westminster(); delay(2000); }