Arduino Noel Şarkısı: Buzzer ile Jingle Bells ve 3 Melodi Kodu
Arduino Noel şarkısı kodu: pasif buzzer ile Jingle Bells, We Wish You a Merry Christmas, Silent Night ve Deck the Halls. Nota tablosu, tempo, LED'li çalar.
Arduino Noel şarkısı çalmak için tek ihtiyacın bir pasif buzzer ve tone() fonksiyonu: her notanın frekansını ve süresini bir diziye yazarsın, Arduino da bunları sırayla buzzera gönderir. Bu yazıda Jingle Bells, We Wish You a Merry Christmas, Silent Night ve Deck the Halls için kulakla değil, nota kâğıdından çıkarılmış doğru nota-süre dizilerini bulacaksın. Dört melodi de yüz yılı aşkın geleneksel eserlerdir; telif sorunu olmadan istediğin projede kullanabilirsin.
Önce tek şarkılık kısa bir kodla başlayacağız, sonra dört şarkıyı sırayla çalan, notalara göre iki LED yakıp söndüren ve butonla şarkı değiştiren bir müzik kutusuna geçeceğiz. Bu ikinci kod delay() yerine millis() kullandığı için şarkı çalarken buton, sensör ya da LED şeridi gibi başka işleri de aksatmadan yürütebilir. Yazının sonunda aynı melodileri ESP32 ile dokunmatik bir Noel kartına, Raspberry Pi Pico ile de MicroPython koduna taşıyoruz.

Hangi buzzer gerekir: aktif mi pasif mi?
Aktif buzzerın içinde kendi osilatörü vardır; ona 5 V verdiğinde hep aynı tonda öter, yani melodi çalamaz. Pasif buzzer ise küçük bir hoparlör gibidir: Arduino pine saniyede kaç kez açılıp kapanırsa o frekansta ses çıkarır. Ayırt etmenin kolay yolu, buzzerı 3–5 V pile kısa bir an dokundurmaktır: sürekli bip sesi geliyorsa aktiftir, yalnızca bir tık duyuyorsan pasiftir. Aktif modellerin üstünde genellikle beyaz bir etiket bulunur ve alt yüzü kapalıdır; pasif modellerde alt kısımda yeşil devre kartı görünür. Ayrıntılar için Buzzer Nedir? yazısına bakabilirsin.
| Özellik | Aktif buzzer | Pasif buzzer |
|---|---|---|
| İç osilatör | Var | Yok |
| Melodi çalar mı? | Hayır, tek ton | Evet, tone() ile her nota |
| Sürme komutu | digitalWrite() | tone(pin, frekans, süre) |
| Pile dokundurunca | Sürekli bip | Tek tık |
| En gür ses aralığı | Sabit (genelde 2–2,5 kHz) | Yaklaşık 2–4 kHz (rezonans) |
Bağlantı: buzzer, iki LED ve buton
| Parça | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Pasif buzzer + | D8 | GPIO 25 | GP15 |
| Pasif buzzer − | GND | GND | GND |
| LED 1 (220 Ω ile) | D6 | GPIO 26 | GP14 |
| LED 2 (220 Ω ile) | D7 | GPIO 27 | GP13 |
| Buton (diğer ucu GND) | D2 | GPIO 4 | GP2 |
| Dokunmatik folyo | - | GPIO 32 (T9) | - |
Nota frekansları: Noel şarkılarında kullanılan 14 nota
Batı müziğinde her oktav 12 yarım sese bölünür ve bir yarım ses yukarı çıkmak frekansı 2'nin 12. kökü, yani yaklaşık 1,0595 ile çarpar. Referans nota La (A4) 440 Hz'dir; MIDI numarası n olan bir notanın frekansı f = 440 × 2^((n − 69) / 12) formülüyle bulunur. Örneğin Do5 (C5) MIDI 72'dir: 440 × 2^(3/12) = 523,25 Hz. Bir oktav yukarı çıkmak frekansı tam iki katına çıkarır; Do6 bu yüzden 1047 Hz'dir. Küçük pasif buzzerlar 500 Hz altında cılız çaldığı için dört şarkıyı da 5. ve 6. oktava taşıdık; tabloda kodda kullandığımız bütün notalar var.
| Nota | Solfej | Frekans (Hz) | Kod sabiti |
|---|---|---|---|
| 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 diyez | 740 | NOTE_FS5 |
| G5 | Sol | 784 | NOTE_G5 |
| A5 | La | 880 | NOTE_A5 |
| A#5 / Bb5 | Si bemol | 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 ve nota süreleri
Süreleri milisaniye olarak tek tek yazmak yerine en kısa nota olan sekizliği birim aldık: 1 sekizlik, 2 dörtlük, 3 noktalı dörtlük, 4 ikilik, 6 noktalı ikilik, 8 birlik notadır. Tempo dakikadaki dörtlük sayısıdır (BPM); bir dörtlük 60000 / BPM milisaniye sürer, sekizlik de bunun yarısıdır. 120 BPM'de dörtlük 500 ms, sekizlik 250 ms eder. Şarkının hızını değiştirmek istersen dizilere dokunmadan yalnızca sekizlik süresini değiştirmen yeterli. Her notanın %90'ı çalınır, kalan %10 sessiz bırakılır; böylece art arda gelen aynı notalar (Jingle Bells'teki üç Mi gibi) tek uzun ses gibi birbirine yapışmaz.
| Şarkı | Ölçü | Tempo | Sekizlik (ms) | Dörtlük (ms) | Nota sayısı |
|---|---|---|---|---|---|
| Jingle Bells (nakarat) | 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 | yaklaşık 130 BPM | 230 | 460 | 68 |
İlk kod: Jingle Bells nakaratı
- Pasif buzzerın + ucunu D8'e, diğer ucunu GND'ye bağla.
- Arduino IDE'yi aç, aşağıdaki kodu yapıştır ve kart olarak Arduino Uno'yu seç.
- Kodu yükle; kart açılır açılmaz nakarat bir kez çalar. Tekrar dinlemek için reset tuşuna bas.
- Ses yavaş ya da hızlı geldiyse EIGHTH_MS değerini değiştir: 200 daha hızlı, 300 daha yavaş çalar.
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}Kod iki paralel dizi tutar: melody notaların frekansını, beats aynı sıradaki notaların sekizlik cinsinden süresini. Döngü her notada tone() ile sesi başlatır, delay() ile notanın tam süresi kadar bekler. tone() üçüncü parametre olarak süre aldığında sesi kendisi keser; biz bu süreyi notanın %90'ı verdiğimiz için notalar arasında kısa bir nefes kalır. İki dizinin eleman sayısı aynı olmak zorunda; birine nota ekleyip diğerine süre eklemeyi unutursan melodi kayar ve dizinin sonundan sonraki rastgele bellek değerleri çalınır. Dizilerdeki boşluklar ölçü çizgilerine denk gelir; böylece notaları nota kâğıdıyla karşılaştırmak kolaylaşır.
Dört şarkının nota dizileri
Aşağıdaki tablo her şarkının hangi tonda yazıldığını ve ilk dizesinin notalarını gösterir; kodu kendi kulağınla kontrol ederken işine yarar. Tire (–) ölçü çizgisi, nokta (.) noktalı notadır. We Wish You a Merry Christmas bir ön vuruşla (anacrusis) başlar: ilk Do5, birinci ölçüden önce gelen tek dörtlüktür. Silent Night'ta melodi çok yavaş ve geniş olduğu için son Do5'i 12 sekizlik, yani iki ölçü boyunca tuttuk. Deck the Halls'taki tek diyezli nota, "fa-la-la" yükselişindeki Fa diyezdir (F#5).
| Şarkı | Ton | İlk dizenin notaları | Dikkat |
|---|---|---|---|
| Jingle Bells | Do majör | Mi Mi Mi – Mi Mi Mi – Mi Sol Do. Re – Mi | "all the way" kısmında noktalı dörtlük + sekizlik |
| We Wish You a Merry Christmas | Fa majör | Do – Fa Fa Sol Fa Mi – Re Re Re | 3/4 ölçü, Si bemol (A#5) kullanır |
| Silent Night | Do majör (bir oktav yukarı) | Sol. La Sol – Mi – Sol. La Sol – Mi | Yavaş tempo, noktalı ikilikler |
| Deck the Halls | Do majör | Sol. Fa Mi Re – Do Re Mi Do | "fa-la-la" sekizlikleri, Fa diyez (F#5) |
millis ile LED'li Noel şarkısı çalar (4 şarkı + buton)
Şimdi dört şarkıyı da tek bir kodda topluyoruz. Notalar {frekans, süre} çiftlerinden oluşan Note yapısında ve PROGMEM ile flash bellekte saklanıyor; Uno'nun yalnızca 2 KB RAM'i olduğu için 195 notayı RAM'de tutmak yerine flash'tan okumak iyi bir alışkanlıktır. LED'ler her notada yer değiştirir, buton D2'deki dahili pull-up ile çalışır ve basıldığında bir sonraki şarkıya geçilir. Bir şarkı bitince 1,5 saniye sessizlik olur, ardından sıradaki şarkı başlar.
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}Kodun kalbi loop() içindeki zaman kontrolüdür: millis() − noteStart notanın süresini geçtiyse sıradaki nota başlatılır, geçmediyse loop hiç beklemeden devam eder. Bu sayede buton her döngüde okunur ve basışı kaçırmaz; delay() kullansaydık Silent Night'taki 4,8 saniyelik son notada buton hiç tepki vermezdi. memcpy_P() notayı flash'tan RAM'deki geçici bir değişkene kopyalar. Şarkı bittiğinde noteIndex, nota sayısına eşit olur ve bu bir "ara" durumu olarak kullanılır; ara süresi dolunca nextSong() çağrılır. Derlenen kod Uno'da yaklaşık 3,9 KB flash ve 67 bayt RAM kullanır. Neden delay() yerine millis() tercih ettiğimizi daha ayrıntılı görmek istersen millis ve delay farkı yazısına göz at.
ESP32 ile Noel şarkısı: dokunmatik Noel kartı
Yukarıdaki çalar kodu ESP32'de de değişiklik yapmadan derlenir: #if defined(ESP32) bloğu pinleri otomatik olarak GPIO 25, 26, 27 ve 4'e çevirir. ESP32 çekirdeğinin 2.x ve 3.x sürümlerinde tone() vardır ve arka planda LEDC PWM birimini kullanır. ESP32'nin pinleri 3,3 V verdiği için ses Uno'ya göre biraz daha kısık olur. Aşağıdaki kısa kod ise ESP32'nin dokunmatik pinlerinden yararlanır: GPIO 32'ye bağlı bir alüminyum folyo yıldıza parmağınla dokunduğunda Jingle Bells'in ilk dizesi çalar ve LED yanar. Kod açılışta dokunulmamış değeri ölçüp eşiği kendisi belirler; dokunmatik pinlerin ayrıntılarını ESP32 dokunmatik pinler yazısında bulabilirsin.
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}Raspberry Pi Pico ve MicroPython ile Noel şarkıları
Pico'da tone() yoktur ama aynı işi machine.PWM yapar: freq() notanın frekansını, duty_u16(32768) %50 doluluk oranını ayarlar ve bu oran buzzer için en gür sesi verir. duty_u16(0) sesi keser. Kod iki şarkıyı sırayla çalar; GP2'deki butona basarsan çalan şarkı yarıda kalır ve sıradakine geçilir. Diğer iki şarkının dizilerini Arduino kodundaki sayılarla aynı biçimde ekleyebilirsin; frekanslar ve süreler birebir aynıdır. MicroPython'a yeniysen önce Raspberry Pi Pico nedir? yazısındaki Thonny kurulumuna bak.
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)Sesi yükseltmek ve daha güzel ses almak
- Transistörlü hoparlör: Pinden 1 kΩ dirençle bir NPN transistörün (2N2222, BC337) bazına git, hoparlörü 5 V ile kolektör arasına bağla, emitörü GND'ye ver. 8 Ω'luk küçük bir hoparlör buzzerdan çok daha dolgun ses verir; seri bir 47–100 Ω direnç akımı sınırlar.
- Rezonans aralığı: Küçük piezo buzzerlar 2–4 kHz civarında en gür çalar. Melodiyi bir oktav yukarı taşımak sesi bir transistör kadar olmasa da belirgin şekilde artırır.
- Kutu etkisi: Buzzerı karton bir kutunun ya da süs topunun içine, deliği dışarı bakacak şekilde yerleştirmek sesi doğal olarak güçlendirir.
- Kısmak için: Gece çalışacak bir projede buzzerla seri 100–470 Ω direnç koy; ses kısılır, melodi bozulmaz.
- Tek ses sınırı: Uno'da tone() aynı anda yalnızca bir pinde ses üretir. Akor ya da iki sesli müzik için DFPlayer Mini gibi bir MP3 modülü daha uygun olur; seçenekleri Arduino müzik projeleri yazısında karşılaştırdık.
Sık hatalar ve çözümleri
| Sorun | Neden | Çözüm |
|---|---|---|
| Hep aynı bip sesi geliyor | Aktif buzzer kullanılıyor | Pasif buzzer tak; pile dokundurunca tık sesi vermeli |
| Melodi tanınmıyor, notalar kaymış | melody ve beats dizilerinin uzunluğu farklı | İki dizinin eleman sayısını eşitle, ölçü ölçü kontrol et |
| Aynı notalar tek uzun ses gibi | Notalar arasında sessizlik yok | tone() süresini notanın %90'ı yap |
| D3 ya da D11'deki LED titriyor | tone() Timer2'yi kullanıyor | LED'i D6, D7 gibi başka bir pine taşı |
| Bir basışta birkaç şarkı atlanıyor | Buton sıçraması (bounce) | Düşen kenarı yakala ve 250 ms kilit koy |
| ESP32'de 'tone' was not declared | Çok eski ESP32 çekirdeği (1.x) | Kart Yöneticisi'nden 2.x ya da 3.x sürümüne güncelle |
| Pico'da şarkı bitince ses kesilmiyor | duty_u16(0) çağrılmadı | Her notadan sonra ve döngü sonunda duty_u16(0) yaz |
Noel şarkısıyla proje fikirleri
- Noel Baba dedektörü: Bir PIR sensör şöminenin önünde hareket görünce Jingle Bells çalsın; kurulumu Noel Baba dedektörü yazısında.
- Müzikli yılbaşı ağacı: Şarkı çalarken WS2812B şeritteki renkler notalara göre değişsin; ağaç kurulumu için yılbaşı ağacı LED yazısına bak.
- Gece yarısı melodisi: Yılbaşı geri sayım sayacı sıfıra ulaştığında We Wish You a Merry Christmas çalsın.
- Kapı zili: Kapı zili butonuna basıldığında Aralık ayı boyunca normal ding-dong yerine Deck the Halls'un ilk dizesi çalsın.
- Buton piyanosu: Sekiz butonla bu notaları kendin çal; devre ve kod Arduino piyano yazısında. Daha fazla mevsimlik fikir için Arduino yılbaşı projeleri listesine göz at.
Buzzerla ilk melodini çalmak istiyorsan BlueGrays uygulamasındaki Buzzer Kullanımı, Buzzer İle Frekans Ayarı ve Buzzer İle İstiklal Marşı projeleri ücretsiz; her birinde devre şeması, adım adım bağlantı ve hazır kod var. Oradan kazandığın alışkanlıkla bu yazıdaki dört Noel şarkısını kendi müzik kutuna ya da Noel kartına kolayca ekleyebilirsin.
Sıkça sorulan sorular
Arduino ile Jingle Bells nasıl çalınır?
Pasif buzzerın + ucunu D8'e, diğer ucunu GND'ye bağla ve notaların frekanslarını bir diziye, sürelerini başka bir diziye yaz. Döngüde her nota için tone(8, frekans, süre) çağırıp delay(süre) ile beklemen yeterli. Nakarat Mi Mi Mi, Mi Mi Mi, Mi Sol Do Re Mi diye başlar ve 120 BPM'de sekizlik 250 ms sürer.
Aktif buzzer ile Noel şarkısı çalınır mı?
Hayır. Aktif buzzerın içinde sabit frekanslı bir osilatör vardır ve ona ne gönderirsen gönder aynı tonda öter. Melodi için pasif buzzer, piezo disk ya da transistörle sürülen küçük bir hoparlör gerekir.
Arduino tone() fonksiyonu nasıl kullanılır?
tone(pin, frekans) belirtilen pinde %50 doluluklu bir kare dalga üretir ve noTone(pin) çağrılana kadar çalar. Üçüncü parametre olarak milisaniye verirsen ses o sürenin sonunda kendiliğinden kesilir. Uno'da tone() Timer2'yi kullandığı için çalarken D3 ve D11'de PWM çalışmaz.
Buzzerın sesi nasıl yükseltilir?
En etkili yol, pinden 1 kΩ dirençle bir NPN transistörü sürmek ve transistörle küçük bir hoparlörü 5 V'tan beslemektir. Transistör yoksa melodiyi bir oktav yukarı taşımak da işe yarar, çünkü piezo buzzerlar 2–4 kHz civarında en gür çalar. Buzzerı kutu gibi bir kapalı alana yerleştirmek de sesi artırır.
Şarkı çalarken Arduino başka iş yapabilir mi?
delay() ile yazılmış bir melodi çalarken Arduino başka hiçbir şey yapamaz. Notaların bitiş zamanını millis() ile kontrol edersen loop() beklemeden döner; böylece buton okuma, LED yakma ya da sensör ölçme şarkı devam ederken de çalışır.
Raspberry Pi Pico'da tone() var mı?
MicroPython'da tone() yoktur ama machine.PWM aynı işi yapar. PWM(Pin(15)) nesnesinde freq(frekans) ile notayı, duty_u16(32768) ile %50 doluluğu ayarlarsın; duty_u16(0) sesi keser. Nota frekansları Arduino ile birebir aynıdır.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Buzzer Kullanımı
Kapı zili ya da alarm sesi nasıl çıkar, hiç merak ettin mi? Arduino küçük bir buzzer'ı kısa aralıklarla öttürür: bip, sus, bip, sus. Sesin elektrikle nasıl üretildiğini görür, ileride melodi çalan pro

Buzzer İle Frekans Ayarı
Dört butonla bir buzzer'dan çıkan sesi yönetirsin: biri sesi başlatır, biri susturur, diğer ikisi sesi inceltip kalınlaştırır. Artırma ya da azaltma butonunu basılı tuttukça ses adım adım değişir ve s

Buzzer İle İstiklal Marşı
Butona bastığında küçük bir buzzer İstiklal Marşı'nı nota nota çalmaya başlar. Arduino her notayı doğru yükseklikte ve doğru sürede çalarak marşın iki kıtasını baştan sona seslendirir, bitince yeni bi

IR Alıcı, Kumanda ve Buzzer ile Hazır Melodi Çalma
Televizyon kumandasının tuşlarıyla melodi çalan bir müzik kutusu yap. Kızılötesi alıcı kumandadan gelen sinyali yakalar; bir tuşa basınca hareketli bir oyun müziği, ikincisinde tanıdık bir çocuk şarkı

Buzzer Ve Buton İle Basit Piyano
Sekiz butonla kendi küçük piyanonu kur. Her buton bir notaya karşılık gelir: kalından inceye do, re, mi, fa, sol, la, si ve ince do. Basılı tuttuğun sürece nota buzzer'dan çalar, bırakınca susar; basi

ESP32 Buzzer ile Melodi Çalma
Pasif buzzer ile basit bir melodi (Twinkle Twinkle Little Star) çalma. Arduino'daki gibi tone() ve noTone() fonksiyonlarıyla nota çalıyoruz — ESP32 Arduino Core 3.0+ ile aynı syntax çalışır. Pasif buzzer kullanılmalı (aktif buzzer melodi çalmaz).

Arduino Ses Uyarılı Reaksiyon Testi: Refleksini Milisaniyeyle Ölç (LCD + Buzzer + 3 LED)
Refleksin ne kadar hızlı? Butona bas: kırmızı LED hazırlan, sarı LED dikkat der ve 1,5 ile 3,5 saniye arası rastgele bir bekleme başlar. Yeşil LED yanıp buzzer öttüğü an yeniden bas; tepki süren I2C LCD'de milisaniye olarak çıkar, altında oturum rekorun ve ortalaman durur. Yeşilden önce basarsan ekranda TOO EARLY! yazar ve kayıp sesi çalar. Butonu basılı tutunca yeni oyuncu başlar, herkes aynı bekleme sırasıyla adil yarışır.
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

