Ratgeber · 9 Min. Lesezeit

Weihnachtslieder mit Arduino-Buzzer: Jingle Bells und mehr

Weihnachtslieder mit Arduino und Buzzer: Jingle Bells, Stille Nacht, We Wish You a Merry Christmas und Deck the Halls mit Notentabelle, Tempo und LED-Player.

Um Weihnachtslieder mit dem Arduino zu spielen, brauchst du nur einen passiven Buzzer und die Funktion tone(): Du schreibst Frequenz und Länge jeder Note in ein Array, und der Arduino schickt sie nacheinander an den Buzzer. In diesem Beitrag findest du für Jingle Bells, We Wish You a Merry Christmas, Stille Nacht und Deck the Halls korrekte Noten- und Längen-Arrays, die aus dem Notenblatt übertragen und nicht nach Gehör geraten wurden. Alle vier Melodien sind traditionelle Stücke, die weit über hundert Jahre alt sind; du kannst sie also ohne Urheberrechtssorgen in jedem Projekt verwenden.

Wir beginnen mit einem kurzen Sketch für ein einzelnes Lied und gehen dann zu einer Spieluhr über, die alle vier Lieder nacheinander spielt, zwei LEDs im Takt der Noten blinken lässt und per Taster das Lied wechselt. Dieser zweite Sketch nutzt millis() statt delay() und kann deshalb während des Liedes weiter Taster, Sensoren oder einen LED-Streifen bedienen. Am Ende übertragen wir die Melodien auf eine Touch-Weihnachtskarte mit dem ESP32 und auf MicroPython mit dem Raspberry Pi Pico.

Passiver Buzzer für Weihnachtslieder mit Arduino
Ein passiver Buzzer spielt jede Frequenz, die tone() vorgibt, und ist deshalb die richtige Wahl für Melodien.

Welcher Buzzer: aktiv oder passiv?

Ein aktiver Buzzer hat einen eigenen Oszillator eingebaut; legst du 5 V an, piept er immer im selben Ton und kann daher keine Melodie spielen. Ein passiver Buzzer verhält sich wie ein winziger Lautsprecher: Er klingt in genau der Frequenz, mit der der Arduino-Pin ein- und ausschaltet. Am einfachsten unterscheidest du sie, indem du den Buzzer kurz an eine 3–5-V-Batterie hältst: Ein Dauerpiepton bedeutet aktiv, ein einzelnes Knacken bedeutet passiv. Aktive Modelle tragen meist einen weißen Aufkleber und haben eine geschlossene Unterseite, bei passiven sieht man unten eine grüne Platine. Mehr dazu findest du unter Was ist ein Buzzer?.

EigenschaftAktiver BuzzerPassiver Buzzer
Eingebauter OszillatorJaNein
Spielt Melodien?Nein, nur ein TonJa, jede Note mit tone()
AnsteuerungdigitalWrite()tone(pin, frequenz, dauer)
An Batterie gehaltenDauerpieptonEinzelnes Knacken
Lautester BereichFest (meist 2–2,5 kHz)Etwa 2–4 kHz (Resonanz)

Verdrahtung: Buzzer, zwei LEDs und ein Taster

BauteilArduino UnoESP32Raspberry Pi Pico
Passiver Buzzer +D8GPIO 25GP15
Passiver Buzzer −GNDGNDGND
LED 1 (mit 220 Ω)D6GPIO 26GP14
LED 2 (mit 220 Ω)D7GPIO 27GP13
Taster (anderes Bein an GND)D2GPIO 4GP2
Touch-Folie-GPIO 32 (T9)-
Auf dem Uno nutzt tone() den Timer2; während ein Lied läuft, funktioniert analogWrite() an D3 und D11 nicht. Hängst du LEDs an diese Pins und willst sie dimmen, siehst du Flackern oder gar kein Licht. Einen Buzzer direkt an einen Pin anzuschließen ist in Ordnung, einen 8-Ω-Lautsprecher aber niemals; nimm dafür die Transistorschaltung aus dem Abschnitt zum Lautermachen weiter unten.

Notenfrequenzen: die 14 Noten dieser Weihnachtslieder

In der westlichen Musik ist jede Oktave in 12 Halbtöne geteilt, und ein Halbton höher multipliziert die Frequenz mit der 12. Wurzel aus 2, also etwa 1,0595. Der Kammerton A4 hat 440 Hz; eine Note mit der MIDI-Nummer n hat die Frequenz f = 440 × 2^((n − 69) / 12). Das C5 ist zum Beispiel MIDI 72: 440 × 2^(3/12) = 523,25 Hz. Eine Oktave höher verdoppelt die Frequenz exakt, deshalb hat C6 1047 Hz. Kleine passive Buzzer klingen unter 500 Hz dünn, darum haben wir alle vier Lieder in die 5. und 6. Oktave gelegt; die Tabelle enthält jede Note aus dem Code. Achtung: Im Deutschen heißt das englische B4 "H" und das englische Bb "B".

NoteDeutscher NameFrequenz (Hz)Code-Konstante
B4H494NOTE_B4
C5C523NOTE_C5
D5D587NOTE_D5
E5E659NOTE_E5
F5F698NOTE_F5
F#5Fis740NOTE_FS5
G5G784NOTE_G5
A5A880NOTE_A5
A#5 / Bb5B932NOTE_AS5
B5H988NOTE_B5
C6C1047NOTE_C6
D6D1175NOTE_D6
E6E1319NOTE_E6
F6F1397NOTE_F6

Tempo und Notenlängen

Statt jede Länge in Millisekunden zu schreiben, haben wir die kürzeste Note, die Achtelnote, als Einheit genommen: 1 ist eine Achtel, 2 eine Viertel, 3 eine punktierte Viertel, 4 eine Halbe, 6 eine punktierte Halbe und 8 eine Ganze. Das Tempo ist die Zahl der Viertel pro Minute (BPM); eine Viertel dauert 60000 / BPM Millisekunden, eine Achtel die Hälfte davon. Bei 120 BPM sind das 500 ms für die Viertel und 250 ms für die Achtel. Willst du das Tempo ändern, passt du nur die Achtellänge an und lässt die Arrays in Ruhe. Jede Note klingt 90 % ihrer Länge, die letzten 10 % bleiben stumm; so verschwimmen wiederholte Noten (wie die drei E in Jingle Bells) nicht zu einem langen Ton.

LiedTaktTempoAchtel (ms)Viertel (ms)Noten
Jingle Bells (Refrain)4/4120 BPM25050051
We Wish You a Merry Christmas3/4150 BPM20040030
Stille Nacht3/475 BPM40080046
Deck the Halls4/4etwa 130 BPM23046068

Erster Sketch: der Refrain von Jingle Bells

  1. Verbinde das +-Bein des passiven Buzzers mit D8 und das andere mit GND.
  2. Öffne die Arduino IDE, füge den Code unten ein und wähle Arduino Uno als Board.
  3. Lade ihn hoch; der Refrain spielt einmal, sobald das Board startet. Zum erneuten Anhören drückst du die Reset-Taste.
  4. Ist es zu langsam oder zu schnell, ändere EIGHTH_MS: 200 spielt schneller, 300 langsamer.
C++ (Arduino IDE)
1// Jingle Bells nakaratı - pasif buzzer D8 / Jingle Bells chorus - passive buzzer on D8
2#define NOTE_C5 523
3#define NOTE_D5 587
4#define NOTE_E5 659
5#define NOTE_F5 698
6#define NOTE_G5 784
7
8const int BUZZER_PIN = 8;      // pasif buzzer + ucu / passive buzzer + lead
9const int EIGHTH_MS = 250;     // 120 BPM: dörtlük 500 ms, sekizlik 250 ms / quarter 500 ms, eighth 250 ms
10
11const int melody[] = {
12  NOTE_E5, NOTE_E5, NOTE_E5,   NOTE_E5, NOTE_E5, NOTE_E5,
13  NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,   NOTE_E5,
14  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,   NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
15  NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,   NOTE_D5, NOTE_G5,
16  NOTE_E5, NOTE_E5, NOTE_E5,   NOTE_E5, NOTE_E5, NOTE_E5,
17  NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,   NOTE_E5,
18  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,   NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
19  NOTE_G5, NOTE_G5, NOTE_F5, NOTE_D5,   NOTE_C5
20};
21// süreler sekizlik cinsinden: 1 = sekizlik, 2 = dörtlük, 3 = noktalı dörtlük, 4 = ikilik, 8 = birlik
22// lengths in eighths: 1 = eighth, 2 = quarter, 3 = dotted quarter, 4 = half, 8 = whole
23const byte beats[] = {
24  2, 2, 4,   2, 2, 4,
25  2, 2, 3, 1,   8,
26  2, 2, 3, 1,   2, 2, 2, 1, 1,
27  2, 2, 2, 2,   4, 4,
28  2, 2, 4,   2, 2, 4,
29  2, 2, 3, 1,   8,
30  2, 2, 3, 1,   2, 2, 2, 1, 1,
31  2, 2, 2, 2,   8
32};
33
34void setup() {
35  int count = sizeof(melody) / sizeof(melody[0]);   // 51 nota / 51 notes
36  for (int i = 0; i < count; i++) {
37    int duration = beats[i] * EIGHTH_MS;
38    tone(BUZZER_PIN, melody[i], duration * 9 / 10);  // notalar arasında %10 boşluk / 10% gap between notes
39    delay(duration);
40  }
41  noTone(BUZZER_PIN);
42}
43
44void loop() {
45  // bir kez çalar; tekrar için reset tuşuna bas / plays once, press reset to replay
46}

Der Sketch führt zwei parallele Arrays: melody enthält die Notenfrequenzen, beats die Länge jeder Note in Achteln in derselben Reihenfolge. Für jede Note startet die Schleife den Ton mit tone() und wartet mit delay() die volle Notenlänge. Bekommt tone() als dritten Parameter eine Dauer, beendet es den Ton selbst; weil wir 90 % der Notenlänge übergeben, entsteht eine kurze Atempause zwischen den Noten. Beide Arrays müssen gleich viele Elemente haben; fügst du in einem eine Note hinzu und vergisst die Länge im anderen, verrutscht die Melodie und es wird zufälliger Speicher hinter dem Array-Ende abgespielt. Die Lücken in den Arrays entsprechen den Taktstrichen, so lassen sich die Noten leicht mit dem Notenblatt vergleichen.

Die Noten-Arrays aller vier Lieder

Die Tabelle zeigt die Tonart jedes Liedes und die Noten seiner ersten Zeile; das hilft, wenn du den Code nach Gehör prüfst. Ein Strich (–) ist ein Taktstrich, ein Punkt (.) eine punktierte Note. We Wish You a Merry Christmas beginnt mit einem Auftakt: Das erste C5 ist eine einzelne Viertel vor dem ersten Takt. Stille Nacht ist langsam und breit, deshalb halten wir das letzte C5 zwölf Achtel lang, also zwei ganze Takte. Das einzige Kreuz in Deck the Halls ist das Fis (F#5) im aufsteigenden "Fa-la-la"-Lauf.

LiedTonartNoten der ersten ZeileAchte auf
Jingle BellsC-DurE E E – E E E – E G C. D – EPunktierte Viertel + Achtel bei "all the way"
We Wish You a Merry ChristmasF-DurC – F F G F E – D D D3/4-Takt, nutzt das B (A#5)
Stille NachtC-Dur (eine Oktave höher)G. A G – E – G. A G – ELangsames Tempo, punktierte Halbe
Deck the HallsC-DurG. F E D – C D E C"Fa-la-la"-Achtel, Fis (F#5)

Weihnachtslieder-Player mit millis und LEDs (4 Lieder + Taster)

Jetzt packen wir alle vier Lieder in einen Sketch. Die Noten stehen in einer Note-Struktur aus {Frequenz, Länge}-Paaren und liegen mit PROGMEM im Flash; der Uno hat nur 2 KB RAM, deshalb ist es eine gute Gewohnheit, 195 Noten aus dem Flash zu lesen, statt sie im RAM zu halten. Die LEDs wechseln bei jeder Note, der Taster an D2 nutzt den internen Pull-up, und ein Druck springt zum nächsten Lied. Ist ein Lied zu Ende, folgen 1,5 Sekunden Stille, dann startet das nächste.

C++ (Arduino IDE)
1// 4 Noel şarkısı: millis ile çalar, LED'ler notaya göre yanar, buton sonraki şarkıya geçer
2// 4 Christmas songs: millis-based player, LEDs follow the notes, button skips to the next song
3#define REST     0
4#define NOTE_B4  494
5#define NOTE_C5  523
6#define NOTE_D5  587
7#define NOTE_E5  659
8#define NOTE_F5  698
9#define NOTE_FS5 740
10#define NOTE_G5  784
11#define NOTE_A5  880
12#define NOTE_AS5 932
13#define NOTE_B5  988
14#define NOTE_C6  1047
15#define NOTE_D6  1175
16#define NOTE_E6  1319
17#define NOTE_F6  1397
18
19#if defined(ESP32)
20const int BUZZER_PIN = 25;               // ESP32 pinleri / ESP32 pins
21const int LED_PINS[2] = {26, 27};
22const int BUTTON_PIN = 4;
23#else
24const int BUZZER_PIN = 8;                // Arduino Uno pinleri / Arduino Uno pins
25const int LED_PINS[2] = {6, 7};
26const int BUTTON_PIN = 2;
27#endif
28
29struct Note { uint16_t freq; uint8_t len; };   // len: sekizlik sayısı / length in eighths
30
31// Jingle Bells (Do majör, 4/4) / (C major, 4/4)
32const Note JINGLE[] PROGMEM = {
33  {NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,4}, {NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,4},
34  {NOTE_E5,2},{NOTE_G5,2},{NOTE_C5,3},{NOTE_D5,1}, {NOTE_E5,8},
35  {NOTE_F5,2},{NOTE_F5,2},{NOTE_F5,3},{NOTE_F5,1}, {NOTE_F5,2},{NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,1},{NOTE_E5,1},
36  {NOTE_E5,2},{NOTE_D5,2},{NOTE_D5,2},{NOTE_E5,2}, {NOTE_D5,4},{NOTE_G5,4},
37  {NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,4}, {NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,4},
38  {NOTE_E5,2},{NOTE_G5,2},{NOTE_C5,3},{NOTE_D5,1}, {NOTE_E5,8},
39  {NOTE_F5,2},{NOTE_F5,2},{NOTE_F5,3},{NOTE_F5,1}, {NOTE_F5,2},{NOTE_E5,2},{NOTE_E5,2},{NOTE_E5,1},{NOTE_E5,1},
40  {NOTE_G5,2},{NOTE_G5,2},{NOTE_F5,2},{NOTE_D5,2}, {NOTE_C5,8}
41};
42
43// We Wish You a Merry Christmas (Fa majör, 3/4) / (F major, 3/4)
44const Note WE_WISH[] PROGMEM = {
45  {NOTE_C5,2},
46  {NOTE_F5,2},{NOTE_F5,1},{NOTE_G5,1},{NOTE_F5,1},{NOTE_E5,1}, {NOTE_D5,2},{NOTE_D5,2},{NOTE_D5,2},
47  {NOTE_G5,2},{NOTE_G5,1},{NOTE_A5,1},{NOTE_G5,1},{NOTE_F5,1}, {NOTE_E5,2},{NOTE_C5,2},{NOTE_C5,2},
48  {NOTE_A5,2},{NOTE_A5,1},{NOTE_AS5,1},{NOTE_A5,1},{NOTE_G5,1}, {NOTE_F5,2},{NOTE_D5,2},{NOTE_C5,1},{NOTE_C5,1},
49  {NOTE_D5,2},{NOTE_G5,2},{NOTE_E5,2}, {NOTE_F5,6}
50};
51
52// Silent Night (Do majör, 3/4, bir oktav yukarı) / (C major, 3/4, one octave up)
53const Note SILENT[] PROGMEM = {
54  {NOTE_G5,3},{NOTE_A5,1},{NOTE_G5,2}, {NOTE_E5,6}, {NOTE_G5,3},{NOTE_A5,1},{NOTE_G5,2}, {NOTE_E5,6},
55  {NOTE_D6,4},{NOTE_D6,2}, {NOTE_B5,6}, {NOTE_C6,4},{NOTE_C6,2}, {NOTE_G5,6},
56  {NOTE_A5,4},{NOTE_A5,2}, {NOTE_C6,3},{NOTE_B5,1},{NOTE_A5,2}, {NOTE_G5,3},{NOTE_A5,1},{NOTE_G5,2}, {NOTE_E5,6},
57  {NOTE_A5,4},{NOTE_A5,2}, {NOTE_C6,3},{NOTE_B5,1},{NOTE_A5,2}, {NOTE_G5,3},{NOTE_A5,1},{NOTE_G5,2}, {NOTE_E5,6},
58  {NOTE_D6,4},{NOTE_D6,2}, {NOTE_F6,3},{NOTE_D6,1},{NOTE_B5,2}, {NOTE_C6,6}, {NOTE_E6,6},
59  {NOTE_C6,2},{NOTE_G5,2},{NOTE_E5,2}, {NOTE_G5,3},{NOTE_F5,1},{NOTE_D5,2}, {NOTE_C5,12}
60};
61
62// Deck the Halls (Do majör, 4/4) / (C major, 4/4)
63const Note DECK[] PROGMEM = {
64  {NOTE_G5,3},{NOTE_F5,1},{NOTE_E5,2},{NOTE_D5,2}, {NOTE_C5,2},{NOTE_D5,2},{NOTE_E5,2},{NOTE_C5,2},
65  {NOTE_D5,1},{NOTE_E5,1},{NOTE_F5,1},{NOTE_D5,1},{NOTE_E5,3},{NOTE_D5,1}, {NOTE_C5,2},{NOTE_B4,2},{NOTE_C5,4},
66  {NOTE_G5,3},{NOTE_F5,1},{NOTE_E5,2},{NOTE_D5,2}, {NOTE_C5,2},{NOTE_D5,2},{NOTE_E5,2},{NOTE_C5,2},
67  {NOTE_D5,1},{NOTE_E5,1},{NOTE_F5,1},{NOTE_D5,1},{NOTE_E5,3},{NOTE_D5,1}, {NOTE_C5,2},{NOTE_B4,2},{NOTE_C5,4},
68  {NOTE_D5,3},{NOTE_E5,1},{NOTE_F5,2},{NOTE_D5,2}, {NOTE_E5,3},{NOTE_F5,1},{NOTE_G5,2},{NOTE_D5,2},
69  {NOTE_E5,1},{NOTE_FS5,1},{NOTE_G5,2},{NOTE_A5,1},{NOTE_B5,1},{NOTE_C6,2}, {NOTE_B5,2},{NOTE_A5,2},{NOTE_G5,4},
70  {NOTE_G5,3},{NOTE_F5,1},{NOTE_E5,2},{NOTE_D5,2}, {NOTE_C5,2},{NOTE_D5,2},{NOTE_E5,2},{NOTE_C5,2},
71  {NOTE_A5,1},{NOTE_A5,1},{NOTE_A5,1},{NOTE_A5,1},{NOTE_G5,3},{NOTE_F5,1}, {NOTE_E5,2},{NOTE_D5,2},{NOTE_C5,4}
72};
73
74struct Song { const Note* notes; uint8_t count; uint16_t eighthMs; };
75const Song SONGS[] = {
76  {JINGLE,  sizeof(JINGLE)  / sizeof(Note), 250},   // 120 BPM
77  {WE_WISH, sizeof(WE_WISH) / sizeof(Note), 200},   // 150 BPM
78  {SILENT,  sizeof(SILENT)  / sizeof(Note), 400},   // 75 BPM
79  {DECK,    sizeof(DECK)    / sizeof(Note), 230}    // yaklaşık 130 BPM / about 130 BPM
80};
81const uint8_t SONG_COUNT = sizeof(SONGS) / sizeof(Song);
82const unsigned long SONG_GAP_MS = 1500;   // şarkılar arası sessizlik / silence between songs
83
84uint8_t song = 0;
85int noteIndex = -1;                       // -1: şarkı başlamadı / song not started
86unsigned long noteStart = 0;
87unsigned long noteLength = 0;
88bool lastButton = HIGH;
89unsigned long lastPress = 0;
90
91void ledsOff() {
92  digitalWrite(LED_PINS[0], LOW);
93  digitalWrite(LED_PINS[1], LOW);
94}
95
96void startNote() {
97  Note n;
98  memcpy_P(&n, &SONGS[song].notes[noteIndex], sizeof(Note));   // flash'tan oku / read from flash
99  noteLength = (unsigned long)n.len * SONGS[song].eighthMs;
100  if (n.freq != REST) {
101    tone(BUZZER_PIN, n.freq, noteLength * 9 / 10);              // %10 boşluk / 10% gap
102    digitalWrite(LED_PINS[noteIndex % 2], HIGH);                // LED'ler sırayla / LEDs alternate
103    digitalWrite(LED_PINS[(noteIndex + 1) % 2], LOW);
104  } else {
105    noTone(BUZZER_PIN);
106    ledsOff();
107  }
108  noteStart = millis();
109}
110
111void nextSong() {
112  noTone(BUZZER_PIN);
113  ledsOff();
114  song = (song + 1) % SONG_COUNT;
115  noteIndex = 0;
116  startNote();
117}
118
119void setup() {
120  pinMode(LED_PINS[0], OUTPUT);
121  pinMode(LED_PINS[1], OUTPUT);
122  pinMode(BUTTON_PIN, INPUT_PULLUP);      // buton GND'ye / button to GND
123  noteIndex = 0;
124  startNote();
125}
126
127void loop() {
128  unsigned long now = millis();
129
130  // Buton: düşen kenar + 250 ms kilit / button: falling edge + 250 ms lockout
131  bool button = digitalRead(BUTTON_PIN);
132  if (lastButton == HIGH && button == LOW && now - lastPress > 250) {
133    lastPress = now;
134    nextSong();
135  }
136  lastButton = button;
137
138  // Nota süresi doldu mu? / has the note finished?
139  if (now - noteStart >= noteLength) {
140    noteIndex++;
141    if (noteIndex < SONGS[song].count) {
142      startNote();
143    } else if (noteIndex == SONGS[song].count) {   // şarkı bitti: ara ver / song over: pause
144      ledsOff();
145      noteLength = SONG_GAP_MS;
146      noteStart = now;
147    } else {
148      nextSong();                                  // aradan sonra sıradaki şarkı / next song after the pause
149    }
150  }
151}

Das Herz des Codes ist die Zeitprüfung in loop(): Ist millis() − noteStart länger als die Note, startet die nächste Note; wenn nicht, läuft loop ohne Warten weiter. So wird der Taster bei jedem Durchlauf gelesen und kein Druck geht verloren; mit delay() würde der Taster während der 4,8 Sekunden langen Schlussnote von Stille Nacht gar nicht reagieren. memcpy_P() kopiert eine Note aus dem Flash in eine temporäre Variable im RAM. Endet ein Lied, ist noteIndex gleich der Notenzahl, und dieser Wert dient als "Pause"-Zustand; nach der Pause wird nextSong() aufgerufen. Der kompilierte Sketch belegt auf dem Uno etwa 3,9 KB Flash und 67 Byte RAM. Warum wir millis() statt delay() nehmen, erklärt der Beitrag millis und delay im Vergleich ausführlicher.

Um ein Lied eine Oktave höher zu spielen, multiplizierst du in der tone()-Zeile einfach die Frequenz mit 2: tone(BUZZER_PIN, n.freq * 2, ...). Passive Buzzer sind um 2–4 kHz am lautesten, daher wird der Klang mit dieser kleinen Änderung deutlich lauter; Lieder wie Stille Nacht, die ohnehin hoch steigen, können dadurch aber schrill werden.

Weihnachtslieder mit dem ESP32: eine Touch-Weihnachtskarte

Der Player-Sketch oben lässt sich auch auf dem ESP32 unverändert kompilieren: Der Block #if defined(ESP32) stellt die Pins automatisch auf GPIO 25, 26, 27 und 4 um. Die Versionen 2.x und 3.x des ESP32-Cores enthalten tone(), das im Hintergrund die LEDC-PWM-Einheit nutzt. Weil die ESP32-Pins 3,3 V liefern, klingt es etwas leiser als am Uno. Der kurze Sketch unten nutzt die Touch-Pins des ESP32: Berührst du einen Stern aus Alufolie an GPIO 32, spielt die erste Zeile von Jingle Bells und die LED leuchtet. Der Code misst beim Start den unberührten Wert und legt die Schwelle selbst fest; mehr über Touch-Pins steht in ESP32-Touch-Pins.

C++ (Arduino IDE)
1// ESP32 dokunmatik Noel kartı: folyo yıldıza dokununca Jingle Bells çalar
2// ESP32 touch Christmas card: touch the foil star and Jingle Bells plays
3const int BUZZER_PIN = 25;     // pasif buzzer / passive buzzer
4const int LED_PIN = 26;        // yıldızın LED'i / star LED
5const int TOUCH_PIN = 32;      // T9: folyoya giden kablo / T9: wire to the foil
6
7const int EIGHTH_MS = 250;
8const int melody[] = {659, 659, 659, 659, 659, 659, 659, 784, 523, 587, 659};   // E E E, E E E, E G C D E
9const byte beats[] = {2, 2, 4, 2, 2, 4, 2, 2, 3, 1, 8};
10int threshold = 0;
11
12void setup() {
13  Serial.begin(115200);
14  pinMode(LED_PIN, OUTPUT);
15  long sum = 0;
16  for (int i = 0; i < 20; i++) {           // dokunmadan ortalama al / average while untouched
17    sum += touchRead(TOUCH_PIN);
18    delay(20);
19  }
20  threshold = (sum / 20) * 7 / 10;         // eşik: ortalamanın %70'i / threshold: 70% of the average
21  Serial.printf("Esik / threshold: %d\n", threshold);
22}
23
24void loop() {
25  if (touchRead(TOUCH_PIN) < threshold) {  // dokununca değer düşer / the value drops when touched
26    digitalWrite(LED_PIN, HIGH);
27    for (int i = 0; i < 11; i++) {
28      int duration = beats[i] * EIGHTH_MS;
29      tone(BUZZER_PIN, melody[i], duration * 9 / 10);
30      delay(duration);
31    }
32    noTone(BUZZER_PIN);
33    digitalWrite(LED_PIN, LOW);
34    delay(1000);                           // art arda tetiklenmesin / avoid instant retrigger
35  }
36}

Weihnachtslieder mit dem Raspberry Pi Pico und MicroPython

Der Pico hat kein tone(), aber machine.PWM erledigt dasselbe: freq() setzt die Notenfrequenz und duty_u16(32768) einen Tastgrad von 50 %, der beim Buzzer den lautesten Klang ergibt. duty_u16(0) schaltet den Ton ab. Das Skript spielt zwei Lieder nacheinander; drückst du den Taster an GP2, bricht das aktuelle Lied ab und das nächste beginnt. Die anderen beiden Lieder kannst du im selben Format mit den Zahlen aus dem Arduino-Sketch ergänzen; Frequenzen und Längen sind identisch. Bist du neu bei MicroPython, schau dir zuerst die Thonny-Installation in Was ist der Raspberry Pi Pico? an.

MicroPython
1# Raspberry Pi Pico (MicroPython): Jingle Bells + We Wish You a Merry Christmas
2from machine import Pin, PWM
3import time
4
5buzzer = PWM(Pin(15))                 # pasif buzzer GP15 / passive buzzer on GP15
6leds = [Pin(14, Pin.OUT), Pin(13, Pin.OUT)]
7button = Pin(2, Pin.IN, Pin.PULL_UP)  # buton GP2 -> GND / button GP2 -> GND
8
9C5, D5, E5, F5, G5, A5, AS5 = 523, 587, 659, 698, 784, 880, 932
10
11JINGLE = [(E5,2),(E5,2),(E5,4),(E5,2),(E5,2),(E5,4),(E5,2),(G5,2),(C5,3),(D5,1),(E5,8),
12          (F5,2),(F5,2),(F5,3),(F5,1),(F5,2),(E5,2),(E5,2),(E5,1),(E5,1),
13          (E5,2),(D5,2),(D5,2),(E5,2),(D5,4),(G5,4),
14          (E5,2),(E5,2),(E5,4),(E5,2),(E5,2),(E5,4),(E5,2),(G5,2),(C5,3),(D5,1),(E5,8),
15          (F5,2),(F5,2),(F5,3),(F5,1),(F5,2),(E5,2),(E5,2),(E5,1),(E5,1),
16          (G5,2),(G5,2),(F5,2),(D5,2),(C5,8)]
17WE_WISH = [(C5,2),(F5,2),(F5,1),(G5,1),(F5,1),(E5,1),(D5,2),(D5,2),(D5,2),
18           (G5,2),(G5,1),(A5,1),(G5,1),(F5,1),(E5,2),(C5,2),(C5,2),
19           (A5,2),(A5,1),(AS5,1),(A5,1),(G5,1),(F5,2),(D5,2),(C5,1),(C5,1),
20           (D5,2),(G5,2),(E5,2),(F5,6)]
21SONGS = [(JINGLE, 250), (WE_WISH, 200)]   # (notalar, sekizlik ms) / (notes, eighth ms)
22
23def play(notes, eighth_ms):
24    for i, (freq, length) in enumerate(notes):
25        duration = length * eighth_ms
26        leds[i % 2].on()
27        leds[(i + 1) % 2].off()
28        if freq:
29            buzzer.freq(freq)
30            buzzer.duty_u16(32768)        # %50 doluluk = en yüksek ses / 50% duty = loudest
31        time.sleep_ms(duration * 9 // 10)
32        buzzer.duty_u16(0)                # %10 sessizlik / 10% silence
33        time.sleep_ms(duration // 10)
34        if button.value() == 0:           # basılırsa şarkıyı kes / stop the song on press
35            break
36    for led in leds:
37        led.off()
38
39song = 0
40while True:
41    play(*SONGS[song])
42    song = (song + 1) % len(SONGS)
43    time.sleep_ms(1500)

Lauter und schöner klingen lassen

  • Transistor und Lautsprecher: Führe vom Pin über einen 1-kΩ-Widerstand an die Basis eines NPN-Transistors (2N2222, BC337), schließe den Lautsprecher zwischen 5 V und Kollektor an und lege den Emitter auf GND. Ein kleiner 8-Ω-Lautsprecher klingt viel voller als ein Buzzer; ein 47–100-Ω-Vorwiderstand begrenzt den Strom.
  • Resonanzbereich: Kleine Piezo-Buzzer sind um 2–4 kHz am lautesten. Die Melodie eine Oktave höher zu legen, macht sie spürbar lauter, wenn auch nicht so stark wie ein Transistor.
  • Gehäuse-Effekt: Setzt du den Buzzer in eine Pappschachtel oder eine Christbaumkugel, mit dem Loch nach außen, wird der Klang ganz natürlich verstärkt.
  • Leiser machen: Für ein Projekt, das nachts läuft, schalte einen 100–470-Ω-Widerstand in Reihe zum Buzzer; die Lautstärke sinkt, die Melodie bleibt erhalten.
  • Nur eine Stimme: Auf dem Uno erzeugt tone() immer nur an einem Pin gleichzeitig Ton. Für Akkorde oder zweistimmige Musik passt ein MP3-Modul wie der DFPlayer Mini besser; die Optionen vergleichen wir in Arduino-Musikprojekte.

Häufige Fehler und Lösungen

ProblemUrsacheLösung
Immer derselbe PieptonAktiver Buzzer im EinsatzPassiven Buzzer einsetzen; an der Batterie sollte er knacken
Melodie unkenntlich, Noten verrutschtArrays melody und beats unterschiedlich langElementzahl angleichen und Takt für Takt prüfen
Gleiche Noten klingen wie ein langer TonKeine Pause zwischen den Notentone()-Dauer auf 90 % der Note setzen
LED an D3 oder D11 flackerttone() nutzt Timer2LED auf einen anderen Pin wie D6 oder D7 legen
Ein Druck überspringt mehrere LiederTasterprellenFallende Flanke erkennen und 250 ms sperren
'tone' was not declared auf dem ESP32Sehr alter ESP32-Core (1.x)Im Boardverwalter auf 2.x oder 3.x aktualisieren
Ton hört am Pico nach dem Lied nicht aufduty_u16(0) nicht aufgerufenNach jeder Note und am Ende duty_u16(0) aufrufen
Um ein eigenes Lied hinzuzufügen, schreib die Melodie zuerst Takt für Takt vom Notenblatt ab und prüfe die Achtelsumme jedes Takts: Ein 4/4-Takt muss 8 Achtel ergeben, ein 3/4-Takt 6. Stimmt die Summe nicht, fehlt eine Note oder ihre Länge ist falsch; so findest du den Fehler viel schneller als nach Gehör.

Projektideen mit Weihnachtsliedern

  • Weihnachtsmann-Detektor: Sieht ein PIR-Sensor vor dem Kamin eine Bewegung, spielt Jingle Bells; den Aufbau findest du im Weihnachtsmann-Detektor.
  • Musikalischer Weihnachtsbaum: Lass die Farben eines WS2812B-Streifens im Takt der Noten wechseln; für den Baum selbst siehe Weihnachtsbaum-Beleuchtung.
  • Mitternachtsmelodie: Spiel We Wish You a Merry Christmas, wenn der Silvester-Countdown null erreicht.
  • Türklingel: Spiel im ganzen Dezember beim Druck auf die Klingel statt des üblichen Ding-Dong die erste Zeile von Deck the Halls.
  • Taster-Klavier: Spiel diese Noten selbst mit acht Tastern; Schaltung und Code stehen in Arduino-Klavier. Weitere saisonale Ideen findest du in der Liste Arduino-Weihnachtsprojekte.

Wenn du deine erste Melodie auf einem Buzzer spielen willst: Die kostenlosen Buzzer-Projekte in der BlueGrays-App führen dich vom ersten Piepton über die Frequenzsteuerung bis zu einer vollständigen Hymnen-Melodie, jeweils mit Schaltplan, Schritt-für-Schritt-Verdrahtung und fertigem Code. Mit den Gewohnheiten, die du dort lernst, baust du die vier Weihnachtslieder aus diesem Beitrag leicht in deine eigene Spieluhr oder Weihnachtskarte ein.

Häufige Fragen

Wie spielt man Jingle Bells mit dem Arduino?

Verbinde das +-Bein des passiven Buzzers mit D8 und das andere mit GND, schreib die Notenfrequenzen in ein Array und ihre Längen in ein zweites. In der Schleife rufst du für jede Note tone(8, frequenz, dauer) auf und wartest mit delay(dauer). Der Refrain beginnt mit E E E, E E E, E G C D E, und bei 120 BPM dauert eine Achtel 250 ms.

Kann ein aktiver Buzzer Weihnachtslieder spielen?

Nein. Ein aktiver Buzzer hat einen Oszillator mit fester Frequenz eingebaut und piept immer im selben Ton, egal was du sendest. Für Melodien brauchst du einen passiven Buzzer, eine Piezoscheibe oder einen kleinen Lautsprecher mit Transistor.

Wie funktioniert die Arduino-Funktion tone()?

tone(pin, frequenz) erzeugt am Pin ein Rechtecksignal mit 50 % Tastgrad und spielt, bis noTone(pin) aufgerufen wird. Übergibst du als dritten Parameter Millisekunden, endet der Ton nach dieser Zeit von selbst. Auf dem Uno nutzt tone() den Timer2, daher funktioniert PWM an D3 und D11 währenddessen nicht.

Wie macht man einen Buzzer lauter?

Am wirksamsten ist es, über einen 1-kΩ-Widerstand einen NPN-Transistor anzusteuern und über ihn einen kleinen Lautsprecher aus 5 V zu speisen. Ohne Transistor hilft es auch, die Melodie eine Oktave höher zu legen, weil Piezo-Buzzer um 2–4 kHz am lautesten sind. Ein geschlossenes Gehäuse wie eine Schachtel verstärkt den Klang zusätzlich.

Kann der Arduino etwas anderes tun, während ein Lied läuft?

Solange eine mit delay() geschriebene Melodie spielt, kann der Arduino nichts anderes tun. Prüfst du das Ende jeder Note mit millis(), kehrt loop() ohne Warten zurück; Taster lesen, LEDs schalten oder Sensoren messen funktioniert dann auch während des Liedes.

Gibt es tone() auf dem Raspberry Pi Pico?

In MicroPython gibt es kein tone(), aber machine.PWM erledigt dasselbe. An einem PWM(Pin(15))-Objekt setzt du mit freq(frequenz) die Note und mit duty_u16(32768) 50 % Tastgrad; duty_u16(0) schaltet den Ton ab. Die Notenfrequenzen sind genau dieselben wie beim Arduino.

Alle Projekte ansehen
Verwendung des Summers
#13Anfänger

Verwendung des Summers

Hast du dich mal gefragt, wie eine Türklingel oder ein Alarm seinen Ton erzeugt? Der Arduino lässt einen kleinen Summer in kurzen Abständen piepen: piep, Pause, piep, Pause. Du siehst, wie Strom zu Kl

4.7(89)
162
Frequenzeinstellung mit Buzzer
#14Mittel

Frequenzeinstellung mit Buzzer

Mit vier Knöpfen steuerst du den Ton eines Summers: Einer startet den Ton, einer macht ihn stumm, die anderen beiden machen ihn höher oder tiefer. Hältst du den Plus- oder Minusknopf gedrückt, ändert

4.6(69)
119
Türkische Nationalhymne mit Summer
#15Mittel

Türkische Nationalhymne mit Summer

Drückst du den Knopf, spielt ein kleiner Summer die türkische Nationalhymne, Note für Note. Der Arduino spielt jede Note in der richtigen Höhe und Länge, trägt zwei Strophen der Hymne von Anfang bis E

4.8(107)
217
Melodien abspielen mit IR-Fernbedienung und Summer
#18Anfänger
Premium

Melodien abspielen mit IR-Fernbedienung und Summer

Bau eine Spieluhr, die mit den Tasten einer Fernbedienung Melodien spielt. Ein Infrarotempfänger fängt das Signal der Fernbedienung auf; eine Taste spielt über den Summer eine flotte Videospielmelodie

4.8(57)
74
Einfaches Klavier mit Summer und Taste
#26Fortgeschritten
Premium

Einfaches Klavier mit Summer und Taste

Bau dir mit acht Tastern dein eigenes kleines Klavier. Jeder Taster ist ein Ton, von tief nach hoch: do, re, mi, fa, so, la, ti und das hohe do. Solange du drückst, erklingt der Ton aus dem Summer, be

4.9(66)
88
ESP32 Melodie-Wiedergabe mit Buzzer
#114Anfänger
Premium

ESP32 Melodie-Wiedergabe mit Buzzer

Spielen einer einfachen Melodie (Twinkle Twinkle Little Star) mit einem passiven Buzzer. Wir spielen die Noten mit den Funktionen tone() und noTone() wie in Arduino - die gleiche Syntax funktioniert mit ESP32 Arduino Core 3.0+. Es muss ein passiver Buzzer verwendet werden (ein aktiver Buzzer spielt keine Melodie).

4.8(30)
55
Arduino Reaktionstest mit Tonsignal: Miss deine Reflexe in Millisekunden (LCD + Buzzer + 3 LEDs)
#97Mittel
Premium

Arduino Reaktionstest mit Tonsignal: Miss deine Reflexe in Millisekunden (LCD + Buzzer + 3 LEDs)

Wie schnell sind deine Reflexe? Drück den Taster: Die rote LED heißt Auf die Plätze, die gelbe Fertig, dann beginnt eine zufällige Wartezeit von 1,5 bis 3,5 Sekunden. Sobald die grüne LED leuchtet und der Buzzer piept, drückst du erneut; deine Reaktionszeit erscheint in Millisekunden auf dem I2C-LCD, darunter Sitzungsrekord und Durchschnitt. Wer vor Grün drückt, sieht TOO EARLY! und hört einen Verliererton. Gedrückt halten startet einen neuen Spieler mit derselben Wartefolge.

4.6(33)
50