Panduan · 8 mnt baca

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 pasif untuk lagu Natal Arduino
Buzzer pasif memainkan frekuensi apa pun yang diberikan tone(), karena itu buzzer ini pilihan yang tepat untuk melodi.

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?.

FiturBuzzer aktifBuzzer pasif
Osilator internalAdaTidak ada
Bisa memainkan melodi?Tidak, hanya satu nadaYa, nada apa pun dengan tone()
Perintah pengendalidigitalWrite()tone(pin, frekuensi, durasi)
Ditempelkan ke bateraiBip terus-menerusSatu klik
Rentang paling kerasTetap (biasanya 2–2,5 kHz)Sekitar 2–4 kHz (resonansi)

Pengkabelan: buzzer, dua LED, dan tombol

KomponenArduino UnoESP32Raspberry Pi Pico
Buzzer pasif +D8GPIO 25GP15
Buzzer pasif −GNDGNDGND
LED 1 (dengan 220 Ω)D6GPIO 26GP14
LED 2 (dengan 220 Ω)D7GPIO 27GP13
Tombol (kaki lainnya ke GND)D2GPIO 4GP2
Foil sentuh-GPIO 32 (T9)-
Di Uno, tone() memakai Timer2, jadi selama lagu diputar analogWrite() tidak berfungsi di D3 dan D11. Kalau kamu memasang LED di pin itu dan mencoba mengatur kecerahannya, kamu akan melihat kedipan atau tidak ada cahaya sama sekali. Menyambungkan buzzer langsung ke pin tidak masalah, tapi jangan pernah menyambungkan speaker 8 Ω langsung ke pin; pakai rangkaian transistor di bagian tentang membuat suara lebih keras di bawah.

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.

NadaSolmisasiFrekuensi (Hz)Konstanta kode
B4Si494NOTE_B4
C5Do523NOTE_C5
D5Re587NOTE_D5
E5Mi659NOTE_E5
F5Fa698NOTE_F5
F#5Fa kres (Fis)740NOTE_FS5
G5Sol784NOTE_G5
A5La880NOTE_A5
A#5 / Bb5Si mol (Bes)932NOTE_AS5
B5Si988NOTE_B5
C6Do1047NOTE_C6
D6Re1175NOTE_D6
E6Mi1319NOTE_E6
F6Fa1397NOTE_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.

LaguBiramaTempoSeperdelapan (ms)Seperempat (ms)Jumlah nada
Jingle Bells (reff)4/4120 BPM25050051
We Wish You a Merry Christmas3/4150 BPM20040030
Silent Night3/475 BPM40080046
Deck the Halls4/4sekitar 130 BPM23046068

Sketch pertama: reff Jingle Bells

  1. Sambungkan kaki + buzzer pasif ke D8 dan kaki lainnya ke GND.
  2. Buka Arduino IDE, tempel kode di bawah, lalu pilih Arduino Uno sebagai board.
  3. Upload kodenya; reff langsung diputar sekali begitu board menyala. Tekan tombol reset untuk mendengarnya lagi.
  4. Kalau terdengar terlalu lambat atau terlalu cepat, ubah EIGHTH_MS: 200 lebih cepat, 300 lebih lambat.
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}

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”.

LaguNada dasarNada baris pertamaPerhatikan
Jingle BellsC mayorMi Mi Mi – Mi Mi Mi – Mi Sol Do. Re – MiSeperempat bertitik + seperdelapan di bagian “all the way”
We Wish You a Merry ChristmasF mayorDo – Fa Fa Sol Fa Mi – Re Re ReBirama 3/4, memakai B flat (A#5)
Silent NightC mayor (satu oktaf lebih tinggi)Sol. La Sol – Mi – Sol. La Sol – MiTempo lambat, nada setengah bertitik
Deck the HallsC mayorSol. Fa Mi Re – Do Re Mi DoSeperdelapan 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.

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}

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().

Untuk menaikkan lagu satu oktaf, cukup kalikan frekuensinya dengan 2 di baris tone(): tone(BUZZER_PIN, n.freq * 2, ...). Buzzer pasif paling keras di sekitar 2–4 kHz, jadi perubahan kecil ini membuat suaranya jelas lebih keras; tapi lagu yang memang sudah naik tinggi, seperti Silent Night, bisa jadi melengking dan menusuk telinga.

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.

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}

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?.

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)

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

MasalahPenyebabSolusi
Bunyinya selalu bip yang samaKamu memakai buzzer aktifPasang buzzer pasif; ketika ditempelkan ke baterai harus berbunyi klik
Melodi tidak dikenali, nadanya bergeserPanjang array melody dan beats berbedaSamakan jumlah elemennya dan cek per birama
Nada berulang terdengar seperti satu bunyi panjangTidak ada hening di antara nadaBuat durasi tone() 90% dari durasi nada
LED di D3 atau D11 berkediptone() memakai Timer2Pindahkan LED ke pin lain seperti D6 atau D7
Sekali tekan melompati beberapa laguPantulan kontak tombol (bounce)Tangkap tepi turun dan tambahkan kunci 250 ms
“'tone' was not declared” di ESP32Core ESP32 yang sangat lama (1.x)Perbarui ke 2.x atau 3.x lewat Boards Manager
Di Pico, bunyi tidak berhenti setelah lagu selesaiduty_u16(0) tidak dipanggilPanggil duty_u16(0) setelah setiap nada dan di akhir
Untuk menambahkan lagumu sendiri, tulis dulu melodinya per birama dari partitur dan cek total seperdelapan di setiap birama: birama 4/4 harus berjumlah 8 seperdelapan dan birama 3/4 berjumlah 6. Kalau totalnya tidak cocok, ada nada yang hilang atau durasinya salah; kamu akan menemukannya jauh lebih cepat daripada mencari dengan telinga.

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.

Lihat semua proyek
Menggunakan Buzzer
#13Pemula

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

4.7(89)
162
Mengatur Frekuensi Buzzer
#14Menengah

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

4.6(69)
119
Lagu Kebangsaan Turki dengan Buzzer
#15Menengah

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

4.8(108)
218
Memainkan Melodi dengan Remote IR dan Buzzer
#18Pemula
Premium

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

4.8(57)
74
Piano Sederhana dengan Buzzer dan Tombol
#26Mahir
Premium

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

4.9(66)
88
Memutar Melodi dengan Buzzer ESP32
#114Pemula
Premium

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).

4.8(30)
55
Tes Waktu Reaksi Arduino dengan Isyarat Suara: Ukur Refleksmu dalam Milidetik (LCD + Buzzer + 3 LED)
#97Menengah
Premium

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.

4.6(33)
50