Buzzer

6.1 Katse (Buzzer)

Используемые компоненты:

  • Arudiono Uno 1 шт
  • Плата 1 шт
  • Пьезо-элемент 1 шт
  • Провода 4 шт

Схема соединения:

Код:

// 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 Katse (DHT11 andur)

Используемые компоненты:

  • Arudiono Uno 1 шт
  • Плата 1 шт
  • Резистор
  • Датчик температуры и влажности 1 шт
  • Провода 6 шт

Схема соединения:

Код:

DHT11 (ülal)

#include &lt;DHT.h>

#define DHTPIN 2        // signaal Arduino D2-s
#define DHTTYPE DHT11   // määrame anduri tüübi

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

DHT22 (all)

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

Пояснение кода:

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

Описание работы:

Создать умную миниатюрную систему сигнализации, которая собирает данные с различных датчиков, выводит их на ЖК-экран и подает звуковые сигналы зуммером в зависимости от ситуации. Систему можно активировать и деактивировать с помощью переключателя или потенциометра. В обычных условиях в фоновом режиме играет музыка, но в случае угрозы музыка останавливается, а зуммер подает сигнал тревоги.

Используемые компоненты:

  • Arudiono Uno 1 шт
  • Плата 1 шт
  • Температурный датчик 1 шт
  • Фоторезистор 1 шт
  • Резистор 220 Om 2 шт
  • Резистор 10 кOm 2 шт
  • Потенциометр 10 кОм 1 шт
  • Провода 28 шт
  • LCD экран 1 шт

Схема соединения:

Код:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
const int temperaturePin = A1;
const int lightPin = A0;
const int buzzerPin = 9;
 
float voltage, degreesC;
 
char* tempText[] = {
  "Cold weather!",     // < 15
  "Nice weather!",     // 15–25
  "Heat rising!",      // 25–30
  "Hot! Drink water!"  // >30
};
 
char* lightText[] = {
  "Sunny",    // < 85
  "Cloudy",   // 85–170
  "Rainy"     // >170
};
 
byte smile[8] = {
  0b00000, 0b01010, 0b01010, 0b00000,
  0b10001, 0b01110, 0b00000, 0b00000
};
 
byte rain[8] = {
  0b00100, 0b00100, 0b01010, 0b01010,
  0b10001, 0b10001, 0b10001, 0b01110
};
 
byte degrees[8] = {
  0b01110, 0b01010, 0b01110, 0b00000,
  0b00000, 0b00000, 0b00000, 0b00000
};
 
byte sun[8] = {
  0b00100, 0b01010, 0b11111, 0b11111,
  0b00100, 0b00100, 0b00000, 0b00000
};
 
byte sad[8] = {
  0b00000, 0b01010, 0b01010, 0b00000,
  0b01110, 0b10001, 0b00000, 0b00000
};
 
const int songLength = 18;
char notes[] = "cdfda ag cdfdg gf ";
int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2};
int tempo = 150;
 
void setup() {
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);
 
  lcd.begin(16, 2);
  lcd.createChar(1, degrees);
  lcd.createChar(2, smile);
  lcd.createChar(3, rain);
  lcd.createChar(4, sun);
  lcd.createChar(5, sad);
 
  lcd.setCursor(0, 0);
  lcd.print("Weather Station");
  lcd.setCursor(0, 1);
  lcd.print("Initializing...");
  delay(1000);
}
 
void loop() {
  // Считываем температуру (предполагаем LM35 или аналогичный)
  voltage = analogRead(temperaturePin) * 0.004882814;
  degreesC = (voltage - 0.5) * 100.0;
 
 
  // Считываем освещенность
  int lightLevel = analogRead(lightPin);
  lightLevel = map(lightLevel, 300, 800, 0, 255);
  lightLevel = constrain(lightLevel, 0, 255);
 
  Serial.print("Temp: ");
  Serial.print(degreesC);
  Serial.print(" C | Light: ");
  Serial.println(lightLevel);
 
  // Проверка тревоги: температура > 25 °C
  if (degreesC > 20) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("!!! ALARM !!!");
    lcd.setCursor(0, 1);
    lcd.print("Temp:");
    lcd.print(degreesC, 1);
    lcd.write(byte(1)); // значок градуса
    lcd.print("C");
 
    tone(buzzerPin, 1000);  // Постоянный тон
    delay(500);
    noTone(buzzerPin);
    delay(200);
  } else {
    noTone(buzzerPin);
    displayData(degreesC, lightLevel);
    playMelody();
  }
}
 
void displayData(float temp, int light) {
  char* tempTextToDisplay;
  if (temp < 15) tempTextToDisplay = tempText[0];
  else if (temp < 20) tempTextToDisplay = tempText[1];
  else if (temp < 30) tempTextToDisplay = tempText[2];
  else tempTextToDisplay = tempText[3];
 
  char* lightTextToDisplay;
  byte lightIcon;
 
  if (light > 170) {
    lightTextToDisplay = lightText[2];
    lightIcon = 3;
  } else if (light > 85) {
    lightTextToDisplay = lightText[1];
    lightIcon = 4;
  } else {
    lightTextToDisplay = lightText[0];
    lightIcon = 2;
  }
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(tempTextToDisplay);
  lcd.setCursor(14, 0);
  lcd.write(byte(1)); // значок градуса
 
  lcd.setCursor(0, 1);
  lcd.print(lightTextToDisplay);
  lcd.setCursor(strlen(lightTextToDisplay) + 1, 1);
  lcd.write(lightIcon);
 
  delay(2000);
}
 
void playMelody() {
  for (int i = 0; i < songLength; i++) {
    int duration = beats[i] * tempo;
    if (notes[i] == ' ') {
      delay(duration);
    } else {
      tone(buzzerPin, frequency(notes[i]), duration);
      delay(duration);
    }
    delay(tempo / 10);
  }
}
 
int frequency(char note) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int freqs[] = {262, 294, 330, 349, 392, 440, 494, 523};
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) return freqs[i];
  }
  return 0;
}

Пояснение кода:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Подключается библиотека LiquidCrystal, управляющая LCD-дисплеем 16×2. Указаны пины подключения: RS=12, E=11, D4=5, D5=4, D6=3, D7=2.

const int temperaturePin = A1;
const int lightPin = A0;
const int buzzerPin = 9;

A1 — пин подключения датчика температуры.
A0 — датчик освещённости (например, фоторезистор).
9 — пин для подключения пьезоизлучателя.

float voltage, degreesC;

Переменные для хранения напряжения и пересчитанной температуры.

char* tempText[] = { ... };
char* lightText[] = { ... };

Массивы строк для отображения описаний температуры и освещённости.

byte smile[8] = { ... };
byte rain[8] = { ... };
...

Создаются пользовательские символы (иконки) для отображения на дисплее: смайлик, дождь, солнце, грусть и значок градуса. Каждый символ задан массивом из 8 байт, описывающим пиксели 5×8.

char notes[] = "cdfda ag cdfdg gf ";
int beats[] = { ... };
int tempo = 150;

Массив notes содержит символы нот, beats — длительность каждой ноты, tempo — базовая скорость воспроизведения.

void setup() {
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);
  lcd.begin(16, 2);
  lcd.createChar(...);
  lcd.setCursor(...);
  lcd.print(...);
  delay(1000);
}

Инициализируется последовательный порт.
Устанавливается режим пина пищалки.
Запускается LCD и загружаются пользовательские символы.
Отображается начальное сообщение “Weather Station” / “Initializing…”.

voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;

Считывается аналоговое значение с датчика температуры, пересчитывается в напряжение и далее — в градусы Цельсия (предполагается LM35/LM335).

int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);

Считывается уровень света, преобразуется к диапазону 0–255.

if (degreesC > 20) {
    ...
    tone(buzzerPin, 1000);
    delay(500);
    noTone(buzzerPin);
    delay(200);
} else {
    ...
}

Если температура превышает 20°C, включается звуковая тревога и отображается предупреждение на дисплее. Иначе отображаются данные и воспроизводится мелодия.

void displayData(float temp, int light)

Определяет текст описания температуры и освещённости в зависимости от диапазона.
Отображает на дисплее строку с описанием температуры (1-я строка) и освещённости (2-я строка).
Также отображаются соответствующие иконки (градусы, солнце и т.д.).

playMelody()
  • Проходит по массиву нот:
    • Задержка между нотами зависит от tempo и beats.
    • Если символ ноты — пробел, воспроизводится пауза.
    • Иначе — воспроизводится соответствующая частота через tone().
int frequency(char note)

Возвращает частоту в Гц для указанной ноты (латинская буква). Используется для преобразования символа в соответствующую звуковую частоту.

Процесс работы:

Программа представляет собой простую метеостанцию, реализованную на платформе Arduino. Она измеряет температуру воздуха и уровень освещённости, отображает соответствующую информацию на LCD-дисплее, а также включает звуковое оповещение при повышенной температуре.

Инициализация компонентов

При запуске устройства происходит настройка:

  • запускается серийный порт для передачи данных на компьютер
  • задаются режимы работы пинов
  • инициализируется LCD-дисплей
  • в память дисплея загружаются пользовательские символы
  • на экран выводится приветственное сообщение.

Чтение данных с датчиков

В основном цикле программа:

  • считывает значение с температурного датчика, пересчитывает его в градусы Цельсия;
  • получает данные с фоторезистора и переводит уровень освещённости в шкалу от 0 до 255.

Анализ и реагирование

Если температура превышает определённый порог, включается тревожный режим:

  • на экране появляется предупреждение;
  • срабатывает звуковой сигнал (пищалка).

Если температура в пределах нормы, данные выводятся на дисплей:

  • в первой строке — описание состояния погоды по температуре;
  • во второй строке — информация об освещённости;
  • отображаются соответствующие иконки.

Обобщение

Таким образом, система:

  • автоматически измеряет температуру и освещённость;
  • анализирует полученные значения;
  • реагирует на критические значения температурой звуковым сигналом;
  • информирует пользователя визуально на дисплее;
  • использует дополнительные элементы (иконки и мелодию) для улучшения восприятия данных.

Программа демонстрирует принципы интеграции датчиков, вывода на дисплей, пользовательских символов и простого звукового оповещения.

Видео:

Применение пьезо-элемента в разных проектах:

Учебные и хобби-проекты

  • Погодная тревога — пищалка срабатывает при перегреве или заморозках.
  • Секундомер с сигналом — подаёт звуковой сигнал при старте/остановке отсчёта.
  • Тестовая мелодия Arduino — проигрывание простых мелодий на кнопке.
  • Игра «Угадай мелодию» — распознавание мелодий на слух, обратная связь через звук.
  • Звуковой индикатор нажатий — подтверждение клика/выбора в меню.

Умный дом

  • Оповещение о температуре — звуковой сигнал при перегреве в комнате.
  • Сигнализация окна/двери — срабатывание buzzer при открытии.
  • Система утечки газа — аварийный звуковой сигнал.
  • Напоминание о поливе — звуковое оповещение по расписанию или по датчику влажности.
  • Интерактивный дверной звонок — собственная мелодия при нажатии кнопки.

Автомобильные проекты

  • Сигнализация авто — срабатывание звука при попытке проникновения.
  • Система парковки — увеличение частоты сигнала по мере приближения к препятствию.
  • Напоминание о включённых фарах — звуковой сигнал при выходе из машины с фарами.
  • Перегрев двигателя — предупреждающий звук при превышении температуры.
  • Диагностика авто — звуковая индикация ошибок или режимов.

Робототехника и мехатроника

  • Голосовой стиль робота — звуковые «реплики» в зависимости от режима.
  • Режим «боевой тревоги» — сигнал при обнаружении противника или начала атаки.
  • Звуковая диагностика — звуковая индикация ошибок при инициализации.
  • Обратная связь управления — звук при переключении режимов движения.
  • Мелодия приветствия — проигрывается при включении робота.

Арт и инсталляции

  • Реакция на приближение — короткий звук при приближении зрителя.
  • Интерактивная картина — проигрывание нот при нажатии сенсорных зон.
  • Мелодия рассвета — автоматическое включение музыки утром.
  • Звуковая скульптура — генерация тона в зависимости от освещённости.
  • Музейный экспонат — звуковое сопровождение при активации.

Научные и лабораторные приборы

  • Тревога превышения температуры — сигнал при превышении допустимого значения.
  • Интервальный таймер — звуковое уведомление о завершении измерений.
  • Сигнал завершения логгирования — короткий звук при окончании записи данных.
  • Обнаружение радиации — каждый импульс с датчика Гейгера сопровождается щелчком.
  • Пороговый сигнализатор — оповещение при достижении заданного порога (напряжение, pH и др.).