Rehberler · 7 dk okuma

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.

Arduino Noel şarkısı için pasif buzzer
Pasif buzzer: tone() ile verilen her frekansı çalar, bu yüzden melodi için doğru seçimdir.

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.

ÖzellikAktif buzzerPasif buzzer
İç osilatörVarYok
Melodi çalar mı?Hayır, tek tonEvet, tone() ile her nota
Sürme komutudigitalWrite()tone(pin, frekans, süre)
Pile dokunduruncaSürekli bipTek 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çaArduino UnoESP32Raspberry Pi Pico
Pasif buzzer +D8GPIO 25GP15
Pasif buzzer −GNDGNDGND
LED 1 (220 Ω ile)D6GPIO 26GP14
LED 2 (220 Ω ile)D7GPIO 27GP13
Buton (diğer ucu GND)D2GPIO 4GP2
Dokunmatik folyo-GPIO 32 (T9)-
Uno'da tone() Timer2'yi kullanır; şarkı çalarken D3 ve D11 pinlerinde analogWrite() çalışmaz. LED'leri bu pinlere bağlayıp parlaklık ayarlamaya çalışırsan titreme ya da hiç ışık görmezsin. Ayrıca buzzerı tek başına pine bağlamak sorun değildir ama 8 Ω hoparlörü asla doğrudan pine bağlama; aşağıdaki ses yükseltme bölümündeki transistörlü devreyi kullan.

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.

NotaSolfejFrekans (Hz)Kod sabiti
B4Si494NOTE_B4
C5Do523NOTE_C5
D5Re587NOTE_D5
E5Mi659NOTE_E5
F5Fa698NOTE_F5
F#5Fa diyez740NOTE_FS5
G5Sol784NOTE_G5
A5La880NOTE_A5
A#5 / Bb5Si bemol932NOTE_AS5
B5Si988NOTE_B5
C6Do1047NOTE_C6
D6Re1175NOTE_D6
E6Mi1319NOTE_E6
F6Fa1397NOTE_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çüTempoSekizlik (ms)Dörtlük (ms)Nota sayısı
Jingle Bells (nakarat)4/4120 BPM25050051
We Wish You a Merry Christmas3/4150 BPM20040030
Silent Night3/475 BPM40080046
Deck the Halls4/4yaklaşık 130 BPM23046068

İlk kod: Jingle Bells nakaratı

  1. Pasif buzzerın + ucunu D8'e, diğer ucunu GND'ye bağla.
  2. Arduino IDE'yi aç, aşağıdaki kodu yapıştır ve kart olarak Arduino Uno'yu seç.
  3. Kodu yükle; kart açılır açılmaz nakarat bir kez çalar. Tekrar dinlemek için reset tuşuna bas.
  4. Ses yavaş ya da hızlı geldiyse EIGHTH_MS değerini değiştir: 200 daha hızlı, 300 daha yavaş çalar.
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}

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 BellsDo majörMi 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 ChristmasFa majörDo – Fa Fa Sol Fa Mi – Re Re Re3/4 ölçü, Si bemol (A#5) kullanır
Silent NightDo majör (bir oktav yukarı)Sol. La Sol – Mi – Sol. La Sol – MiYavaş tempo, noktalı ikilikler
Deck the HallsDo majörSol. 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.

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}

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.

Şarkıyı bir oktav yukarı taşımak için tone() satırında frekansı 2 ile çarpman yeterli: tone(BUZZER_PIN, n.freq * 2, ...). Pasif buzzerlar 2–4 kHz civarında en gür çaldığı için bu küçük değişiklik sesi belirgin biçimde yükseltir; ancak Silent Night gibi zaten yüksek notalara çıkan şarkılarda ses tizleşip kulak tırmalayabilir.

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.

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}

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.

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)

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

SorunNedenÇözüm
Hep aynı bip sesi geliyorAktif buzzer kullanılıyorPasif 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 gibiNotalar arasında sessizlik yoktone() süresini notanın %90'ı yap
D3 ya da D11'deki LED titriyortone() Timer2'yi kullanıyorLED'i D6, D7 gibi başka bir pine taşı
Bir basışta birkaç şarkı atlanıyorButon 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 kesilmiyorduty_u16(0) çağrılmadıHer notadan sonra ve döngü sonunda duty_u16(0) yaz
Kendi şarkını eklemek için önce melodiyi nota kâğıdından ölçü ölçü yaz, her ölçünün sekizlik toplamını kontrol et: 4/4 ölçüde 8, 3/4 ölçüde 6 sekizlik etmeli. Toplam tutmuyorsa bir nota eksik ya da süresi yanlıştır; kulakla aramaktan çok daha hızlı bulursun.

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.

Tüm projeleri gör
Buzzer Kullanımı
#13Başlangıç

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

4.7(89)
162
Buzzer İle Frekans Ayarı
#14Orta

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

4.6(69)
119
Buzzer İle İstiklal Marşı
#15Orta

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

4.8(107)
217
IR Alıcı, Kumanda ve Buzzer ile Hazır Melodi Çalma
#18Başlangıç
Premium

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ı

4.8(57)
74
Buzzer Ve Buton İle Basit Piyano
#26İleri
Premium

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

4.9(66)
88
ESP32 Buzzer ile Melodi Çalma
#114Başlangıç
Premium

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

4.8(30)
55
Arduino Ses Uyarılı Reaksiyon Testi: Refleksini Milisaniyeyle Ölç (LCD + Buzzer + 3 LED)
#97Orta
Premium

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.

4.6(33)
50