Skip to content
Home » Buzzer ülesanne konspekt

Buzzer ülesanne konspekt


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 massiivist frequencies[].

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 ' ', teeb noTone(), muidu arvutab sageduse ja mängib seda tone() 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.