Teema 6: BUZZER

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

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: