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

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

}

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

Projektiülesanne: Väike Alarm Süsteem

Uuritud funktsioonid

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.

Kasutatud komponeendid:

Arduino Uno

TMP36 temperatuuriandur

LDR valgusandur

LCD-ekraan 16×2

Piezo buzzer

Juhtmed ja takistid

Ühendamise skeem:

https://www.tinkercad.com/things/d051P4Xdc2K-alarm

Programm:

#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).