Katse (Buzzer)
Komponeendid:

Skeem:

Programm:
// Meloodiate mängimine.
// Käsk Arduino tone() - noote tihedus.
// Noodid:
// note frequency
// c 262 Hz
// d 294 Hz
// e 330 Hz
// f 349 Hz
// g 392 Hz
// a 440 Hz
// b 494 Hz
// C 523 Hz
const int buzzerPin = 9;
// pikkus on nootide ja pausite koguste summa
const int songLength = 18;
char notes[] = "cdfda ag cdfdg gf "; // tähed on noodid ja tühik on paus
// Rütmi seadistamine.
int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2};
// "tempo" meloodia kiirus. Kui väiksem tempo_ siis suurem kiirus.
int tempo = 150;
void setup()
{
pinMode(buzzerPin, OUTPUT);
}
void loop()
{
int i, duration;
for (i = 0; i < songLength; i++)
{
duration = beats[i] * tempo;
if (notes[i] == ' ') // kui noot puudub
{
delay(duration);
}
else
{
tone(buzzerPin, frequency(notes[i]), duration);
delay(duration);
}
delay(tempo/10); // väike paus nootide vahel
}
while(true){}
}
int frequency(char note)
{
int i;
const int numNotes = 8; // nootide kogus
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523};
// kui noot on olemas, siis tagastame selle tiheduse
for (i = 0; i < numNotes; i++)
{
if (names[i] == note)
{
return(frequencies[i]);
}
}
return(0);
}
Ülesanne 6. Buzzeri kasutamine “Väike Alarm Süsteem”
Töö kirjeldus
Tegemist on Arduino-põhise nutika ilmajaama ja helisüsteemiga, mis mõõdab keskkonna temperatuuri ning valguse taset, kuvab need LCD-ekraanil ja reageerib teatud tingimustele helisignaalide abil. Projekt ühendab sensorite mõõtmised visuaalse ja kuuldava tagasisidega.
Lisaks temperatuuri ja valguse taseme jälgimisele esitab seade rahustavat meloodiat, kui tingimused on sobivad (ei ole liiga palav ega liiga hele). Vastupidisel juhul teavitab kasutajat visuaalse hoiatusega LCD-ekraanil ja piiksuga.
Ekraanile kuvatakse temperatuur koos kraadisümboliga ning valguse tase, kasutades kohandatud LCD-sümboleid. Süsteem lülitub automaatselt välja, kui nupp lahti lastakse, tagades energiasäästlikkuse ja turvalisuse.
Kasutatud komponenid
- Arduino UNO plaat (1tk)
- Arendusplaat (1tk)
- LCD-ekraan (1tk)
- Potentiometer (1tk)
- Juhtmed (27tk)
- 220 Ω Takisti (1tk)
- 10 kΩ Takisti (1tk)
- Temperatuuri andur (1tk)
- Fototakisti (1tk)
- Slideswitch (1tk)
- Piezo element (1tk)
Töö protsess
Komponentide ühendamine:
- LCD-ekraan ühendati LiquidCrystal teegi abil pin’idele: RS=12, E=11, D4–D7 = 5, 4, 3, 2.
- Buzzer (helitekitaja) ühendati pordi 9 külge.
- Temperatuuriandur (LM35) ühendati analoogsisendisse A1.
- Valgussensor (fotorresistor) ühendati analoogsisendisse A0.
- Juhtnupp ühendati pin 6 külge.
Funktsionaalsus:
- Temperatuur ja valgus loetakse analoogväärtustena, teisendatakse vastavalt kraadideks ja valguse intensiivsuseks.
- Kui temperatuur on üle 25 °C või valgus on intensiivne (väärtus > 200), annab buzzer helisignaali ja LCD-ekraan kuvab hoiatava sõnumi (“!!!!OHTU!!!!”, “Liiga palav!!!”, “Liiga pime!!!”).
- Kui tingimused on normaalsed, mängib buzzer rahustavat meloodiat.
Muusika esitamine:
- Meloodia “Calm Music” koosneb eelnevalt määratletud nootide ja kestustega massiividest.
- Muusika peatub, kui keskkonnatingimused muutuvad ohtlikuks või juhtnupp vabastatakse.
Funktsioonis calm_music()
kasutati valmis koodi ja noodiseadeid tuntud videomängust “Super Mario Bros.” Meloodia toodi üle järgmiselt projektilt:
- Muusika allikas:
Arduino Project Hub – Playing Popular Songs with Arduino and a Buzzer - Meloodia “Mario Bros” kood GitHubis:
Super Mario Bros. buzzer melody – GitHub
LCD-ekraan:
- Kuvab reaalajas temperatuuri ja valguse näite.
- Kasutab spetsiaalselt loodud sümboleid (kraad ja täheke), mis lisatakse LCD-ekraanile
lcd.createChar()
abil.
Seriaalmonitor:
- Näitab samuti temperatuuri ja valguse väärtusi, et oleks võimalik andmeid jälgida ka arvutiekraanil.
Uuritud funktsioonid
#define NOTE_A4 440 | Makro, mis määrab noodi A4 sageduse (440 Hz). Kasutatakse meloodiate loomisel, määrates iga noodi sageduse. |
tone(pin, frequency); | Teeb kindlal pinnil (nt buzzeril) helisignaali kindla sagedusega. Näiteks tone(8, 440); mängib A4 nooti. |
tone(pin, frequency, duration); | Mängib heli teatud kestusega millisekundites. Näiteks tone(8, 440, 500); mängib pool sekundit A4 nooti. |
noTone(pin); | Lõpetab heli mängimise määratud pinnil. Kasulik meloodiate vahepausideks või heli peatamiseks. |
tone(buzzer, calm_melody[note], duration); | Mängib meloodia kindla noodi. calm_melody on sageduste massiiv, note on indeks, duration – kestus millisekundites. |
Kasutamisvõimalused tavaelus
- Kodune kliimaseire: aitab jälgida toatemperatuuri ja valgusolusid, et tagada mugav keskkond.
- Lastele mõeldud õppemänguasi: rahustav muusika ja arusaadavad visuaalid sobivad hästi õppeotstarbeks.
- Kasvuhoonetes: jälgib taimede jaoks vajalikke tingimusi (valgus, temperatuur).
- Telkimisel: aku või patareitoitel seade annab kiiresti teada keskkonna muutustest.
- Õppevahend koolis: integreerib programmeerimise, elektroonika ja füüsika praktilise näitena.
- Stressimaandaja kontoris või kodus: rahustav muusika mängib ainult siis, kui keskkond on meeldiv – ideaalne pausideks.
Interaktiivne skeem
Skeem

Video (link)
Programm
#include <LiquidCrystal.h>
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_G5 784
#define NOTE_A5 880
#define NOTE_AS4 466
#define NOTE_AS5 932
#define NOTE_CS4 277
#define NOTE_CS5 554
#define NOTE_DS5 622
#define NOTE_FS4 370
#define NOTE_FS5 740
#define NOTE_GS4 415
#define NOTE_GS5 831
#define NOTE_G3 196
#define NOTE_A3 220
#define NOTE_C5 523
#define NOTE_C4 262
#define REST 0
int calm_melody[] = {
NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
NOTE_G5, REST, NOTE_G4, REST,
NOTE_C5, NOTE_G4, REST, NOTE_E4,
NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
NOTE_C5, NOTE_G4, REST, NOTE_E4,
NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
REST, NOTE_DS5, REST, NOTE_D5,
NOTE_C5, REST,
REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
REST, NOTE_DS5, REST, NOTE_D5,
NOTE_C5, REST,
NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
REST,
NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
NOTE_G5, REST, NOTE_G4, REST,
NOTE_C5, NOTE_G4, REST, NOTE_E4,
NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
NOTE_C5, NOTE_G4, REST, NOTE_E4,
NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
REST,
NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
NOTE_G5, REST, NOTE_G4, REST,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
NOTE_C5, NOTE_G4, NOTE_E4,
NOTE_A4, NOTE_B4, NOTE_A4, NOTE_GS4, NOTE_AS4, NOTE_GS4,
NOTE_G4, NOTE_D4, NOTE_E4
};
int calm_durations[] = {
8, 8, 8, 8, 8, 8, 8,
4, 4, 8, 4,
4, 8, 4, 4,
4, 4, 8, 4,
8, 8, 8, 4, 8, 8,
8, 4,8, 8, 4,
4, 8, 4, 4,
4, 4, 8, 4,
8, 8, 8, 4, 8, 8,
8, 4,8, 8, 4,
4, 8, 8, 8, 4, 8,
8, 8, 8, 8, 8, 8, 8, 8,
4, 4, 8, 4,
2, 2,
4, 8, 8, 8, 4, 8,
8, 8, 8, 8, 8, 8, 8, 8,
4, 4, 8, 4,
2, 2,
8, 4, 8, 8, 8, 4,
8, 4, 8, 2,
8, 4, 8, 8, 8, 8, 8,
1,
8, 4, 8, 8, 8, 4,
8, 4, 8, 2,
8, 8, 8, 8, 8, 8, 4,
4, 4, 4, 4,
4, 8, 4, 4,
4, 4, 8, 4,
8, 8, 8, 4, 8, 8,
8, 4, 8, 8, 4,
4, 8, 4, 4,
4, 4, 8, 4,
8, 8, 8, 4, 8, 8,
8, 4, 8, 8, 4,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 8, 8, 8, 8, 8,
8, 4, 8, 2,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 4, 8, 8, 8, 8,
8, 4, 8, 2,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 8, 8, 8, 8, 8,
8, 4, 8, 2,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 4, 8, 8, 8, 8,
8, 4, 8, 2,
8, 4, 8, 8, 8, 8, 8,
1,
8, 4, 8, 8, 8, 4,
8, 4, 8, 2,
8, 8, 8, 8, 8, 8, 4,
4, 4, 4, 4,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 8, 8, 8, 8, 8,
8, 4, 8, 2,
8, 4, 8, 4, 4,
8, 4, 8, 2,
8, 4, 8, 8, 8, 8,
8, 4, 8, 2,
4, 4, 4,
8, 8, 8, 8, 8, 8,
8, 8, 2
};
const int buzzer = 9;
const int temperaturePin = A1;
const int lightPin = A0;
const int controlPin = 6;
float voltage, degreesC;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
bool systemOn = false;
byte degrees[8] = {
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
byte taht[8] = {
0b01010,
0b00000,
0b10001,
0b10001,
0b10001,
0b10001,
0b01110,
0b00000
};
void setup() {
pinMode(buzzer, OUTPUT);
lcd.begin(16, 2);
lcd.createChar(1, degrees);
lcd.createChar(2, taht);
Serial.begin(9600);
}
void calm_music() {
int size = sizeof(calm_durations) / sizeof(int);
for (int note = 0; note < size; note++) {
// Kontrollime enne iga nooti alarmi ja süsteemi väljalülitamist
float v = analogRead(temperaturePin) * 0.004882814;
float t = (v - 0.5) * 100.0;
int light = analogRead(lightPin);
bool control = digitalRead(controlPin);
if (t > 25 || light > 200 || !control) {
noTone(buzzer);
return;
}
// Uuendame LCD otse siin
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.write(byte(1));
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Valgus: ");
lcd.print(light);
lcd.print(" ");
// Mängime noodid
int duration = 1000 / calm_durations[note];
tone(buzzer, calm_melody[note], duration);
delay(duration * 1.3);
noTone(buzzer);
}
}
void loop() {
systemOn = digitalRead(controlPin);
if (systemOn) {
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
int lightLevel = analogRead(lightPin);
// Väljund Serial Monitorile
Serial.print("Temp: ");
Serial.print(degreesC);
Serial.print(" C | Light: ");
Serial.println(lightLevel);
// LCD: näidud
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(degreesC);
lcd.write(byte(1));
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Valgus: ");
lcd.print(lightLevel);
lcd.print(" ");
// Alarmi kontroll
if (degreesC > 25 && lightLevel > 200) {
noTone(9);
tone(buzzer, 1000, 500);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("!!!!OHTU!!!! ");
} else if (degreesC > 25) {
noTone(9);
tone(buzzer, 1000, 500);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Liiga palav!!! ");
} else if (lightLevel > 200) {
noTone(9);
tone(buzzer, 1000, 500);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Liiga pime!!! ");
} else {
calm_music();
}
} else {
noTone(9);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S");
lcd.write(byte(2));
lcd.print("stem: OFF");
}
delay(1000);
}