Teema 6: BUZZER

Katse 6.1.

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

}

const int songLength = 18; — Määrab laulu pikkuse, ehk kui palju noote laulus on. Siin on 18 nooti. // Определяет длину мелодии, то есть количество нот в песне. Здесь 18 нот.

char notes[] = "cdfda ag cdfdg gf "; — See on string, mis sisaldab noote. Tähed vastavad nootidele ja tühik on paus. // Это строка, содержащая ноты. Буквы соответствуют нотам, а пробел представляет паузу.

int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2}; — Rütm, mis määrab iga noodi kestuse. Arvud tähistavad nootide väärtusi: 1 — veerand, 4 — täisnoot, 2 — poole noodi kestus jne. // Ритм, который определяет длительность каждой ноты. Числа обозначают длительности нот: 1 — четвертная, 4 — целая, 2 — половинная и так далее.

int tempo = 150; — Määrab meloodia tempo // Определяет темп мелодии.

for (i = 0; i < songLength; i++)
{
duration = beats[i] * tempo; —
Silmus, mis läbib iga noodi, alustades esimesest ja lõpetades viimasega (songLength pikkus). Kestus arvutatakse vastavalt noodi väärtusele (beats[i]) ja tempole. // Цикл, который проходит по каждой ноте, начиная с первой и заканчивая последней (songLength). Продолжительность вычисляется в зависимости от значения ноты (beats[i]) и темпа.

if (notes[i] == ‘ ‘)
{
delay(duration); —
Kui tähemärk on tühik (paus), siis programm ootab määratud kestuse (duration). // Если символ — пробел (пауза), программа делает задержку на рассчитанную продолжительность (duration).
}

else
{

tone(buzzerPin, frequency(notes[i]), duration); — Kui tähemärk pole tühik, siis mängitakse nooti määratud sagedusel (tone()) ja kestusel. // Если символ не пробел, то воспроизводится нота с определенной частотой (tone()) и продолжительностью.
delay(duration);
}

delay(tempo/10); — Pärast iga nooti on väike paus (tempo/10), et eraldada noodid üksteisest. // После каждой ноты делается маленькая пауза (tempo/10), чтобы разделить ноты друг от друга.

Katse 6.2.

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

include DHT.h — Подключаем библиотеку // Lisame teegi

define DHTPIN 2 — Määrame, et andur on ühendatud Arduino D2 jalaga // Определяем, что датчик подключён к пину D2 на Arduino

define DHTTYPE DHT11 — Määrame, et kasutame DHT11 tüüpi andurit. // Указываем, что используем датчик типа DHT11

DHT dht(DHTPIN, DHTTYPE); — Loome objekti dht, määrates anduri jala ja tüübi. // Создаём объект dht, указывая пин и тип датчика

dht.readTemperature(); — loeme temperatuuri // считываем температуру

dht.readHumidity(); — loeme õhuniiskust. // считываем влажность.

if (isnan(temp) || isnan(hum)) {
Serial.println(«Anduri lugemine ebaõnnestus!»); — Kontrollime, kas andur tagastas vea (NaN).Kui jah, kuvame veateate ja katkestame funktsiooni // Проверяем, не вернул ли датчик ошибку (NaN).Если ошибка, выводим сообщение и выходим из функции.

———————————-Buzzeri kasutamine «Väike Alarm Süsteem»—————————————

Töö kirjeldus:

Meteostatsioon koos häirega. See mõõdab temperatuuri TMP-anduriga ja valgustugevust fotoresistori abil. Kõik andmed kuvatakse LCD-ekraanil. Süsteem lülitatakse sisse potentsiomeetri abil. Kui temperatuur langeb alla 25 °C, käivitub häire, mängides pala keiserlikust marssist. Normaalse temperatuuri korral ei mängita midagi.

Kasutatud komponenid:

Arduino UNO plaat (1tk)
Arendusplaat (1tk)
Juhtmed (25tk)
Takisti (2tk, 220Om ja 10000Om)
PHOTORESISTOR (1tk)
Temperature Sensor TMP (1tk)
Potentiometer (1tk)

LCD ekraan 16×2 (1tk)
Buzzer (1tk)

Töö protsess:

Temperatuuri mõõdetakse TMP-anduriga ja valgustust fotoresistori abil. Kõik andmed kuvatakse LCD-ekraanil Temperatuur: ja C | Valgus: . Süsteem lülitatakse sisse potentsiomeetri abil, kui režiim on välja lülitatud, näitab ekraan System off ja kui see on sisse lülitatud, näitab see kõike. Kui temperatuur langeb alla 25 °C, käivitub häire, mängides meloodiat „Imperial March“. Kui temperatuur on normaalne, ei mängita midagi.

LED-ide rakendamine:

Temperatuuri ja valguse kontrollimine tööks. Täpseks kontrollimiseks on olemas häiresüsteem!

Skeem:

Programm:

#include <LiquidCrystal.h>

// LCD: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(11, 12, 4, 5, 6, 7);

// Pins
const int potPin   = A3;
const int tempPin  = A4;
const int ldrPin   = A5;
const int alarmPin = 9;   // signalisatsioon

const int switchThreshold = 512;   // Potentsiomeeter > 512 → sisse
const float tempThreshold = 25.0;  // Häiretemperatuur

// Keiserlik marss
int melody[] = {
  440, 440, 440, 349, 523, 440, 349, 523, 440,
  659, 659, 659, 698, 523, 415, 349, 523, 440
};
int noteDurations[] = {
  500, 500, 500, 350, 150, 500, 350, 150, 650,
  500, 500, 500, 350, 150, 500, 350, 150, 650
};

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(alarmPin, OUTPUT);
}

void loop() {
  int controlVal = analogRead(potPin);
  bool systemOn = controlVal > switchThreshold;

  if (!systemOn) {
    noTone(alarmPin);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("System off");
    delay(500);
    return;
  }

  // Temperatuuri näitamine
  int rawTemp = analogRead(tempPin);
  float voltage = rawTemp * 5.0 / 1023.0;
  float tempC = (voltage - 0.5) * 100.0;

  // Valguse lugemine
  int lightRaw = analogRead(ldrPin);
  int lux = map(lightRaw, 200, 900, 0, 1000);
  lux = constrain(lux, 0, 1000);

  // Väljundi kuvamine
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(tempC, 1);
  lcd.print((char)223);
  lcd.print("C");

  lcd.setCursor(0, 1);
  lcd.print("Light: ");
  lcd.print(lux);
  lcd.print(" lx");

  Serial.print("Temperatur: "); Serial.print(tempC);
  Serial.print(" C | Light: "); Serial.println(lux);

  if (tempC > tempThreshold) {
    playImperialMarch();
  } else {
    noTone(alarmPin);
  }

  delay(2000); // paus mõõtmiste vahel
}

void playImperialMarch() {
  for (int i = 0; i < sizeof(melody) / sizeof(int); i++) {
    tone(alarmPin, melody[i], noteDurations[i]);
    delay(noteDurations[i] * 1.3);
    noTone(alarmPin);
  }
}

Video:

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

Uued funktsioonid :

noTone(pin) — Lõpetab igasuguse heli mängimise määratud pordis. // Останавливает воспроизведение звука на указанном пине.

playImperialMarch() — Funktsioon, mis mängib lihtsustatud versiooni Keiserlikust marsist. Iga noot mängitakse kindla pikkusega ja väikese viitega. // Функция, которая проигрывает упрощённую версию Имперского марша. Каждая нота звучит определённое время с паузой между.

map(lightRaw, 200, 900, 0, 1000) — teisendab LDR-i toorväärtuse vahemikust 200–900 uueks vahemikuks 0–1000, et seda oleks lihtsam kuvada «lüksidena». // переводит значение освещённости из диапазона 200–900 в условный диапазон 0–1000 (для отображения в «люксах»)

constrain(lux, 0, 1000) — tagab, et väärtus ei läheks alla 0 ega üle 1000. // ограничивает результат, чтобы он не вышел за границы 0–1000.

tone(pin, freq, duration) — Mängib helisignaali kindlal sagedusel ja kestusel. // Воспроизводит звуковой сигнал на заданной частоте и длительности.


Warning: Undefined array key "sfsi_facebook_display" in /data01/virt140713/domeenid/www.martinrossakov24.thkit.ee/htdocs/wp/wp-content/plugins/ultimate-social-media-icons/libs/controllers/sfsiocns_OnPosts.php on line 450