6 Buzzeri kasutamine


6.1 Katse Buzzer


Komponeendid:

https://www.tinkercad.com/things/5eXG6nsriJI-glorious-bojo
// 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); 

}

Kood mängib meloodiat, kasutades Arduino tone() käsku, et esitada erinevaid noote (nt c, d, e jne) vastava sagedusega. Noodid ja pausid on määratud massiividesse notes[] ja beats[]. Kiirus (tempo) määrab, kui kiiresti noodid mängitakse. frequency() funktsioon tagastab iga noodi sageduse. Kõlar on ühendatud pinni 9 kaudu. Kood mängib meloodiat ja kordab seda lõpmatuseni.


6.2 DHT11 andur


#include <DHT.h>

#define DHTPIN 2        // signaal Arduino D2-s
#define DHTTYPE DHT22   // määrame õigeks tüübiks DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();

  if (isnan(temp) || isnan(hum)) {
    Serial.println("Anduri lugemine ebaõnnestus!");
    return;
  }

  Serial.print("Temperatuur: ");
  Serial.print(temp);
  Serial.print(" °C | Niiskus: ");
  Serial.print(hum);
  Serial.println(" %");

  delay(2000);
}
https://wokwi.com/projects/430475746125208577

DHT22 andur on ühendatud Arduino D2 piniga (signaal), VCC → 5V ja GND → GND. Kasutatakse DHT raamatukogu. Koodis määratakse anduri tüüp DHT22 ja signaalipiniks D2. setup() algatab seriellühenduse ja alustab anduri tööd. loop() loeb temperatuuri ja niiskuse väärtused, kuvades need iga 2 sekundi järel. Kui lugemine ebaõnnestub, kuvatakse viga.

Ülesanne 6 Buzzeri kasutamine “Väike Alarm Süsteem”

Eesmärk:

Luua mikrokontrolleripõhine süsteem, mis mõõdab erinevaid keskkonnanäitajaid (temperatuur, valgus, niiskus) ning reageerib reaalajas helide ja ekraaniteavitustega, pakkudes kasutajale visuaalset ja kuuldavat tagasisidet.


Kasutatud komponeendid:

Andurite mõõtmine:

  • Temperatuur: TMP36
  • Valgustugevus: Fototakisti (LDR)
  • Niiskus: Lisatav vastavalt valitud andurile

LCD-ekraan:

  • Kuvab andurite reaalajas mõõdetud väärtused (nt „Temp: 17°C Valgus: 200“)

Heliline tagasiside:

  • Ohtlik olukord:
    • Temperatuur > 20°C või valgus < 200
    • LCD-ekraanile kuvatakse hoiatus
    • Taustamuusika peatub
    • Buzzer mängib alarmi (nt SOS-signaal)
  • Normaalne olukord:
    • Buzzer mängib vaikset taustamuusikat (tone() funktsioon)

Süsteemi juhtimine:

  • Potentsiomeeter või lüliti (nt analogRead() väärtus > 500 = süsteem sees)

Lisafunktsioonid (valikuline):

  • Ekraanile ilmub teade: “Tuvastatud pimedus” (valgus < 100)
  • Nupp häire vaigistamiseks
  • Erinevad meloodiad (tone(pin, freq, kestus))

analogRead() – loeb analoogandmeid anduritelt. Näiteks temperatuur või valgusanduri väärtused.

tone(pin, freq, duration) – saadab piezo buzzerile kindla helisageduse ja kestuse, mida kasutatakse nii muusika kui ka häiresignaali loomiseks.

noTone(pin) – peatab helisignaali mängimise määratud pin-il.

lcd.begin(cols, rows) – initsialiseerib LCD-ekraani.

lcd.setCursor(x, y) – määrab, kuhu ekraanil teksti kuvatakse (veerg ja rida).

lcd.print() – kuvab teksti LCD-ekraanil.

millis() – tagastab aja millisekundites pärast Arduino tööle hakkamist. Kasutatakse andmete värskendamiseks ilma delay()-ta.

delay(ms) – peatab programmi kindlaks ajaks.

Töö kirjeldus:

Süsteemi eesmärk on jälgida ümbritsevat keskkonda ja reageerida, kui tuvastatakse ohtlik olukord. Näiteks, kui temperatuur ületab kindla piiri või valgustase on väga madal. LCD-ekraanil kuvatakse kogu info reaalajas. Kui kõik näidud on normis, kostub rahulik meloodia. Häire korral katkeb muusika ja kostub alarm. Süsteem töötab ainult pimedas ja see funktsioon aitab näiteks vältida tarbetut töölehakkamist päevasel ajal.

Ühendamise skeem:

https://www.tinkercad.com/things/dPe9puyrKq9-daring-amberis-jaban
#include <LiquidCrystal.h>

// LCD подключения: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

int buzzer = 7;
int tempPin = A1;
int ldrPin = A2;

bool alarmActive = false;
bool isLightOn = false; // Флаг для отслеживания состояния освещенности

unsigned long previousMillis = 0; // Переменная для отслеживания времени
const long interval = 200; // Интервал для обновления данных (200 мс)
const int lightThreshold = 500; // Порог освещенности, при котором программа будет работать

// Диапазон температур, при которых сигнализация НЕ будет срабатывать
const float minTemp = 16.0;
const float maxTemp = 20.0;  // Установите максимальное значение на 30°C

void setup() {
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);  // Настройка LCD экрана
  delay(200);  // Небольшая задержка на инициализацию LCD
  Serial.begin(9600);  // Инициализация серийного порта

  // Тестирование дисплея
  lcd.print("LCD test...");
  delay(500);  // Быстрая задержка для теста
  lcd.clear();
}

void loop() {
  unsigned long currentMillis = millis();  // Получаем текущее время

  // Чтение уровня освещенности
  int lightLevel = analogRead(ldrPin);

  // Если светло, программа не должна работать
  if (lightLevel > lightThreshold) {
    if (!isLightOn) { // Проверяем, если свет только что включился
      lcd.clear();  // Очищаем дисплей, чтобы не было мигания
      lcd.setCursor(0, 0);
      lcd.print("It's light, OFF!");
      isLightOn = true; // Помечаем, что свет включен
    }
    noTone(buzzer);  // Останавливаем звук, если светло
    alarmActive = false;  // Сбрасываем активность тревоги
    return;  // Выход из функции loop
  }

  // Если свет выключен, проверяем, нужно ли обновить данные
  if (lightLevel <= lightThreshold) {
    if (isLightOn) { // Если только что стало темно, очищаем экран
      lcd.clear();
      isLightOn = false; // Сбрасываем флаг, что свет был включен
    }

    // Если прошло достаточно времени, обновляем данные
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;

      // Чтение температуры
      float temp = analogRead(tempPin) * (5.0 / 1023.0); // TMP36: напряжение
      temp = (temp - 0.5) * 100; // Конвертация в Цельсии

      // Дополнительная информация для серийного монитора
      Serial.print("Temp: ");
      Serial.print(temp);
      Serial.print(" C  Light: ");
      Serial.println(lightLevel);

      // Обновление LCD
      lcd.setCursor(0, 0);
      lcd.print("Temp: ");
      lcd.print(temp, 1);
      lcd.print((char)223); // Символ градуса
      lcd.print("C   ");

      lcd.setCursor(0, 1);
      lcd.print("Light: ");
      lcd.print(lightLevel);

      // Если температура меньше 16°C или больше 30°C, активируем сигнализацию
      if (temp < minTemp || temp > maxTemp) {
        if (!alarmActive) {
          alarmSignal(); // Запускаем сигнал тревоги
          alarmActive = true;
          playBackgroundMusic(); // Воспроизводим фоновую музыку
        }
      } else {
        // Если температура в диапазоне от 16°C до 30°C, сигнализация не срабатывает
        if (alarmActive) {
          noTone(buzzer);  // Останавливаем звук
          alarmActive = false;
        }
      }
    }
  }
}

// Функция для проигрывания фоновой музыки
void playBackgroundMusic() {
  tone(buzzer, 440, 500); // A4
  delay(500);
  tone(buzzer, 494, 500); // B4
  delay(500);
  tone(buzzer, 523, 500); // C5
  delay(500);
  noTone(buzzer);
}

// Функция для активации сигнализации
void alarmSignal() {
  for (int i = 0; i < 3; i++) {
    tone(buzzer, 1000, 200);
    delay(250);
  }
  for (int i = 0; i < 3; i++) {
    tone(buzzer, 1000, 500);
    delay(600);
  }
  for (int i = 0; i < 3; i++) {
    tone(buzzer, 1000, 200);
    delay(250);
  }
}

Video:

Kasutamisvõimalused tavaelus:

See süsteem võiks olla kasulik näiteks:

  • Täpse temperatuuri ja valguse jälgimiseks kodus, aianduses või töökohal.
  • Kohandatud turvasüsteemina, kus liigne temperatuur või pimedus võib tähendada näiteks tulekahju või rünnaku ohtu.
  • Koduses õhkkonnas jälgimiseks, näiteks kas temperatuur on liiga kõrge või kui valgus on liiga madal (näiteks teatud valgustingimustes töötamine või unetunne).