Ü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 440 | Makro, 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
}
