Kode Jingle Bells Arduino: 4 Lagu Natal untuk Buzzer
Kode Arduino Jingle Bells, We Wish You a Merry Christmas, Silent Night, dan Deck the Halls dengan buzzer pasif. Lengkap dengan tabel nada, tempo, dan pemutar LED berbasis millis.
Untuk memainkan Jingle Bells di Arduino, kamu cuma butuh buzzer pasif dan fungsi tone(): kamu menulis frekuensi dan durasi setiap nada ke dalam array, lalu Arduino mengirimkannya ke buzzer satu per satu. Di artikel ini kamu akan menemukan array nada dan durasi yang akurat untuk Jingle Bells, We Wish You a Merry Christmas, Silent Night, dan Deck the Halls, diambil dari partitur, bukan ditebak dengan telinga. Keempat melodi ini adalah lagu tradisional yang usianya jauh lebih dari seratus tahun, jadi kamu bisa memakainya di proyek apa pun tanpa khawatir soal hak cipta.
Kita mulai dengan sketch pendek untuk satu lagu, lalu lanjut ke kotak musik yang memainkan keempat lagu bergantian, menyalakan dua LED mengikuti nada, dan berganti lagu dengan tombol. Sketch kedua itu memakai millis(), bukan delay(), jadi selama lagu diputar board tetap bisa mengurus pekerjaan lain seperti tombol, sensor, atau LED strip. Di bagian akhir, melodi yang sama kita pindahkan ke kartu Natal sentuh dengan ESP32 dan ke MicroPython di Raspberry Pi Pico.

Buzzer mana yang kamu butuhkan: aktif atau pasif?
Buzzer aktif punya osilator sendiri di dalamnya; beri 5 V dan ia selalu berbunyi dengan nada yang sama, jadi tidak bisa memainkan melodi. Buzzer pasif bekerja seperti speaker mungil: ia berbunyi pada frekuensi berapa pun pin Arduino menyala dan mati. Cara mudah membedakannya adalah menempelkan buzzer sebentar ke baterai 3–5 V: bunyi bip terus-menerus berarti aktif, satu bunyi klik berarti pasif. Model aktif biasanya punya stiker putih dan bagian bawahnya tertutup, sedangkan model pasif memperlihatkan papan sirkuit hijau di bawahnya. Untuk detailnya, lihat Apa Itu Buzzer?.
| Fitur | Buzzer aktif | Buzzer pasif |
|---|---|---|
| Osilator internal | Ada | Tidak ada |
| Bisa memainkan melodi? | Tidak, hanya satu nada | Ya, nada apa pun dengan tone() |
| Perintah pengendali | digitalWrite() | tone(pin, frekuensi, durasi) |
| Ditempelkan ke baterai | Bip terus-menerus | Satu klik |
| Rentang paling keras | Tetap (biasanya 2–2,5 kHz) | Sekitar 2–4 kHz (resonansi) |
Pengkabelan: buzzer, dua LED, dan tombol
| Komponen | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Buzzer pasif + | D8 | GPIO 25 | GP15 |
| Buzzer pasif − | GND | GND | GND |
| LED 1 (dengan 220 Ω) | D6 | GPIO 26 | GP14 |
| LED 2 (dengan 220 Ω) | D7 | GPIO 27 | GP13 |
| Tombol (kaki lainnya ke GND) | D2 | GPIO 4 | GP2 |
| Foil sentuh | - | GPIO 32 (T9) | - |
Frekuensi nada: 14 nada yang dipakai di lagu-lagu Natal ini
Dalam musik Barat, setiap oktaf dibagi menjadi 12 semitone, dan naik satu semitone berarti mengalikan frekuensi dengan akar pangkat 12 dari 2, sekitar 1,0595. Nada acuan A4 adalah 440 Hz; nada dengan nomor MIDI n punya frekuensi f = 440 × 2^((n − 69) / 12). Misalnya C5 adalah MIDI 72: 440 × 2^(3/12) = 523,25 Hz. Naik satu oktaf tepat menggandakan frekuensi, karena itu C6 adalah 1047 Hz. Buzzer pasif kecil terdengar lemah di bawah 500 Hz, jadi keempat lagu kami pindahkan ke oktaf ke-5 dan ke-6; tabel ini memuat semua nada yang dipakai kode.
| Nada | Solmisasi | Frekuensi (Hz) | Konstanta kode |
|---|---|---|---|
| B4 | Si | 494 | NOTE_B4 |
| C5 | Do | 523 | NOTE_C5 |
| D5 | Re | 587 | NOTE_D5 |
| E5 | Mi | 659 | NOTE_E5 |
| F5 | Fa | 698 | NOTE_F5 |
| F#5 | Fa kres (Fis) | 740 | NOTE_FS5 |
| G5 | Sol | 784 | NOTE_G5 |
| A5 | La | 880 | NOTE_A5 |
| A#5 / Bb5 | Si mol (Bes) | 932 | NOTE_AS5 |
| B5 | Si | 988 | NOTE_B5 |
| C6 | Do | 1047 | NOTE_C6 |
| D6 | Re | 1175 | NOTE_D6 |
| E6 | Mi | 1319 | NOTE_E6 |
| F6 | Fa | 1397 | NOTE_F6 |
Tempo dan durasi nada
Daripada menulis setiap durasi dalam milidetik, kami memakai nada terpendek, yaitu nada seperdelapan, sebagai satuan: 1 adalah seperdelapan, 2 seperempat, 3 seperempat bertitik, 4 setengah, 6 setengah bertitik, dan 8 nada penuh. Tempo adalah jumlah nada seperempat per menit (BPM); satu nada seperempat berlangsung 60000 / BPM milidetik dan seperdelapan setengahnya. Pada 120 BPM, seperempat sama dengan 500 ms dan seperdelapan 250 ms. Untuk mengubah kecepatan lagu, kamu cukup mengubah durasi seperdelapan dan biarkan array-nya apa adanya. Setiap nada berbunyi selama 90% durasinya dan 10% sisanya hening, jadi nada yang berulang (seperti tiga nada E di Jingle Bells) tidak menyatu menjadi satu bunyi panjang.
| Lagu | Birama | Tempo | Seperdelapan (ms) | Seperempat (ms) | Jumlah nada |
|---|---|---|---|---|---|
| Jingle Bells (reff) | 4/4 | 120 BPM | 250 | 500 | 51 |
| We Wish You a Merry Christmas | 3/4 | 150 BPM | 200 | 400 | 30 |
| Silent Night | 3/4 | 75 BPM | 400 | 800 | 46 |
| Deck the Halls | 4/4 | sekitar 130 BPM | 230 | 460 | 68 |
Sketch pertama: reff Jingle Bells
- Sambungkan kaki + buzzer pasif ke D8 dan kaki lainnya ke GND.
- Buka Arduino IDE, tempel kode di bawah, lalu pilih Arduino Uno sebagai board.
- Upload kodenya; reff langsung diputar sekali begitu board menyala. Tekan tombol reset untuk mendengarnya lagi.
- Kalau terdengar terlalu lambat atau terlalu cepat, ubah EIGHTH_MS: 200 lebih cepat, 300 lebih lambat.
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}Sketch ini menyimpan dua array paralel: melody berisi frekuensi nada dan beats berisi durasi setiap nada dalam satuan seperdelapan, dengan urutan yang sama. Untuk setiap nada, perulangan memulai bunyi dengan tone() lalu menunggu sepanjang durasi penuh nada itu dengan delay(). Kalau tone() diberi durasi sebagai argumen ketiga, ia menghentikan bunyi sendiri; karena kita memberi 90% dari durasi nada, ada jeda napas singkat di antara nada. Kedua array harus punya jumlah elemen yang sama; kalau kamu menambah nada di satu array tapi lupa menambah durasi di array lainnya, melodinya bergeser dan isi memori acak setelah ujung array ikut dimainkan. Spasi di dalam array sejajar dengan garis birama, jadi mudah membandingkan nada-nadanya dengan partitur.
Array nada untuk keempat lagu
Tabel di bawah menunjukkan nada dasar setiap lagu dan nada-nada di baris pertamanya; berguna ketika kamu mengecek kode dengan telinga. Tanda pisah (–) adalah garis birama dan titik (.) adalah nada bertitik. We Wish You a Merry Christmas dimulai dengan birama gantung (anacrusis): C5 pertama adalah satu nada seperempat sebelum birama pertama. Silent Night lambat dan lebar, jadi C5 terakhir kami tahan selama 12 seperdelapan, dua birama penuh. Satu-satunya nada kres di Deck the Halls adalah F sharp (F#5) di rangkaian naik “fa-la-la”.
| Lagu | Nada dasar | Nada baris pertama | Perhatikan |
|---|---|---|---|
| Jingle Bells | C mayor | Mi Mi Mi – Mi Mi Mi – Mi Sol Do. Re – Mi | Seperempat bertitik + seperdelapan di bagian “all the way” |
| We Wish You a Merry Christmas | F mayor | Do – Fa Fa Sol Fa Mi – Re Re Re | Birama 3/4, memakai B flat (A#5) |
| Silent Night | C mayor (satu oktaf lebih tinggi) | Sol. La Sol – Mi – Sol. La Sol – Mi | Tempo lambat, nada setengah bertitik |
| Deck the Halls | C mayor | Sol. Fa Mi Re – Do Re Mi Do | Seperdelapan di “fa-la-la”, F sharp (F#5) |
Pemutar lagu Natal berbasis millis dengan LED (4 lagu + tombol)
Sekarang keempat lagu kita satukan dalam satu sketch. Nada disimpan dalam struct Note berupa pasangan {frekuensi, durasi} dan disimpan di memori flash dengan PROGMEM; Uno hanya punya RAM 2 KB, jadi membaca 195 nada dari flash alih-alih menyimpannya di RAM adalah kebiasaan yang baik. LED bertukar di setiap nada, tombol di D2 memakai pull-up internal, dan sekali tekan langsung pindah ke lagu berikutnya. Ketika satu lagu selesai, ada hening 1,5 detik sebelum lagu berikutnya dimulai.
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}Inti kodenya adalah pengecekan waktu di dalam loop(): kalau millis() − noteStart sudah melewati durasi nada, nada berikutnya dimulai; kalau belum, loop jalan terus tanpa menunggu. Dengan begitu tombol dibaca di setiap putaran dan tidak ada tekanan yang terlewat; dengan delay(), tombol sama sekali tidak bereaksi selama nada terakhir Silent Night yang panjangnya 4,8 detik. memcpy_P() menyalin satu nada dari flash ke variabel sementara di RAM. Ketika lagu selesai, noteIndex sama dengan jumlah nada dan nilai itu dipakai sebagai status “jeda”; begitu jeda selesai, nextSong() dipanggil. Sketch yang sudah dikompilasi memakai sekitar 3,9 KB flash dan 67 byte RAM di Uno. Untuk tahu lebih jauh kenapa kami memilih millis() dibanding delay(), baca millis() vs delay().
Lagu Natal di ESP32: kartu Natal sentuh
Sketch pemutar di atas juga bisa dikompilasi tanpa perubahan di ESP32: blok #if defined(ESP32) otomatis mengganti pin ke GPIO 25, 26, 27, dan 4. Core ESP32 versi 2.x dan 3.x sudah menyertakan tone(), yang di balik layar memakai unit PWM LEDC. Karena pin ESP32 mengeluarkan 3,3 V, suaranya sedikit lebih pelan dibanding di Uno. Sketch pendek di bawah memakai pin sentuh ESP32: sentuh bintang dari aluminium foil yang tersambung ke GPIO 32, maka baris pertama Jingle Bells diputar dan LED menyala. Kode mengukur nilai tanpa sentuhan ketika mulai menyala dan menentukan ambangnya sendiri; info lebih lanjut soal pin sentuh ada di pin sentuh ESP32.
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}Lagu Natal di Raspberry Pi Pico dengan MicroPython
Pico tidak punya tone(), tapi machine.PWM melakukan pekerjaan yang sama: freq() mengatur frekuensi nada dan duty_u16(32768) mengatur duty cycle 50%, yang memberi suara paling keras pada buzzer. duty_u16(0) membuatnya diam. Script ini memainkan dua lagu bergantian; tekan tombol di GP2 dan lagu yang sedang diputar berhenti lalu lagu berikutnya dimulai. Kamu bisa menambahkan dua lagu lainnya dengan format yang sama memakai angka dari sketch Arduino; frekuensi dan durasinya persis sama. Kalau kamu baru mengenal MicroPython, mulai dengan instalasi Thonny di Apa Itu Raspberry Pi Pico?.
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)Membuat suara lebih keras dan lebih enak didengar
- Transistor dan speaker: Dari pin, lewat resistor 1 kΩ ke basis transistor NPN (2N2222, BC337), sambungkan speaker di antara 5 V dan kolektor, lalu emitor ke GND. Speaker kecil 8 Ω terdengar jauh lebih penuh daripada buzzer; resistor seri 47–100 Ω membatasi arusnya.
- Rentang resonansi: Buzzer piezo kecil paling keras di sekitar 2–4 kHz. Menaikkan melodi satu oktaf membuatnya jelas lebih keras, meski tidak sebanyak kalau memakai transistor.
- Efek wadah: Menaruh buzzer di dalam kotak kardus atau bola hiasan Natal, dengan lubangnya menghadap ke luar, secara alami memperkuat suaranya.
- Supaya lebih pelan: Untuk proyek yang berjalan di malam hari, tambahkan resistor 100–470 Ω seri dengan buzzer; volumenya turun dan melodinya tetap utuh.
- Hanya satu suara: Di Uno, tone() hanya menghasilkan bunyi di satu pin dalam satu waktu. Untuk akor atau musik dua suara, modul MP3 seperti DFPlayer Mini lebih cocok; pilihan-pilihannya kami bandingkan di proyek musik Arduino.
Masalah umum dan solusinya
| Masalah | Penyebab | Solusi |
|---|---|---|
| Bunyinya selalu bip yang sama | Kamu memakai buzzer aktif | Pasang buzzer pasif; ketika ditempelkan ke baterai harus berbunyi klik |
| Melodi tidak dikenali, nadanya bergeser | Panjang array melody dan beats berbeda | Samakan jumlah elemennya dan cek per birama |
| Nada berulang terdengar seperti satu bunyi panjang | Tidak ada hening di antara nada | Buat durasi tone() 90% dari durasi nada |
| LED di D3 atau D11 berkedip | tone() memakai Timer2 | Pindahkan LED ke pin lain seperti D6 atau D7 |
| Sekali tekan melompati beberapa lagu | Pantulan kontak tombol (bounce) | Tangkap tepi turun dan tambahkan kunci 250 ms |
| “'tone' was not declared” di ESP32 | Core ESP32 yang sangat lama (1.x) | Perbarui ke 2.x atau 3.x lewat Boards Manager |
| Di Pico, bunyi tidak berhenti setelah lagu selesai | duty_u16(0) tidak dipanggil | Panggil duty_u16(0) setelah setiap nada dan di akhir |
Ide proyek dengan lagu Natal
- Detektor Sinterklas: Ketika sensor PIR melihat gerakan di depan perapian, mainkan Jingle Bells; cara membuatnya ada di detektor Sinterklas.
- Pohon Natal bermusik: Ubah warna LED strip WS2812B mengikuti nada selama lagu diputar; untuk pohonnya sendiri, lihat LED pohon Natal.
- Melodi tengah malam: Mainkan We Wish You a Merry Christmas ketika penghitung mundur Tahun Baru mencapai nol.
- Bel pintu: Sepanjang Desember, mainkan baris pertama Deck the Halls sebagai ganti ding-dong biasa ketika tombol bel pintu ditekan.
- Piano tombol: Mainkan sendiri nada-nada ini dengan delapan tombol; rangkaian dan kodenya ada di piano Arduino. Untuk ide musiman lainnya, lihat daftar proyek Natal Arduino.
Kalau kamu ingin memainkan melodi pertamamu dengan buzzer, proyek buzzer gratis di aplikasi BlueGrays membawamu dari bip pertama ke pengaturan frekuensi sampai melodi lagu kebangsaan yang lengkap; masing-masing dilengkapi skema rangkaian, pengkabelan langkah demi langkah, dan kode siap pakai. Dengan kebiasaan yang kamu dapat dari sana, kamu bisa dengan mudah menambahkan empat lagu Natal dari artikel ini ke kotak musik atau kartu Natalmu sendiri.
Pertanyaan umum
Bagaimana cara memainkan Jingle Bells di Arduino?
Sambungkan kaki + buzzer pasif ke D8 dan kaki lainnya ke GND, lalu tulis frekuensi nada ke satu array dan durasinya ke array lain. Di dalam loop, panggil tone(8, frekuensi, durasi) untuk setiap nada dan tunggu dengan delay(durasi). Reff-nya dimulai dengan E E E, E E E, E G C D E (Mi Mi Mi, Mi Mi Mi, Mi Sol Do Re Mi), dan pada 120 BPM satu nada seperdelapan berlangsung 250 ms.
Apakah buzzer aktif bisa memainkan lagu Natal?
Tidak. Buzzer aktif punya osilator berfrekuensi tetap di dalamnya dan berbunyi dengan nada yang sama apa pun yang kamu kirim. Untuk melodi, kamu butuh buzzer pasif, piezo disk, atau speaker kecil yang dikendalikan lewat transistor.
Bagaimana cara memakai fungsi tone() di Arduino?
tone(pin, frekuensi) menghasilkan gelombang kotak dengan duty 50% di pin itu dan terus berbunyi sampai noTone(pin) dipanggil. Kalau kamu memberi milidetik sebagai argumen ketiga, bunyinya berhenti sendiri di akhir durasi itu. Di Uno, tone() memakai Timer2, jadi PWM di D3 dan D11 tidak berfungsi selama tone() berbunyi.
Bagaimana cara membuat buzzer lebih keras?
Cara paling efektif adalah mengendalikan transistor NPN dari pin lewat resistor 1 kΩ dan memberi daya speaker kecil dari 5 V lewat transistor itu. Tanpa transistor, menaikkan melodi satu oktaf juga membantu, karena buzzer piezo paling keras di sekitar 2–4 kHz. Menaruh buzzer di ruang tertutup seperti kotak juga memperkuat suaranya.
Apakah Arduino bisa mengerjakan hal lain selama lagu diputar?
Selama melodi yang ditulis dengan delay() diputar, Arduino tidak bisa melakukan hal lain. Kalau kamu mengecek kapan setiap nada berakhir dengan millis(), loop() kembali tanpa menunggu, jadi membaca tombol, menyalakan LED, atau membaca sensor tetap berjalan selama lagu berlanjut.
Apakah Raspberry Pi Pico punya tone()?
MicroPython tidak punya tone(), tapi machine.PWM melakukan pekerjaan yang sama. Pada objek PWM(Pin(15)), kamu mengatur nada dengan freq(frekuensi) dan duty cycle 50% dengan duty_u16(32768); duty_u16(0) membuatnya diam. Frekuensi nadanya persis sama dengan di Arduino.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Menggunakan Buzzer
Pernah penasaran bagaimana bel pintu atau alarm mengeluarkan suaranya? Arduino membuat buzzer kecil berbunyi bip dengan jeda singkat: bip, jeda, bip, jeda. Kamu melihat bagaimana suara dibuat dengan l

Mengatur Frekuensi Buzzer
Kamu mengendalikan suara buzzer dengan empat tombol: satu memulai suara, satu membungkamnya, dan dua lainnya membuatnya lebih tinggi atau lebih rendah. Tahan tombol naik atau turun dan nadanya berubah

Lagu Kebangsaan Turki dengan Buzzer
Tekan tombol dan buzzer kecil mulai memainkan Lagu Kebangsaan Turki, nada demi nada. Arduino memainkan setiap nada dengan tinggi dan panjang yang tepat, membawakan dua bait lagu kebangsaan dari awal s

Memainkan Melodi dengan Remote IR dan Buzzer
Buat kotak musik yang memainkan lagu dengan tombol remote TV. Penerima inframerah menangkap sinyal remote; satu tombol memainkan lagu video game yang ceria lewat buzzer, tombol lain lagu anak-anak yan

Piano Sederhana dengan Buzzer dan Tombol
Buat piano kecilmu sendiri dengan delapan tombol. Setiap tombol adalah satu nada, dari rendah ke tinggi: do, re, mi, fa, sol, la, si, dan do tinggi. Nada dimainkan lewat buzzer selama tombol ditahan d

Memutar Melodi dengan Buzzer ESP32
Memainkan melodi sederhana (Twinkle Twinkle Little Star) dengan buzzer pasif. Kita memainkan nada dengan fungsi tone() dan noTone() seperti di Arduino; ESP32 bekerja dengan sintaks yang sama di Arduino Core 3.0+. Harus memakai buzzer pasif (buzzer aktif tidak bisa memainkan melodi).

Tes Waktu Reaksi Arduino dengan Isyarat Suara: Ukur Refleksmu dalam Milidetik (LCD + Buzzer + 3 LED)
Seberapa cepat refleksmu? Tekan tombol: LED merah berkata bersiap, LED kuning berkata siap, dan jeda acak 1,5 sampai 3,5 detik dimulai. Begitu LED hijau menyala dan buzzer berbunyi bip, tekan lagi; waktu reaksimu muncul di LCD I2C dalam milidetik, dengan rekor terbaik dan rata-rata sesimu di bawahnya. Tekan sebelum hijau dan layar menampilkan TOO EARLY! dengan suara kalah. Tahan tombol untuk pemain baru, agar semua orang beradu dengan urutan jeda yang sama.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

