|et

Teema 6: BUZZER

Komponeendid:

Skeem:

Kood:

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

}

🌡️ DHT11 / DHT22 – Temperatuuri ja õhuniiskuse andurid

DHT-andureid kasutatakse sageli Arduino projektides õhutemperatuuri ja niiskuse mõõtmiseks.

🔹 DHT11

  • Temperatuur: 0–50°C, täpsus ±2°C
  • Niiskus: 20–90%, täpsus ±5%
  • Digitaalne andmeedastus (1 pin)
  • Ühendused: VCC (5V), DATA (nt D2), GND

📌 Eesti keeles:
Ühenda andur:

  • VCC → 5V
  • DATA → D2
  • GND → GND

📌 По-русски:
Подключение:

  • VCC → 5V
  • DATA → D2
  • GND → GND

🔹 DHT22 (AM2302)

  • Temperatuur: -40°C kuni +80°C, täpsus ±0.5°C
  • Niiskus: 0–100%, täpsus ±2–5%
  • Vajab samuti ainult ühte digitaalset pinni
  • 3 või 4 pinni (4. pin võib olla NC – не подключен)

✅ Koodinäide (DHT11 ja DHT22 jaoks sobib sama kood – muuda ainult DHTTYPE)

#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11 // Või 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);
}

🧩 Kasulik:

Eesti keeles: Kontrolli, et andur on õigesti ühendatud ja anduri tüüp (#define) on õige.
По-русски: Убедись, что датчик подключен правильно и указан нужный тип (DHT11 или DHT22).

Ülesanne 6 Buzzeri kasutamine «Väike Alarm Süsteem»

Kasutatud komponendid / Использованные компоненты

1. Mikrokontroller / Микроконтроллер

  • Arduino (Uno/Nano) – projekti «aju», mis juhib kõiki andureid ja väljundeid.
  • Ардуино (Uno/Nano) – «мозг» проекта, управляет всеми датчиками и выходами.

2. Temperatuuriandur / Датчик температуры

  • TMP36 – analoogandur temperatuuri mõõtmiseks (toitevool: +5V, signaal: A1).
  • TMP36 – аналоговый датчик для измерения температуры (питание: +5V, сигнал: A1).

3. Valgusandur (valikuline) / Датчик освещенности (опционально)

  • Fotoresistor (LDR) + takisti (10kΩ) – mõõdab valgustaset (A0).
  • Фоторезистор (LDR) + резистор (10кΩ) – измеряет уровень освещенности (A0).

4. Heliindikaator / Звуковой индикатор

  • Piezo-buzzer (või passiivne summer) – teavitab ülekuumenemisest (13. pin).
  • Пьезо-зуммер (или пассивный динамик) – сигнализирует о перегреве (пин 13).

5. Ekraan / Дисплей

  • LCD 16×2 (või 20×4) – näitab temperatuuri ja süsteemi olekut (ühendatud: 12,11,5,4,3,2).
  • LCD 16×2 (или 20×4) – отображает температуру и состояние системы (подключение: 12,11,5,4,3,2).

6. Nupp / Кнопка

  • Tavaline lülitusnupp – süsteemi sisse/välja lülitamiseks (7. pin + GND).
  • Тактовая кнопка – включает/выключает систему (пин 7 + GND).

7. Tarvikud / Дополнительные элементы

  • Takistid (220Ω LED jaoks, 10kΩ LDR jaoks) – kaitsmiseks liigse voolu eest.
  • Резисторы (220Ω для светодиода, 10кΩ для LDR) – защита от перегрузки.
  • Jootmata leheplaadid (breadboard) + ühendusjuhtmed – komponentide ühendamiseks.
  • Макетная плата + соединительные провода – для подключения компонентов.

Projekti tööpõhimõte / Принцип работы проекта

  1. TMP36 mõõdab temperatuuri ja saadab andmed Arduinosse.
  2. Kui temperatuur >30°C või <16°C, käivitub buzzer (alarm).
  3. LCD ekraan näitab reaalajas temperatuuri (°C).
  4. Nupp (7. pin) lülitab ekraani ja alarmi sisse/välja.

NB! Kui valgusandur on kasutusel, võib süsteem reageerida ka valgusele (nt välja lülituda, kui on valge).
Примечание: Если используется датчик освещения, система может реагировать на свет (например, выключаться при ярком освещении).

kood:

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

skeem:

Video:

https://drive.google.com/file/d/1ZFKItaB3AMkzs75_4JHvNUqD8a9CR76q/view?usp=sharing