Arduino: zvučnik (piezo) i RGB LED dioda
Do sada je Arduino samo palio i gasio LED diode. U ovoj lekciji dobija glas – piezo zvučnik koji svira tonove i melodije – i boje – RGB LED diodu koja mešanjem crvene, zelene i plave svetlosti može da pokaže skoro svaku boju. Na kraju sve spajamo u mali alarm.
Piezo zvučnik

U piezo zvučniku je tanka pločica koja se savija kada se na nju dovede napon. Ako je napon uključujemo i isključujemo stotinama puta u sekundi, pločica treperi i čujemo ton. Što je treperenje brže, ton je viši.
| Aktivni zvučnik | Pasivni zvučnik | |
|---|---|---|
| kako se pušta zvuk | digitalWrite(pin, HIGH) | tone(pin, frekvencija) |
| visina tona | uvek ista | biramo je |
| melodija | ne može | može |
| kako ga prepoznati | pisne kad se priključi na 5 V | na 5 V samo „klikne“ |
Povezivanje: nožica označena sa + (obično duža) ide na pin 8, a druga na GND. Ako je zvuk preglasan, između pina i zvučnika možeš staviti otpornik od 100 Ω.
Program 1: tone() i noTone()
// Arduino – pasivni zvučnik (piezo) na pinu 8: kratak pisak svake sekunde
const int ZVUCNIK = 8;
void setup() {
pinMode(ZVUCNIK, OUTPUT);
}
void loop() {
tone(ZVUCNIK, 1000); // ton od 1000 Hz
delay(200);
noTone(ZVUCNIK); // tišina
delay(800);
}
| Naredba | Šta radi |
|---|---|
tone(8, 1000) | pušta ton od 1000 Hz na pinu 8 dok ga ne zaustavimo |
tone(8, 1000, 200) | pušta ton 200 ms, pa sam staje (program ne čeka!) |
noTone(8) | zaustavlja ton |
Frekvencija se meri u hercima (Hz) – koliko puta u sekundi pločica zatreperi. Čovek čuje otprilike od 20 Hz do 20 000 Hz, a mali piezo zvučnik najglasnije svira između 2000 i 4000 Hz.
Program 2: sirena
// Arduino – sirena: visina tona raste i opada
const int ZVUCNIK = 8;
void setup() {
}
void loop() {
for (int f = 400; f <= 1200; f += 10) { // od 400 Hz do 1200 Hz
tone(ZVUCNIK, f);
delay(5);
}
for (int f = 1200; f >= 400; f -= 10) { // i nazad
tone(ZVUCNIK, f);
delay(5);
}
}
Petlja for povećava frekvenciju u koracima od 10 Hz, pa je smanjuje. Probaj da promeniš korak ili pauzu – sirena će zvučati drugačije.
Program 3: melodija
Melodija je niz tonova određene visine i trajanja. Visine pamtimo u jednom nizu, a trajanja u drugom. Ovo je početak „Ode radosti“ – kompozicije iz 1824. godine:
| Nota | do (C4) | re (D4) | mi (E4) | fa (F4) | sol (G4) | la (A4) |
|---|---|---|---|---|---|---|
| Frekvencija (Hz) | 262 | 294 | 330 | 349 | 392 | 440 |
// Arduino – melodija: početak „Ode radosti“ (L. van Betoven, 1824)
const int ZVUCNIK = 8;
// frekvencije tonova (Hz) u četvrtoj oktavi
const int C4 = 262, D4 = 294, E4 = 330, F4 = 349, G4 = 392;
int note[] = { E4, E4, F4, G4, G4, F4, E4, D4, C4, C4, D4, E4, E4, D4, D4 };
int trajanje[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 8, 2 };
// 4 = četvrtina, 8 = osmina, 2 = polovina, 3 = četvrtina sa tačkom (približno)
const int BROJ_NOTA = sizeof(note) / sizeof(note[0]);
void setup() {
for (int i = 0; i < BROJ_NOTA; i++) {
int ms = 1600 / trajanje[i]; // četvrtina traje 400 ms
tone(ZVUCNIK, note[i], ms);
delay(ms * 1.3); // kratka pauza između nota
}
noTone(ZVUCNIK);
}
void loop() {
}
Izraz sizeof(note) / sizeof(note[0]) računa koliko elemenata ima niz, pa ne moramo sami da ih brojimo. Melodija je u setup(), pa se svira samo jednom – za ponovno slušanje pritisni RESET.
RGB LED dioda

RGB LED dioda u jednom kućištu ima tri diode: crvenu (R), zelenu (G) i plavu (B). Ima četiri nožice – najduža je zajednička. Kod diode sa zajedničkom katodom najduža nožica ide na GND; kod diode sa zajedničkom anodom ide na 5V.
| Nožica | Povezuje se na |
|---|---|
| R (crvena) | pin 9 preko otpornika 220 Ω |
| najduža (zajednička katoda) | GND |
| G (zelena) | pin 10 preko otpornika 220 Ω |
| B (plava) | pin 6 preko otpornika 220 Ω |
tone() koristi isti unutrašnji tajmer kao PWM na pinovima 3 i 11. Dok zvučnik svira, jačina diode na tim pinovima ne bi radila. Pinovi 9, 10 i 6 nemaju taj problem.Program 4: mešanje boja
Jačinu svake boje menjamo funkcijom analogWrite(pin, 0–255) (PWM). Mešanjem tri osnovne boje svetlosti dobijamo ostale:
// Arduino – RGB LED (zajednička katoda na GND): osnovne boje
const int R = 9; // crvena nožica preko otpornika 220 oma
const int G = 10; // zelena
const int B = 6; // plava (sva tri pina imaju PWM ~)
// boja(r, g, b): svaki broj od 0 (ugašeno) do 255 (najjače)
void boja(int r, int g, int b) {
analogWrite(R, r);
analogWrite(G, g);
analogWrite(B, b);
}
void setup() {
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop() {
boja(255, 0, 0); delay(1000); // crvena
boja(0, 255, 0); delay(1000); // zelena
boja(0, 0, 255); delay(1000); // plava
boja(255, 255, 0); delay(1000); // žuta = crvena + zelena
boja(0, 255, 255); delay(1000); // tirkizna = zelena + plava
boja(255, 0, 255); delay(1000); // ljubičasta = crvena + plava
boja(255, 255, 255); delay(1000); // bela = sve tri
boja(0, 0, 0); delay(1000); // ugašeno
}
| R | G | B | Boja |
|---|---|---|---|
| 255 | 0 | 0 | crvena |
| 255 | 255 | 0 | žuta |
| 0 | 255 | 255 | tirkizna |
| 255 | 0 | 255 | ljubičasta |
| 255 | 100 | 0 | narandžasta |
| 255 | 255 | 255 | bela |
boja() piši analogWrite(R, 255 - r); i isto za G i B.Program 5: duga
// Arduino – RGB LED: boje se polako pretapaju (duga)
const int R = 9;
const int G = 10;
const int B = 6;
void boja(int r, int g, int b) {
analogWrite(R, r);
analogWrite(G, g);
analogWrite(B, b);
}
void setup() {
}
void loop() {
for (int i = 0; i <= 255; i++) { boja(255 - i, i, 0); delay(8); } // crvena->zelena
for (int i = 0; i <= 255; i++) { boja(0, 255 - i, i); delay(8); } // zelena->plava
for (int i = 0; i <= 255; i++) { boja(i, 0, 255 - i); delay(8); } // plava->crvena
}
Dok jedna boja slabi, druga jača – zato se boje neprimetno pretapaju. Ceo krug traje oko 6 sekundi (3 × 256 koraka po 8 ms).
Sve zajedno: alarm
Spajamo sve iz ove i prethodne lekcije: taster na pinu 2 uključuje i isključuje alarm, RGB LED trepće crveno-plavo, a zvučnik naizmenično svira dva tona.
// Arduino – taster, RGB LED i zvučnik zajedno: „alarm“
// Pritisak tastera uključuje i isključuje alarm.
// Dok alarm radi, LED trepće crveno-plavo i čuje se sirena.
const int R = 9, G = 10, B = 6;
const int ZVUCNIK = 8;
const int TASTER = 2;
bool alarm = false;
int prethodno = HIGH;
void boja(int r, int g, int b) {
analogWrite(R, r);
analogWrite(G, g);
analogWrite(B, b);
}
void setup() {
pinMode(TASTER, INPUT_PULLUP);
boja(0, 40, 0); // slabo zeleno: sve je u redu
}
void loop() {
int sada = digitalRead(TASTER);
if (prethodno == HIGH && sada == LOW) {
alarm = !alarm;
if (!alarm) {
noTone(ZVUCNIK);
boja(0, 40, 0);
}
delay(30);
}
prethodno = sada;
if (alarm) {
boja(255, 0, 0);
tone(ZVUCNIK, 880);
delay(250);
boja(0, 0, 255);
tone(ZVUCNIK, 660);
delay(250);
}
}
Zadaci za vežbu
Pokušaj prvo sam da rešiš zadatak, pa tek onda otvori rešenje.
- Napravi klavir sa tri tastera (pinovi 2, 3 i 4): dok je taster pritisnut, svira ton do, mi ili sol.
- Svaki pritisak tastera na pinu 2 neka menja boju RGB LED diode, redom kroz sedam boja.
- Napravi RGB termometar: potenciometar na A0 „glumi“ temperaturu od 0 do 40 °C. Ispod 18 °C dioda je plava, od 18 do 25 °C zelena, a iznad 25 °C crvena. Iznad 35 °C neka se čuje i kratak pisak.
Rešenje 1: klavir sa tri tastera
// Zadatak – „klavir“ sa tri tastera (pinovi 2, 3, 4): svaki taster svira svoj ton
const int ZVUCNIK = 8;
const int TASTERI[3] = { 2, 3, 4 };
const int TONOVI[3] = { 262, 330, 392 }; // do, mi, sol
void setup() {
for (int i = 0; i < 3; i++) {
pinMode(TASTERI[i], INPUT_PULLUP);
}
}
void loop() {
int svira = -1;
for (int i = 0; i < 3; i++) {
if (digitalRead(TASTERI[i]) == LOW) {
svira = i;
}
}
if (svira >= 0) {
tone(ZVUCNIK, TONOVI[svira]);
} else {
noTone(ZVUCNIK);
}
}
Rešenje 2: boja na taster
// Zadatak – svaki pritisak tastera menja boju RGB LED diode (7 boja u krug)
const int R = 9, G = 10, B = 6;
const int TASTER = 2;
const int BOJE[7][3] = {
{255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 0},
{0, 255, 255}, {255, 0, 255}, {255, 255, 255}
};
int k = 0;
int prethodno = HIGH;
void prikazi() {
analogWrite(R, BOJE[k][0]);
analogWrite(G, BOJE[k][1]);
analogWrite(B, BOJE[k][2]);
}
void setup() {
pinMode(TASTER, INPUT_PULLUP);
prikazi();
}
void loop() {
int sada = digitalRead(TASTER);
if (prethodno == HIGH && sada == LOW) {
k = (k + 1) % 7;
prikazi();
delay(30);
}
prethodno = sada;
}
Rešenje 3: RGB termometar
// Zadatak – RGB „termometar“: potenciometar na A0 glumi temperaturu (0–40 °C)
// ispod 18 °C plavo, od 18 do 25 °C zeleno, iznad 25 °C crveno; iznad 35 °C i pisak
const int R = 9, G = 10, B = 6;
const int ZVUCNIK = 8;
void boja(int r, int g, int b) {
analogWrite(R, r);
analogWrite(G, g);
analogWrite(B, b);
}
void setup() {
Serial.begin(9600);
}
void loop() {
int t = map(analogRead(A0), 0, 1023, 0, 40);
Serial.println(t);
if (t < 18) {
boja(0, 0, 255);
} else if (t <= 25) {
boja(0, 255, 0);
} else {
boja(255, 0, 0);
}
if (t > 35) {
tone(ZVUCNIK, 1500, 100);
}
delay(300);
}
Proveri znanje
Otvori kviz
Kviz: zvučnik i RGB LED
1. Šta radi tone(8, 440)?
2. Koja vrsta zvučnika može da svira melodiju?
3. Koju boju daje boja(255, 255, 0) kod RGB diode sa zajedničkom katodom?
4. Zašto je plava nožica RGB diode na pinu 6, a ne na pinu 11?
