5.1 Katse LCD ekraani kasutamine
Projekti koostamiseks läheb vaja:
- 1 x 1602 LCD ekraan
- 1 x potentsiomeeter
- 16 x tavalised üksikud isane-isane juhtmed
- 1 x 220 Ω takisti
Piltide ekraanil kuvatavaks koodiks muutmisel aitab näiteks selline lehekülg: https://omerk.github.io/lcdchargen/
Kokkuvõte: mida programm teeb
- Tsükkel kordub lõputult (kuna see on
loop()
funktsioonis). - Kuvab ekraanile kassi ja tüdruku kujutise.
- Näitab poissi paremal all nurgas – alguses käed all, hiljem käed üles tõstetud.
- Animeerib 10 naeratavat nägu (smailit) ekraanile.
- Süda liigub animatsioonina poisi juurest tüdruku poole.
Interaktiivne skeem
Skeem

Programm
// 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);
}
Ülesanne 5. Interaktiivne infoekraan “Ilmajaam”
Töö kirjeldus
Tegemist on Arduino projektiga, mille eesmärk on luua lihtne ilmajaam, mis mõõdab ümbritsevat temperatuuri ja valguse taset ning kuvab tulemused LCD-ekraanil. Temperatuur loetakse analoogsensorilt (A1) ja teisendatakse kraadideks Celsiuse järgi. Vastavalt väärtusele kuvatakse erinev tekstiline hinnang.
Valguse taseme tuvastamiseks kasutatakse fotorresistorit (A0), mille väärtus teisendatakse vahemikku 0–255 ja tõlgendatakse kolme olekuna: paikseline, pilvine või vihmane. Iga olekule vastab LCD-ekraanil ikoon. Ekraanil vahelduvad temperatuur ja valgusinfo ning käivitamisel kuvatakse lühike animatsioon südametega.
Kasutatud komponenid
- Arduino UNO plaat (1tk)
- Arendusplaat (1tk)
- LCD-ekraan (1tk)
- Potentiometer (1tk)
- Juhtmed (22tk)
- 220 Ω Takisti (1tk)
- 10 kΩ Takisti (1tk)
- Temperatuuri andur (1tk)
- Fototakisti (1tk)
Töö protsess
LCD-ekraan ühendati Arduino plaadiga, kasutades LiquidCrystal teeki ja järgmisi pin’e: RS = 12, E = 11, D4–D7 = 5, 4, 3, 2. Lisaks ühendati kaks andurit: temperatuuriandur (A1) ja fotorresistor (A0).
Temperatuuriandur mõõdab keskkonna temperatuuri, mille toorväärtus teisendatakse pingeks ja seejärel kraadideks Celsiuse järgi. Temperatuuri väärtuse alusel valitakse sobiv tekst (“Kylm ilm!”, “Monus ilm!”, “Soojus kasvab!”, “Palavus! Vett!”) ja kuvatakse see LCD-ekraanil koos temperatuuri näiduga. Kraadisümbol on loodud eraldi kohandatud sümbolina, kasutades lcd.createChar()
funktsiooni.
Fotorresistor mõõdab ümbritsevat valguse taset ning toorväärtus teisendatakse vahemikku 0–255 funktsioonidega map()
ja constrain()
. Selle põhjal määratakse valgusolude tüüp:
- Väärtus < 85 – “Paikseline”
- Väärtus 85–170 – “Pilvine”
- Väärtus > 170 – “Vihmane”
Igal valgusolul on vastav LCD-ekraanile loodud ikoon: naerunägu, vihm või kurb nägu. Tekst ja ikoon kuvatakse koos temperatuuriinfoga.
Programmi käivitamisel esitatakse LCD-ekraanil animatsioon südamete liikumisega mõlemas suunas, et luua visuaalselt meeldiv sissejuhatus. Pärast seda vahetub LCD-ekraanil regulaarselt teave: kord kuvatakse temperatuur ja selle hinnang, seejärel valgusolud koos ikooniga.
Reaalajas jälgitakse andurite andmeid ka Serial Monitoris, kuhu väljastatakse temperatuuri- ja valgusandmed tekstilisel kujul.
Uuritud funktsioonid
#include <LiquidCrystal.h> |
Lisab LiquidCrystal teegi, mis võimaldab kasutada LCD-ekraani koos Arduino plaadiga. |
LiquidCrystal lcd(rs, e, d4, d5, d6, d7); |
Luuakse LCD-ekraani objekt, määrates ühenduspinnid (RS, E, D4–D7). |
lcd.begin(cols, rows); |
Algatab LCD-ekraani töö. Näiteks lcd.begin(16, 2); tähendab 16 tulp ja 2 rida. |
lcd.setCursor(col, row); |
Määrab kursori positsiooni ekraanil, kust järgnev tekst kuvatakse. |
lcd.print("tekst"); |
Kuvab määratud teksti LCD-ekraanil alates kursorist. |
lcd.clear(); |
Kustutab kogu LCD-ekraani sisu ja viib kursori tagasi algpositsioonile. |
lcd.createChar(num, data[]); |
Luuakse kohandatud sümbol. num on sümboli number (0–7), data on baitide massiiv (8 rida pikslit). |
lcd.write(byte(num)); |
Kuvab eelnevalt loodud kohandatud sümboli vastava numbriga LCD-ekraanil. |
Kasutamisvõimalused tavaelus
- Toatemperatuuri jälgimine – aitab kodus hoida mugavat kliimat ja reageerida kuumale või külmale õhule.
- Kasvuhoones kasutamine – võimaldab jälgida temperatuuri ja valgust taimede kasvatamisel.
- Lastele ja vanematele – ekraanil olevad lihtsad tekstid ja ikoonid muudavad ilmaolude mõistmise lihtsaks.
- Õppevahend koolis – sobib hästi elektroonika ja programmeerimise õppimiseks praktilise näitena.
- Telkimisel või aiatööl – mobiilse toite korral saab ilmajaama kasutada välitingimustes ilma hindamiseks.
Interaktiivne skeem
Skeem

Video (link)
Programm
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int temperaturePin = A1;
const int lightPin = A0;
float voltage, degreesC;
char* tempTekstid[] = {
"Kylm ilm!", // < 15
"Monus ilm!", // 15–25
"Soojus kasvab!", // 25–30
"Palavus! Vett!" // >30
};
char* lightTekstid[] = {
"Paikseline", // < 85
"Pilvine", // 85–170
"Vihmane" // >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 heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
byte sad[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b01110,
0b10001,
0b00000,
0b00000
};
void setup() {
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, sad);
lcd.setCursor(0, 0);
lcd.print("Ilmajaam:");
lcd.setCursor(0, 1);
lcd.print("TTHK ilm");
// paremale
for (int koht = 9; koht <= 15; koht++) {
lcd.setCursor(koht, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
// vasakule
for (int koht = 14; koht >= 9; koht--) {
lcd.setCursor(koht, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(koht, 1);
lcd.print(" ");
}
lcd.setCursor(9, 1);
lcd.write(byte(4));
delay(1000);
}
void loop() {
// --- Temperatuur ---
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
// --- Valgustus ---
int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
// Printimine Serial Monitori
Serial.print("Temp: ");
Serial.print(degreesC);
Serial.print(" °C | Light level: ");
Serial.println(lightLevel);
// Tekst temperatuuri järgi
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];
}
// Tekst valgustuse järgi
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;
}
// Esimene ekraan: temperatuuritekst
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);
// Teine ekraan: valgustus ja ikoon
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);
}