Ülesanne #1

Komponendid
- Arduino UNO plaat (1tk)
- Arendusplaat (1tk)
- Juhtmed (7tk)
- 330 Ω takisti (1tk -220Ω, 2tk – 10kΩ)
- LED (1tk)
// lisame LiquidCrystal library
#include <LiquidCrystal.h>
// määrame, milliste digitaalpesadega ekraan ühendatud on
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// loome erisümbolid
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
byte armsDown[8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp[8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
byte kass[8] = {
0b00000,
0b00000,
0b00000,
0b10000,
0b10011,
0b11111,
0b01110,
0b01010
};
byte tydruk[8] = {
0b00100,
0b01010,
0b00100,
0b11111,
0b00100,
0b00100,
0b01110,
0b11111
};
byte v2ikesyda[8] = {
0b00000,
0b00000,
0b00000,
0b11011,
0b11111,
0b11111,
0b01110,
0b00100
};
void setup() {
// algväärtustatakse LDC ekraani read ja veerud
lcd.begin(16, 2);
// defineerime erisümbolid
lcd.createChar(1, smiley);
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
lcd.createChar(5, kass);
lcd.createChar(6, tydruk);
lcd.createChar(7, v2ikesyda);
}
void loop() {
// koht kuhu hakkame joonistama - 3. veerg, esimene rida
lcd.setCursor(2, 0);
// joonistame kassi
lcd.write(5);
// ja tüdruku
lcd.write(6);
// muudame kursori asukohta: 2. rida 14. veerg
lcd.setCursor(13, 1);
// joonistame poisi
lcd.write(3);
delay(400);
// muudame kursori asukohta: 1. rida 5. veerg
lcd.setCursor(4, 0);
// joonistame for tsükli abil väikese pausiga 10 smaili
for (int koht = 0; koht < 10; koht++) {
lcd.write(1);
delay(400);
}
lcd.setCursor(13, 1);
lcd.write(4);
// loobime südameid
for (int koht = 13; koht >= 4; koht--) {
lcd.setCursor(koht, 0);
lcd.write(7);
delay(400);
}
delay(400);
}
Ilmajaam


Video
https://drive.google.com/file/d/1wtvaa0FeoKb4uRsLQ96I94LtNhMqPZqg/view?usp=sharing
https://drive.google.com/file/d/1D4mpB8w2yH4fj0Q4JOgBQE6cdTfUfxfH/view?usp=sharing
Kirjeldus
Luua kujundatud mini-ilmajaam, mis kuvab andmete põhjal teavet LCD-ekraanil. Kasutades erinevaid andureid (nt temperatuurisensor, valgustundlik andur, kella moodul jne), kuvatakse reaalajas ilmastikutingimused, asjakohased laused ja vastavad pildid, mis võivad muutuda sõltuvalt ajast või mõõdetud andmetest.
Komponendid
- Arduino UNO plaat (1tk)
- Arendusplaat (1tk)
- Juhtmed (22tk)
- 220 Ω Takisti (1tk)
- 10 kΩ Takisti (1tk)
- LCD-ekraan (1tk)
- Potentiometer (1tk)
- Temperatuuri andur (1tk)
- Fototakisti (1tk)
Uuritud funktsioonid
| lcd.clear() | Puhastab kogu LCD-ekraani ja seab kursori tagasi algusesse. |
| lcd.print(“tekst”) | Kuvab LCD-ekraanil antud teksti, alustades määratud kursori positsioonist. |
| #include <LiquidCrystal.h> | Lisab LiquidCrystal teegi, mis võimaldab kasutada LCD-ekraani koos Arduino-ga. |
| lcd.setCursor(col, row) | Määrab, kuhu kuvatakse järgmine tekst, paigutades kursori soovitud veeru ja rea peale. |
| lcd.createChar(num, data[]) | Loob kohandatud sümboli, kus num on sümboli indeks (0–7) ja data[] määrab selle kuju. |
| LiquidCrystal lcd(rs, e, d4, d5, d6, d7) | Luuakse LCD-ekraani objekt ja määratakse ühenduspinnid (RS, E, D4–D7). |
| lcd.write(byte(num)) | Kuvab LCD-ekraanil varem loodud kohandatud sümboli vastava numbriga. |
| lcd.begin(cols, rows) | Alustab LCD-ekraani töö, määrates tulpade ja ridade arvu (nt lcd.begin(16, 2);). |
Selgitus
Ühendame Liquidcrystali teegi ja loome lcd-objekti, näidates tihvtid, millega ekraan on ühendatud. See võimaldab meil suhelda LCD-ekraaniga.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Kuulutame välja kaks analoognõela: üks temperatuurianduri jaoks, teine valgusanduri jaoks. Samuti loome muutujaid pinge ja temperatuuri hoidmiseks.
const int temperaturePin = A1;
const int lightPin = A0;
float voltage, degreesC;
Loome stringide massiivid-fraasid, mis kuvatakse ekraanil sõltuvalt temperatuurist ja valgustusest.
char* tempTekstid[] = {
"Vaga kulm!",
"Soe ja monus!",
"Soojus kasvab!",
"Palavus!"
};
char* lightTekstid[] = {
"Paikseline",
"Pilvine",
"Vihmane"
};
Määratleme kohandatud sümbolid: emotikon, vihm, kraadiikoon, süda ja pilv. Need laaditakse LCD-sse ja kuvatakse õigel hetkel.
byte smile[8] = {...};
byte rain[8] = {...};
byte degrees[8] = {...};
byte heart[8] = {...};
byte cloud[8] = {...};
Initsialiseerime jadapordi silumiseks. Seejärel valmistame ette LCD (16×2) ja kirjutame loodud sümbolid kuvamällu.
Serial.begin(9600);
lcd.begin(16, 2);
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, heart);
lcd.createChar(5, cloud);
Kuvame avakuva: “Ilmajaam” ja “TTHK”, samuti mängime alumisel real liikuva südame ja emotikoni animatsiooni.
lcd.setCursor(0, 0);
lcd.print("Ilmajaam:");
lcd.setCursor(0, 1);
lcd.print("TTHK");
for (int koht = 9; koht <= 15; koht++) {
lcd.setCursor(koht, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
for (int koht = 14; koht >= 9; koht--) {
lcd.setCursor(koht, 1);
lcd.write(byte(2));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
Loeme temperatuuri analoogväärtuse, teisendame selle pingeks ja seejärel Celsiuse kraadiks, kasutades TMP valemit.
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
Loeme valgustustaset, skaleerime ja piirame seda edasiseks töötlemiseks vahemikus 0-255.
int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
Praeguse temperatuuri põhjal valime sobiva sõnumi.
char* tempTekst;
if (degreesC < 15) {
tempTekst = tempTekstid[0];
} else if (degreesC < 25) {
tempTekst = tempTekstid[1];
} else if (degreesC < 30) {
tempTekst = tempTekstid[2];
} else {
tempTekst = tempTekstid[3];
}
Valime sõnumi ja vastava ikooni valgustuse põhjal.
char* lightTekst;
byte lightIcon;
if (lightLevel > 170){
lightTekst = lightTekstid[2];
lightIcon = 3;
} else if (lightLevel > 85){
lightTekst = lightTekstid[1];
lightIcon = 5;
} else {
lightTekst = lightTekstid[0];
lightIcon = 2;
}
Puhastame ekraani ja näitame temperatuuri kirjeldust ning täpset väärtust koos kraadide sümboliga.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTekst);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);
Kuvame ilmastiku kirjelduse valgustuse järgi koos vastava ikooni ja praeguse temperatuuriga.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(lightTekst);
lcd.setCursor(strlen(lightTekst) + 1, 0);
lcd.write(lightIcon);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);
Kood
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// määrame andurite pin-id
const int temperaturePin = A1;
const int lightPin = A0;
// loome muutujad mõõtmistulemusteks
float voltage, degreesC;
// määrame temperatuuritekstid
char* tempTekstid[] = {
"Vaga kulm!",
"Soe ja monus!",
"Soojus kasvab!",
"Palavus!"
};
// määrame valgusetingimuste tekstid
char* lightTekstid[] = {
"Paikseline",
"Pilvine",
"Vihmane"
};
// loome pildikoodid LCD jaoks
byte smile[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
byte rain[8] = {
0b00100,
0b00100,
0b01010,
0b01010,
0b11101,
0b11111,
0b11111,
0b01110
};
byte degrees[8] = {
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
byte cloud[8] = {
0b00000,
0b00000,
0b01100,
0b11011,
0b11101,
0b01110,
0b00000,
0b00000
};
void setup() {
Serial.begin(9600); // käivitame jadapordi suhtluse
lcd.begin(16, 2); // määrame LCD mõõtmed
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, heart);
lcd.createChar(5, cloud);
lcd.setCursor(0, 0);
lcd.print("Ilmajaam:");
lcd.setCursor(0, 1);
lcd.print("TTHK");
// kuvame südame animatsiooni paremal
for (int koht = 9; koht <= 15; koht++) {
lcd.setCursor(koht, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
// kuvame naeratuse animatsiooni vasakule
for (int koht = 14; koht >= 9; koht--) {
lcd.setCursor(koht, 1);
lcd.write(byte(2));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
lcd.setCursor(9, 1);
lcd.write(byte(2));
delay(1000);
}
void loop() {
// arvutame temperatuuri anduri pinge põhjal
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
// loeme valguse taseme ja teisendame skaalale
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 level: ");
Serial.println(lightLevel);
// valime temperatuuri kirjelduse
char* tempTekst;
if (degreesC < 15) {
tempTekst = tempTekstid[0];
} else if (degreesC < 25) {
tempTekst = tempTekstid[1];
} else if (degreesC < 30) {
tempTekst = tempTekstid[2];
} else {
tempTekst = tempTekstid[3];
}
// valime valguse kirjelduse ja ikooni
char* lightTekst;
byte lightIcon;
if (lightLevel > 170){
lightTekst = lightTekstid[2];
lightIcon = 3;
} else if (lightLevel > 85){
lightTekst = lightTekstid[1];
lightIcon = 5;
} else {
lightTekst = lightTekstid[0];
lightIcon = 2;
}
// kuvame temperatuuriga ekraani
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTekst);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);
// kuvame valgusekirjelduse ikooniga
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(lightTekst);
lcd.setCursor(strlen(lightTekst) + 1, 0);
lcd.write(lightIcon);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);
}
