2.4 Piskanje buzzera
Cilj ovog primjera je napraviti malo buke. Pasivni buzzer je maleni zvučnik: nahrani ga pravokutnim signalom i vibrirat će na onoj frekvenciji koju mu pošalješ, pa jedan buzzer može odsvirati bilo koju notu koju želiš.
U ovom primjeru NULA MINI odsvira kratku skalu od osam nota u trenutku kada se upali.
U ovoj dokumentaciji naučit ćeš:
- Kako spojiti pasivni buzzer na pločicu.
- Kako
tone()pretvara frekvenciju u zvuk. - Kako
noTone()ponovno utišava buzzer. - Kako držati melodiju u polju i prolaziti kroz nju petljom.
Potreban hardver:
- 1x Soldered NULA MINI pločica
- 1x Breadboard
- 1x Pasivni buzzer
- 3x Jumper žice
- 1x USB-C kabel
IO5 i mase. Nema ga od čega štititi, jer se pin uvijek kreće samo između 0 V i 3.3 V.Spajanje komponenti
Prati pet koraka ispod. Svaka fotografija snimljena je s istog položaja, pa je možeš usporediti s prethodnom i vidjeti točno što se promijenilo.
1. Umetni NULA MINI pločicu na breadboard
Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova sjednu s obje strane središnjeg kanala, s čipom okrenutim prema dolje.

2. Postavi buzzer i izvedi masu na vodilicu
Buzzer ide na f–j stranu, dobro odmaknut od pločice, s dvije nožice u redu 14 i redu 15.
Pogledaj vrh kućišta buzzera prije nego ga utisneš. Uz oznaku HWDZ nalazi se mali + unutar kružića, i nožica na toj strani kućišta je pozitivna. Ta nožica ide u red 15.
Zatim povuci jumper žicu iz j30 (GND) do plave − vodilice. Ta vodilica je linija mase za ostatak primjera.

3. Spoji pozitivnu nožicu na IO5
Jedna jumper žica iz j15 (red u kojem je + nožica buzzera) dolje u j28 (IO5). To je žica koja će nositi pravokutni signal.

4. Spoji drugu nožicu na masu
Još jedna jumper žica, iz j14 (druga nožica buzzera) do plave − vodilice, koja je već vezana na GND.

Krug je sada zatvoren: IO5 → buzzer → GND. Što god IO5 radi, buzzer osjeti.
5. Spoji pločicu na računalo

IO5 doseže red s +, a drugi red doseže masu.Kako pasivni buzzer proizvodi notu
Zvuk nije ništa više od zraka koji se potiskuje naprijed i natrag. Unutar buzzera je tanka membrana koja se pomiče kad god se napon na njoj promijeni, a pomicanje dovoljno brzo daje notu koju možeš čuti.
To je sve što tone() radi. Prebacuje IO5 između 3.3 V i 0 V iznova, praveći pravokutni signal, a broj prebacivanja u sekundi je frekvencija, mjerena u hercima. Tvoje uho tu frekvenciju čita kao visinu tona:
| Nota | Frekvencija (Hz) |
|---|---|
| C4 | 262 |
| D4 | 294 |
| E4 | 330 |
| F4 | 349 |
| G4 | 392 |
| A4 | 440 |
| B4 | 494 |
| C5 | 523 |
Korisna stvar kod tone() je to što nastavlja raditi u pozadini. Kada nota počne, pločica je slobodna nastaviti s ostatkom koda, i zato skica koristi delay() da odluči koliko dugo čekati prije pokretanja sljedeće.
Kako je melodija pohranjena
Melodija je u stvari par lista koje putuju zajedno: koja nota i koliko traje. Skica ih drži u dva polja iste dužine:
melody[]drži frekvenciju svake note u hercima.noteDuration[]drži dužinu svake note, zapisanu kako je zapisuju note:4za četvrtinku,2za polovinku.
Petlja for zatim prolazi kroz oba polja jedan indeks za drugim, svira notu pomoću tone() i počeka njezino trajanje. Kada petlja završi, noTone() se pobrine da buzzer ostane tih.
Kod
/*
Ovo je varijabla kojoj dodjeljujemo broj pina na koji smo spojili buzzer.
NULA pločica ima logiku imenovanja pinova ovako: IO5, gdje je 5 broj koji dajemo varijabli.
*/
const int BUZZER_PIN = 5;
/*
Koristit ćemo dva polja - jedno za frekvencije nota (u hercima) i jedno za trajanja nota.
Ona definiraju kratku melodiju koju će buzzer odsvirati.
*/
int melody[] = { 262, 294, 330, 349, 392, 440, 494, 523 }; // C4 do C5
int noteDuration[] = { 4, 4, 4, 4, 4, 4, 4, 2 }; // Četvrtinke (posljednja je polovinka)
/*
Ovdje računamo koliko nota melodija ima, umjesto da ih brojimo napamet. sizeof() nam kaže koliko memorije
nešto zauzima, pa nam veličina cijelog polja podijeljena s veličinom jednog unosa daje broj unosa.
Napisano ovako, broj ostaje ispravan i nakon što dodaš svoju notu.
*/
const int NOTE_COUNT = sizeof(melody) / sizeof(melody[0]);
void setup() {
/*
pinMode() je funkcija koja konfigurira zadani pin da se ponaša ili kao ulaz ili u ovom slučaju kao izlaz.
Budući da naš pin mora pobuđivati buzzer, pin ćemo staviti u OUTPUT mod.
*/
pinMode(BUZZER_PIN, OUTPUT);
/*
Serial.begin() uspostavlja serijsku komunikaciju između tvoje pločice i tvog računala preko USB kabela. Ovdje ga koristimo
da ti damo znati kada melodija počinje i kada je gotova.
*/
Serial.begin(115200);
Serial.println("Playing melody...");
/*
Petlja for ponavlja blok koda zadani broj puta, brojeći vlastitom varijablom. Ovdje "i" počinje na 0
i raste za jedan u svakom prolazu dok ne dosegne NOTE_COUNT, pa se blok ispod izvršava jednom za svaku notu u melodiji.
*/
for (int i = 0; i < NOTE_COUNT; i++) {
/*
Dužine glazbenih nota zapisuju se kao razlomci: četvrtinka je četvrtina cijele note. Ovdje taj razlomak
pretvaramo u milisekunde dijeljenjem jedne sekunde s brojem iz polja, pa 4 postaje 250 ms a 2
postaje 500 ms.
*/
int duration = 1000 / noteDuration[i];
/*
tone() je funkcija koja tjera buzzer da proizvede zvuk. Generira pravokutni signal zadane frekvencije,
koju naše uho čuje kao visinu note, a treća vrijednost mu govori koliko dugo da nastavi svirati.
*/
tone(BUZZER_PIN, melody[i], duration);
/*
delay() je funkcija koja započinje pauzu u kodu. Čekamo malo dulje od same note, što ostavlja
kratku tišinu između nota da se ne stope jedna u drugu. Slobodno eksperimentiraj s tim faktorom 1.3.
*/
delay(duration * 1.3);
}
/*
noTone() zaustavlja svaki zvuk koji je buzzer pravio. Posljednja nota već je sama završila, ali poziv ovoga
osigurava da buzzer ostane tih što god se dogodilo.
*/
noTone(BUZZER_PIN);
Serial.println("Melody finished!");
}
void loop() {
// Ovdje se ništa ne događa - melodija se svira jednom u setup()
}
Što bi trebao vidjeti
Prenesi skicu i buzzer odsvira uzlaznu skalu od osam nota, ukupno oko dvije sekunde. Onda utihne.
Sve se događa u setup() a loop() je prazan, pa se melodija svira jednom po uključivanju. Da je čuješ ponovno, kucni tipku RST na pločici.
Otvori Tools → Serial Monitor i postavi baud rate na 115200, i istu stvar možeš gledati u tekstu:
IO5 sleti u isti red kao jedna od njih.Probaj sam: promijeni jedan od brojeva u melody[] i prenesi ponovno. Budući da se NOTE_COUNT računa iz samog polja, možeš i dodati note u oba polja i petlja će ih pokupiti bez ikakve druge promjene.
Cijeli primjer
Pogledaj cijeli kod primjera na linku ispod:
2.4_Buzzer_Beep.ino
Primjer koji pokazuje kako pomoću funkcije tone() odsvirati jednostavnu melodiju na pasivnom buzzeru spojenom na IO5.