6. Teema: Buzzer

6 Katse Buzzer

// 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

See on väike nutikas häiresüsteem, mis mõõdab temperatuuri ja valgust ning annab heli ja tekstiga märku, kui midagi on valesti (näiteks liiga palav või liiga pime). Kui kõik on korras, mängib buzzeriga meloodiat.

Kasutatud komponenid

Arduino UNO

LCD-ekraan

TMP36

LDR (valgusandur)

Buzzer

Potentsiomeeter / lüliti

Juhtmed ja takistid

Töö protsess:

  1. Ühendame kõik andurid, buzzeri ja LCD-ekraani Arduino külge.
  2. Kui lüliti on “sees”, süsteem hakkab tööle.
  3. Ekraanil näeme temperatuuri ja valguse taset.
  4. Kui temperatuur on liiga kõrge või valgus liiga tugev → buzzer annab häire.
  5. Kui kõik on korras:
    • Kui on valge → buzzer mängib üks heli
    • Kui on pime → buzzer mängib teine heli
  6. Kui süsteem on “väljas”, ekraanil on kiri: Süsteem: OFF ja buzzer vaikib.

Kasutamisvõimalused tavaelus

  • Lastetoas – annab märku, kui ruum on liiga palav või valgust pole
  • Kasvuhoones – aitab jälgida, et temperatuur ei läheks liiga kõrgeks
  • Vanas inimese toas – lihtne alarm, kui tingimused pole sobivad
  • Öine turvaseade – buzzer annab märku, kui ruumis muutub valgus (liikumine)

Skeem:

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 REST 0  // Пауза в мелодии

// Мелодия: свадебный марш
int calm_melody[] = {
  // Тут очень длинный список нот
  // Он будет проигрываться, когда всё нормально и светло
};

int calm_durations[] = {
  // Тут длительности нот, соответствующие calm_melody
};

// Пины (куда подключены компоненты)
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
};

// Символ Õ (для sõsteem)
byte taht[8] = {
  0b01010,
  0b00000,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};

void setup() {
  pinMode(buzzer, OUTPUT);         // Буззер — на выход
  lcd.begin(16, 2);                // Включаем дисплей 16x2
  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++) {

    // Перед каждой нотой проверяем, нет ли тревоги
    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;
    }

    // Обновляем дисплей во время музыки
    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("   ");

    // Проигрываем ноту
    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);

    // Печатаем в монитор
    Serial.print("Temp: ");
    Serial.print(degreesC);
    Serial.print(" C |  Light: ");
    Serial.println(lightLevel);

    // Обновляем дисплей
    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("   ");

    // Проверяем тревожные условия
    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 {
    // Если система выключена — покажи OFF
    noTone(9);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("S");
    lcd.write(byte(2)); // Õ
    lcd.print("stem: OFF");      
  }

  delay(1000);  // Ждём 1 секунду
}

Video: