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 / Принцип работы проекта
- TMP36 mõõdab temperatuuri ja saadab andmed Arduinosse.
- Kui temperatuur >30°C või <16°C, käivitub buzzer (alarm).
- LCD ekraan näitab reaalajas temperatuuri (°C).
- 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: