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:

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 440Makro, 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

https://www.tinkercad.com/embed/fVXqUYUwyGk?editbtn=1

Skeem

Video

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);
}