Ülesanne #1

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (3tk)
  • 330 Ω takisti (1tk)
  • LED (1tk)
// 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;
}

Väike Alarm Süsteem

Video

https://drive.google.com/file/d/1g9BDpNXn5zcFSvB7SvOwLLVo92z-cNkM/view?usp=sharing

Kirjeldus

Luua nutikas miniatuurne alarm süsteem, mis kogub andmeid erinevatelt sensoritelt, kuvab neid LCD-ekraanil, ning annab auditiivseid signaale buzzeri abil sõltuvalt olukorrast.

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (27tk)
  • 220 Ω Takisti (1tk)
  • 10 kΩ Takisti (1tk)
  • Fotoresistor (1tk)
  • Temperatuuriandur (1tk)
  • Piezo element (1tk)
  • Slideswitch (1tk)
  • Potentiometer (1tk)

Uuritud funktsioonid

tone(pin, frequency)Teeb määratud pinnil (nt buzzeril) helisignaali kindla sagedusega. Näiteks tone(8, 440); mängib A4 nooti.
define NOTE_A4 440Makro, mis määrab noodi A4 sageduseks 440 Hz. Kasutatakse helide ja meloodiate koostamisel.
tone(pin, frequency, duration)Mängib heli etteantud sagedusega ja kestusega millisekundites. Näide: tone(8, 440, 500); mängib A4 nooti 0,5 sekundit.
tone(buzzer, calm_melody[note], duration)Mängib ühe noodi massiivist melody. note on indeks, duration määrab helikestuse.
noTone(pin)Lõpetab heli esitamise määratud pinnil. Kasutatakse pauside või heli lõpetamise jaoks.

Selgitus

LCD 16×2 juhtimiseks ühendame raamatukogu.

#include <LiquidCrystal.h>

Need on nootide sagedused, mis on vajalikud funktsiooni tone() jaoks.

#define NOTE_E2  82
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define REST 0

melody – noote jada, durations – iga noodi kestus(muusikaliste taktide stiilis: 4 = veerand, 8 = kaheksas jne).

int melody[] = {
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
 
  REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
  REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
  REST, NOTE_DS5, REST, NOTE_D5,
  NOTE_C5, REST,
 
  REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
  REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
  REST, NOTE_DS5, REST, NOTE_D5,
  NOTE_C5, REST,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
  REST, 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
 
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
  REST,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
 
  NOTE_C5, NOTE_G4, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_A4, NOTE_GS4, NOTE_AS4, NOTE_GS4,
  NOTE_G4, NOTE_D4, NOTE_E4
};
int durations[] = {
  8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4, 
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4,8, 8, 4,
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4,8, 8, 4,
 
  4, 8, 8, 8, 4, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4,
  2, 2,
 
  4, 8, 8, 8, 4, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4,
  2, 2,
 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
 
  8, 4, 8, 8, 8, 8, 8,
  1, 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8, 4,
  4, 4, 4, 4, 
  4, 8, 4, 4,
 
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4, 8, 8, 4,
 
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4, 8, 8, 4,
 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8, 8,
  1,
 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8, 4,
  4, 4, 4, 4, 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
 
  4, 4, 4,
  8, 8, 8, 8, 8, 8,
  8, 8, 2
};

Tuvastame tihvtid, millega piezo element, temperatuuriandur, valgusandur ja juhtnupp on ühendatud.

const int buzzer = 9;
const int temperaturePin = A1;
const int lightPin = A0;
const int controlPin = 6;

Loome muutujad, et salvestada temperatuurianduri pingeväärtused ja arvutatud väärtus kraadides.

float voltage, degreesC;

Lähtestame LCD-ekraani, näidates, milliste tihvtidega see on ühendatud.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Loome loogilise muutuja, et jälgida, kas süsteem on sisse lülitatud.

bool systemOn = false;

Loome oma sümboli kraadi kuvamiseks ekraanil, kasutades bitipõhist graafikat.

byte degrees[8] = {
    0b01110,
    0b01010,
    0b01110,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
};

Seadistame tihvtid, lähtestame ekraani ja Serial-pordi funktsioonis setup().

void setup() {
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);
  lcd.createChar(1, degrees);
  Serial.begin(9600);
}

Käivitame meloodia taasesituse.

void calm_music() {
  int size = sizeof(durations) / sizeof(int);
  for (int note = 0; note < size; note++) {
    float v = analogRead(temperaturePin) * 0.004882814;
    float t = (v - 0.5) * 100.0;
    int light = analogRead(lightPin);
    bool control = digitalRead(controlPin);

Kontrollime tingimusi, mille korral muusika peaks peatuma.

    if (t > 25 || light > 200 || !control) {
      noTone(buzzer);
      return;
    }

Kuvame praeguse temperatuuri ja valgustuse taseme LCD-ekraanil.

    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(t);
    lcd.write(byte(1));
    lcd.print("C   ");

    lcd.setCursor(0, 1);
    lcd.print("Valgus: ");
    lcd.print(light);
    lcd.print("   ");

Mängime praegust nooti ja teeme nootide vahel pausi.

    int duration = 1000 / durations[note];
    tone(buzzer, melody[note], duration);
    delay(duration * 1.3);
    noTone(buzzer);
  }
}

Alustame kontrollimisega, kas süsteem on sisse lülitatud.

void loop() {
  systemOn = digitalRead(controlPin);

Kui süsteem on sisse lülitatud, loeme anduritelt väärtusi.

  if (systemOn) {
    voltage = analogRead(temperaturePin) * 0.004882814;
    degreesC = (voltage - 0.5) * 100.0;
    int lightLevel = analogRead(lightPin);

Kuvame temperatuuri ja valguse väärtused sadamamonitoris.

    Serial.print("Temp: ");
    Serial.print(degreesC);
    Serial.print(" C |  Light: ");
    Serial.println(lightLevel);

Kuvame need andmed LCD-ekraanil.

    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(degreesC);
    lcd.write(byte(1));
    lcd.print("C   ");

    lcd.setCursor(0, 1);
    lcd.print("Valgus: ");
    lcd.print(lightLevel);
    lcd.print("   ");

Kui tingimused on ohtlikud (kuum ja pime), lülitame häire ja hoiatuse sisse.

    if (degreesC > 25 && lightLevel > 200) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("!!!!OHTU!!!!   ");

Kui ainult kuum – teatame sellest ekraanil ja lülitame signaali sisse.

    } else if (degreesC > 25) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 1);
      lcd.print("Liiga palav!!!   ");

Kui ainult pime – väljastame sõnumi ja väljastame helisignaali.

    } else if (lightLevel > 200) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("Liiga pime!!!   ");

Kui kõik on korras — helistame meloodia esitamiseks funktsioonile calm_music().

    } else {
      calm_music();
    }

Kui süsteem on välja lülitatud-tühjendame ekraani ja kuvame oleku “OFF”.

  } else {
    noTone(9);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SYSTEM: OFF");
  }

  delay(1000);
}

Kood

#include <LiquidCrystal.h>

#define NOTE_E2  82
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define REST 0

// meloodia nootide jada
int melody[] = {
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5,NOTE_C5, NOTE_D5, NOTE_B4,
 
  REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
  REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
  REST, NOTE_DS5, REST, NOTE_D5,
  NOTE_C5, REST,
 
  REST, NOTE_G5, NOTE_FS5, NOTE_F5, NOTE_DS5, NOTE_E5,
  REST, NOTE_GS4, NOTE_A4, NOTE_C4, REST, NOTE_A4, NOTE_C5, NOTE_D5,
  REST, NOTE_DS5, REST, NOTE_D5,
  NOTE_C5, REST,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
  REST, 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
 
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
 
  NOTE_C5, NOTE_G4, REST, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4,
  NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5,
  REST, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4,
 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5, NOTE_E5,
  REST,
 
  NOTE_C5, NOTE_C5, NOTE_C5, REST, NOTE_C5, NOTE_D5,
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_E5, REST, NOTE_E5, REST, NOTE_C5, NOTE_E5,
  NOTE_G5, REST, NOTE_G4, REST, 
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_D5, NOTE_A5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5,
 
  NOTE_E5, NOTE_C5, NOTE_A4, NOTE_G4,
  NOTE_E5, NOTE_C5, NOTE_G4, REST, NOTE_GS4,
  NOTE_A4, NOTE_F5, NOTE_F5, NOTE_A4,
  NOTE_B4, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5,
  NOTE_C5, NOTE_E4, NOTE_E4, NOTE_C4,
 
  NOTE_C5, NOTE_G4, NOTE_E4,
  NOTE_A4, NOTE_B4, NOTE_A4, NOTE_GS4, NOTE_AS4, NOTE_GS4,
  NOTE_G4, NOTE_D4, NOTE_E4
};

// iga noodi kestus
int durations[] = {
  8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4, 
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4,8, 8, 4,
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4,8, 8, 4,
 
  4, 8, 8, 8, 4, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4,
  2, 2,
 
  4, 8, 8, 8, 4, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  4, 4, 8, 4,
  2, 2,
 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
 
  8, 4, 8, 8, 8, 8, 8,
  1, 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8, 4,
  4, 4, 4, 4, 
  4, 8, 4, 4,
 
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4, 8, 8, 4,
 
  4, 8, 4, 4,
  4, 4, 8, 4,
  8, 8, 8, 4, 8, 8,
  8, 4, 8, 8, 4,
 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8, 8,
  1,
 
  8, 4, 8, 8, 8, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8, 4,
  4, 4, 4, 4, 
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 8, 8, 8, 8, 8,
 
  8, 4, 8, 2,
  8, 4, 8, 4, 4,
  8, 4, 8, 2,
  8, 4, 8, 8, 8, 8,
  8, 4, 8, 2,
 
  4, 4, 4,
  8, 8, 8, 8, 8, 8,
  8, 8, 2
};
 
// pinide deklareerimine
const int buzzer = 9;
const int temperaturePin = A1;
const int lightPin = A0;
const int controlPin = 6;

// muutujad mõõtetulemuste salvestamiseks
float voltage, degreesC;

// lcd-ekraani initsialiseerimine
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// süsteemi oleku lipp
bool systemOn = false;

// kraadi sümbol lcd-ekraanile
byte degrees[8] = {
    0b01110,
    0b01010,
    0b01110,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
};
 
void setup() {
  pinMode(buzzer, OUTPUT); // helianduri pin väljundiks
   
  lcd.begin(16, 2); // 16x2 ekraani initsialiseerimine
  lcd.createChar(1, degrees); // kohandatud sümboli (kraadi) loomine
   
  Serial.begin(9600);
}

// funktsioon rahuliku meloodia esitamiseks normaalses olukorras
void calm_music() {
  int size = sizeof(durations) / sizeof(int);
  for (int note = 0; note < size; note++) {
    // iga heli eelne temperatuur, valguse ja süsteemi kontroll
    float v = analogRead(temperaturePin) * 0.004882814;
    float t = (v - 0.5) * 100.0;
    int light = analogRead(lightPin);
    bool control = digitalRead(controlPin);
 
    if (t > 25 || light > 200 || !control) {
      noTone(buzzer);
      return;
    }
 
    // ekraanil näitude uuendamine
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(t);
    lcd.write(byte(1));
    lcd.print("C   ");
 
    lcd.setCursor(0, 1);
    lcd.print("Valgus: ");
    lcd.print(light);
    lcd.print("   ");
 
    // noodi esitamine
    int duration = 1000 / durations[note];
    tone(buzzer, melody[note], duration);
    delay(duration * 1.3);
    noTone(buzzer);
  }
}
 
void loop() {
  systemOn = digitalRead(controlPin); // süsteemi oleku lugemine
   
  if (systemOn) {
    voltage = analogRead(temperaturePin) * 0.004882814;
    degreesC = (voltage - 0.5) * 100.0;
    int lightLevel = analogRead(lightPin);
 
    // andmete väljastus seriakaudu
    Serial.print("Temp: ");
    Serial.print(degreesC);
    Serial.print(" C |  Light: ");
    Serial.println(lightLevel);
 
    // lcd-ekraanil andmete uuendamine
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(degreesC);
    lcd.write(byte(1));
    lcd.print("C   ");
 
    lcd.setCursor(0, 1);
    lcd.print("Valgus: ");
    lcd.print(lightLevel);
    lcd.print("   ");
 
    // häiresignaali tingimused
    if (degreesC > 25 && lightLevel > 200) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("!!!!OHTU!!!!   ");
    } else if (degreesC > 25) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 1);
      lcd.print("Liiga palav!!!   ");
    } else if (lightLevel > 200) {
      noTone(9);
      tone(buzzer, 1000, 500);
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("Liiga pime!!!   ");
    } else {
      calm_music(); // rahuliku meloodia esitamine ohutus olekus
    }
 
  } else {
    noTone(9); // heli väljalülitamine, kui süsteem on välja lülitatud
    lcd.clear(); // ekraani puhastamine
    lcd.setCursor(0, 0);
    lcd.print("SYSTEM: OFF");   // kuvatakse olek     
  }
 
  delay(1000); // viide enne järgmist tsüklit
}