Tehtud näidisülesanded
6 Katse (Buzzer)

Kood:
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);
}
Uuritud funktsioonid
Funktsioon: frequency(char note)
- Eesmärk: Teisendab noodi tähemärgi (nt
'c','d','e') vastavaks helisageduseks hertsides. - Kuidas töötab: Võrdleb sisestatud tähemärki massiivis
names[]olevate nootidega ning tagastab vastava sageduse massiivistfrequencies[].
Funktsioon: startPlaying(const char* notes, int* beats, int length)
- Eesmärk: Käivitab uue loo mängimise.
- Kuidas töötab: Salvestab parajasti mängitava loo info (noodid, rütmid, pikkus) ja alustab esimest nooti.
Funktsioon: updateMelody()
- Eesmärk: Kontrollib, kas on aeg mängida järgmine noot.
- Kuidas töötab: Arvutab aja millis()-ega ja kui piisavalt aega on möödunud, liigutab järgmise noodi juurde.
Funktsioon: playNote(char note, int beat)
- Eesmärk: Mängib ühe noodi (või pausi).
- Kuidas töötab: Kui noot on
' ', teebnoTone(), muidu arvutab sageduse ja mängib sedatone()abil.
Funktsioon: frequency(char note, int octaveOffset)
- Eesmärk: Arvutab helisageduse koos oktavi muutmise võimalusega.
- Kuidas töötab: Leiab baassageduse ja nihutab seda bittide kaupa (vasakule või paremale), et muuta oktavit.
Töö kirjeldus
Luua nutikas miniatuurne alarm süsteem, mis kogub andmeid erinevatelt sensoritelt, kuvab neid LCD-ekraanil, ning annab auditiivseid signaale buzzeri abil sõltuvalt olukorrast. Süsteemi saab aktiveerida ja deaktiveerida lüliti või potentsiomeetri abil. Tavatingimustes mängib taustaks muusika, kuid ohu korral katkeb muusika ning buzzer annab märguande.
Kasutatud komponeendid
- LCD-ekraan (16×2)
- Valguse andur (fototakisti)
- Juhtmed (22 tk)
- Takisti (3tk: 2tk 220 ohm, 1tk 10k ohm)
- Potentsiomeeter (250 kOhm)
- Buzzer
- Arduino Uno plaat
Ühendamise skeem

Programm
#include <LiquidCrystal.h>
// LCD-ekraani ühendused: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
// Laulude nimed (ei kasutata aktiivselt)
const char* myStrings[] = {"stillgrey", "back2u", "northwinds"};
// Riistvarapordid
const int buzzerPin = 9; // Kõlari pin
const int alarmSwitchPin = A0; // Lüliti või potentsiomeeter
const int ldrPin = A1; // Valgusandur
const int sensorPin = A5; // Nupu või muus sisendi anduri pin
// Häireseisundi muutuja ja valguslävi
int alarmMode = 0;
int lightThreshold = 985; // Kui valgus on alla selle, aktiveerub häire
// Laulude pikkused (nootide arv)
const int songLengthStillGrey = 8;
const int songLengthBack2U = 16;
const int songLengthNorthWinds = 16;
// Laulude noodid ja rütmid
const char notesStillGrey[] = "g f e d c b a g ";
int beatsStillGrey[] = {2, 1, 1, 2, 1, 1, 2, 1};
const char notesBack2U[] = "b d f a b a f d b d f a b a f d";
int beatsBack2U[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
const char notesNorthWinds[] = "e a g f d e c b a g f e d c b a";
int beatsNorthWinds[] = {2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2};
// Häiremeloodia
const char alarmNotes[] = "c c c c ";
int alarmBeats[] = {4, 4, 4, 4};
const int alarmLength = 4;
// Erinevate lugude tempod
int tempoStillGrey = 60;
int tempoBack2U = 90;
int tempoNorthWinds = 75;
int tempoAlarm = 100;
// Aktiivselt mängitava loo parameetrid
int currentTempo = 75;
int currentOctaveOffset = 0;
unsigned long noteStartTime = 0; // Aeg, mil noot algas
int currentNoteIndex = 0; // Milline noot parasjagu mängib
int currentSongLength = 0; // Aktiivse loo nootide kogus
const char* currentNotes = nullptr; // Aktiivne noodijada
int* currentBeats = nullptr; // Aktiivne rütmijada
bool isPlaying = false; // Kas muusika mängib hetkel
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(alarmSwitchPin, INPUT);
pinMode(ldrPin, INPUT);
pinMode(sensorPin, INPUT);
lcd.begin(16, 2); // LCD algus (16x2)
Serial.begin(9600); // Seriaalühendus andmete kuvamiseks
}
void loop() {
// Andurite väärtuste lugemine
int ldrValue = analogRead(ldrPin); // Valguse tase
int alarmSwitchValue = analogRead(alarmSwitchPin); // Kas lüliti on sees
int sensorValue = analogRead(sensorPin); // Loo valimiseks
// Andmete kuvamine seriaalmonitori
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" Potentiometer: ");
Serial.print(alarmSwitchValue);
Serial.print(" Sensor: ");
Serial.println(sensorValue);
// Häirerežiimi määramine valguse või potentsiomeetri järgi
alarmMode = (alarmSwitchValue > 512) ? 1 : 0;
if (ldrValue < lightThreshold) {
alarmMode = 1;
} else {
alarmMode = 0;
}
// Valguse väärtuse kuvamine LCD teisele reale
lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(ldrValue);
lcd.print(" ");
// Häiresignaali mängimine
if (alarmMode == 1) {
lcd.setCursor(0, 0);
lcd.print("ALARM! no dnb :("); // Tekst LCD esimesel real
if (!isPlaying || currentNotes != alarmNotes) {
currentTempo = tempoAlarm;
currentOctaveOffset = 0;
startPlaying(alarmNotes, alarmBeats, alarmLength);
}
} else {
// Loo valik sensori väärtuse põhjal
if (sensorValue < 341) {
lcd.setCursor(0, 0);
lcd.print("stillgrey ");
if (!isPlaying || currentNotes != notesStillGrey) {
currentTempo = tempoStillGrey;
currentOctaveOffset = 0;
startPlaying(notesStillGrey, beatsStillGrey, songLengthStillGrey);
}
} else if (sensorValue < 682) {
lcd.setCursor(0, 0);
lcd.print("back2u ");
if (!isPlaying || currentNotes != notesBack2U) {
currentTempo = tempoBack2U;
currentOctaveOffset = 1;
startPlaying(notesBack2U, beatsBack2U, songLengthBack2U);
}
} else {
lcd.setCursor(0, 0);
lcd.print("northwinds ");
if (!isPlaying || currentNotes != notesNorthWinds) {
currentTempo = tempoNorthWinds;
currentOctaveOffset = -1;
startPlaying(notesNorthWinds, beatsNorthWinds, songLengthNorthWinds);
}
}
}
// Kontrollime, kas on aeg järgmine noot mängida
updateMelody();
}
// Funktsioon uue loo mängimiseks
void startPlaying(const char* notes, int* beats, int length) {
currentNotes = notes;
currentBeats = beats;
currentSongLength = length;
currentNoteIndex = 0;
noteStartTime = millis();
isPlaying = true;
playNote(currentNotes[currentNoteIndex], currentBeats[currentNoteIndex]);
}
// Kontrollib, kas on aeg järgmine noot mängida
void updateMelody() {
if (!isPlaying) return;
unsigned long currentTime = millis();
int noteDuration = currentBeats[currentNoteIndex] * currentTempo;
if (currentTime - noteStartTime >= (unsigned long)noteDuration) {
currentNoteIndex++;
if (currentNoteIndex >= currentSongLength) {
currentNoteIndex = 0; // Algab uuesti algusest
}
noteStartTime = currentTime;
playNote(currentNotes[currentNoteIndex], currentBeats[currentNoteIndex]);
}
}
// Mängib ühe noodi või pausi
void playNote(char note, int beat) {
if (note == ' ') {
noTone(buzzerPin); // Vaikus
} else {
tone(buzzerPin, frequency(note, currentOctaveOffset), beat * currentTempo);
}
}
// Arvutab sageduse, arvestades oktavi nihet
int frequency(char note, int octaveOffset) {
const int numNotes = 8;
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int baseFrequencies[] = {262, 294, 330, 349, 392, 440, 494, 523};
for (int i = 0; i < numNotes; i++) {
if (names[i] == note) {
int freq = baseFrequencies[i];
if (octaveOffset > 0) return freq << octaveOffset; // Suurem oktav
if (octaveOffset < 0) return freq >> -octaveOffset; // Väiksem oktav
return freq;
}
}
return 0;
}
Video
Kasutamisvõimalused tavaelus
1. Liikumisanduriga äratuskell või valveseade
- Kui toas on pime või liikumine tuvastatakse, hakkab kõlar mängima häiresignaali.
- Saab kasutada näiteks öise turvalisuse või valvefunktsioonina, kui keegi siseneb ruumi.
2. Interaktiivne muusikakast või mänguasi
- Erinevad sensorid (valgus, potentsiomeeter) määravad, milline meloodia mängib.
- Lastele mõeldud hariv helimänguasi või sensoripõhine muusikaline installatsioon.
