Praktika 5: Interaktiivne infoekraan “Ilmajaam”
Katse 5.1: -LCD ekraani kasutamine-
Ekraani ühendamine ja teksti kuvamine 1602 LCD ekraanil.
Komponendid:
x1
x1
x1
x1
x1
x16
Kirjeldus:
LCD-ekraani töö kontrollimiseks kasutasin Arduino IDE näidisprogrammi HelloWorld. Programmis muutsin kuvatavat teksti, asendades sõna World oma nimega. Pärast programmi üleslaadimist kuvati ekraani ülemisele reale tervitustekst ning alumisele reale sekundiloendur. Ekraani kontrastsust sai reguleerida potentsiomeetri abil.
Seejärel katsetasin programmi CustomCharacter, mis võimaldab luua LCD-ekraanile erisümboleid. Selle programmi abil sain kuvada ekraanil lihtsa animatsiooni. Katse käigus tutvusin LCD-ekraani tööpõhimõttega ning õppisin kasutama kohandatud sümboleid ja animatsioone.
Katse tulemusena valmis lihtne animatsioon, kus poiss ja tüdruk saadavad teineteisele südameid ja naerunägusid.
Näidet saab muuta vastavalt soovitud teemale ja luua erinevaid animatsioone. Erisümbolite loomiseks ning nende LCD-ekraanil kuvatavaks koodiks teisendamiseks võib kasutada veebilehte https://omerk.github.io/lcdchargen/.
Skeem:

Kood:
const int temperaturePin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
float voltage, degreesC, degreesF;
// kasutame analogRead(), mis tagastab sisendi väärtused vahemikul 0 ... 1023.
// koostasime getVoltage() funktsioon, mis tagastab pingeväärtus 0 ... 5,
voltage = getVoltage(temperaturePin);
degreesC = (voltage - 0.5) * 100.0;
// degreesC = voltage * 100.0;
degreesF = degreesC * (9.0/5.0) + 32.0;
Serial.print("voltage: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.print(degreesC);
Serial.print(" deg F: ");
Serial.println(degreesF);
//Ekraanil ilmub järgmine tekst: "voltage: 0.73 deg C: 22.75 deg F: 72.96"
delay(1000); // ootame 1 sek
}
float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
// teisendame pinge vahemikust 0,0 ... 5,0 V, vahemikku 0 до 1023.
}
Interaktiivne Arduino skeem
Ülesanne 5: Interaktiivne infoekraan “Ilmajaam”
Kirjeldus:
Selles katses koostasin mini-ilmajaama nimega „Meteolog“, mis kuvab LCD-ekraanil infot ümbritsevate tingimuste kohta. Projekti jaoks kasutasin TMP36 temperatuuriandurit, fototakistit (LDR), 16×2 LCD-ekraani ning potentsiomeetrit kontrastsuse reguleerimiseks.
Programmi käivitamisel kuvatakse ekraanil ilmajaama nimi ning tervitustekst koos südamete animatsiooniga. Seejärel hakkab süsteem mõõtma temperatuuri ja valgustaset ning kuvab saadud andmete põhjal erinevaid teateid. Temperatuuri muutumisel vahetuvad ilma kirjeldavad sõnumid ning valgusanduri näitude järgi kuvatakse vastavad ilmastikutingimused.
Lisaks kasutasin projekti jaoks mitmeid erisümboleid, näiteks südant, vihmasümbolit, päikest pilve taga, naerunägu ja kurba nägu. Ekraanil kuvatakse ka tööaja loendur ning aeg-ajalt ilmub sõbralik tervitus või reklaamtekst.
Tulemuseks valmis interaktiivne ilmajaam, mis reageerib andurite näitude muutumisele ning esitab infot kasutajasõbralikul ja visuaalselt arusaadaval kujul.
Komponendid:
x1
x1
x1
x1
x1
x1
x1
x1
x22
Skeem:
Simulatsioon väljas:
Simulatsiooni tööl:


Kood:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int temperaturePin = A1; // temperatuuriandur TMP36
const int lightPin = A0; // fototakisti
float voltage, degreesC;
char* tempTekstid[] = {
"Kylm ilm!",
"Monus ilm!",
"Soojus kasvab!",
"Palav! Joo vett"
};
char* lightTekstid[] = {
"Paikeline",
"Pilvine",
"Vihmane"
};
// erisymbol: naerunagu
byte smile[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
// erisymbol: vihmapiisk
byte rain[8] = {
0b00100,
0b00100,
0b01010,
0b01010,
0b10001,
0b10001,
0b10001,
0b01110
};
// erisymbol: kraadimark
byte degrees[8] = {
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
// erisymbol: syda
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
// erisymbol: kurb nagu
byte sad[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b01110,
0b10001,
0b00000,
0b00000
};
// erisymbol: paike pilve taga
byte partlyCloudy[8] = {
0b00100,
0b10101,
0b01110,
0b00111,
0b11111,
0b11111,
0b01110,
0b00000
};
// erisymbol: termomeeter
byte thermometer[8] = {
0b00100,
0b01010,
0b01010,
0b01010,
0b01010,
0b10001,
0b10001,
0b01110
};
// erisymbol: kell
byte clockIcon[8] = {
0b01110,
0b10001,
0b10101,
0b10111,
0b10001,
0b10001,
0b01110,
0b00000
};
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
// erisymbolite loomine
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, heart);
lcd.createChar(5, sad);
lcd.createChar(6, partlyCloudy);
lcd.createChar(0, thermometer);
lcd.createChar(7, clockIcon);
// algusekraan ilmajaama nimega
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Ilmajaam:");
lcd.write(byte(6));
lcd.setCursor(4, 1);
lcd.print("Meteolog");
delay(1500);
lcd.clear();
// tervitustekst keskel
lcd.setCursor(6, 0);
lcd.print("Tere");
lcd.setCursor(3, 1);
lcd.print("Tulemast!!");
// sydamed liiguvad eemale molemal real
for (int samm = 0; samm <= 2; samm++) {
// esimene rida: Tere
lcd.setCursor(5 - samm, 0);
lcd.write(byte(4));
lcd.setCursor(10 + samm, 0);
lcd.write(byte(4));
// teine rida: Tulemast!
lcd.setCursor(2 - samm, 1);
lcd.write(byte(4));
lcd.setCursor(13 + samm, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(5 - samm, 0);
lcd.print(" ");
lcd.setCursor(10 + samm, 0);
lcd.print(" ");
lcd.setCursor(2 - samm, 1);
lcd.print(" ");
lcd.setCursor(13 + samm, 1);
lcd.print(" ");
}
// sydamed liiguvad tagasi molemal real
for (int samm = 2; samm >= 0; samm--) {
// esimene rida: Tere
lcd.setCursor(5 - samm, 0);
lcd.write(byte(4));
lcd.setCursor(10 + samm, 0);
lcd.write(byte(4));
// teine rida: Tulemast!
lcd.setCursor(2 - samm, 1);
lcd.write(byte(4));
lcd.setCursor(13 + samm, 1);
lcd.write(byte(4));
delay(300);
lcd.setCursor(5 - samm, 0);
lcd.print(" ");
lcd.setCursor(10 + samm, 0);
lcd.print(" ");
lcd.setCursor(2 - samm, 1);
lcd.print(" ");
lcd.setCursor(13 + samm, 1);
lcd.print(" ");
}
// lopuks jaavad sydamed teksti korvale
lcd.setCursor(5, 0);
lcd.write(byte(4));
lcd.setCursor(10, 0);
lcd.write(byte(4));
lcd.setCursor(2, 1);
lcd.write(byte(4));
lcd.setCursor(13, 1);
lcd.write(byte(4));
delay(1000);
lcd.clear();
}
void loop() {
// temperatuuri lugemine
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
int rawLight = analogRead(lightPin);
Serial.print("Raw: ");
Serial.print(rawLight);
int lightLevel = map(rawLight, 1023, 0, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
Serial.print(" | Light level: ");
Serial.println(lightLevel);
// andmete kuvamine Serial Monitoris
Serial.print("Temp: ");
Serial.print(degreesC);
Serial.print(" C | Light level: ");
Serial.println(lightLevel);
// temperatuuri teksti valimine
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];
}
// valguse teksti ja ikooni valimine
char* lightTekst;
byte lightIcon;
if (lightLevel > 170) {
lightTekst = lightTekstid[0]; // Paikeline
lightIcon = 2; // smile
} else if (lightLevel > 85) {
lightTekst = lightTekstid[1]; // Pilvine
lightIcon = 6; // partlyCloudy
} else {
lightTekst = lightTekstid[2]; // Vihmane
lightIcon = 3; // rain
}
// esimene ekraan: temperatuur ja loendur
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTekst);
lcd.setCursor(0, 1);
lcd.write(byte(0)); // termomeeter
lcd.print(degreesC, 0);
lcd.write(byte(1)); // kraadimark
lcd.print("C ");
lcd.write(byte(7)); // kell
lcd.print(millis() / 1000);
lcd.print("s");
delay(2000);
// teine ekraan: valgus
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(lightTekst);
lcd.setCursor(strlen(lightTekst) + 1, 0);
lcd.write(lightIcon);
lcd.setCursor(0, 1);
lcd.print("Valgus: ");
lcd.print(lightLevel);
delay(2000);
// kolmas ekraan: reklaamtekst
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Meteolog soovib");
lcd.setCursor(0, 1);
lcd.print("head paeva ");
lcd.write(byte(4));
delay(2000);
}
Video:
Interaktiivne Arduino skeem
Uuritud funktsioonid
| Funktsioon | Tüüp | Kirjeldus | Kasutus koodis |
|---|---|---|---|
analogRead() |
Standard | Loeb analoogsisendi väärtuse | Temperatuuri ja valguse mõõtmine |
map() |
Standard | Teisendab väärtuse ühest vahemikust teise | Valguse taseme skaleerimine |
constrain() |
Standard | Piirab väärtuse määratud vahemikku | Valguse väärtuste piiramine |
millis() |
Standard | Tagastab programmi tööaja millisekundites | Tööaja loenduri kuvamine |
delay() |
Standard | Peatab programmi töö määratud ajaks | Animatsioonide ja ekraanivahetuste juhtimine |
lcd.begin() |
LiquidCrystal | Seadistab LCD-ekraani mõõtmed | 16×2 LCD-ekraani käivitamine |
lcd.setCursor() |
LiquidCrystal | Määrab kursori asukoha ekraanil | Teksti ja sümbolite paigutamine |
lcd.print() |
LiquidCrystal | Kuvab teksti või väärtusi LCD-ekraanil | Temperatuuri, valguse ja teadete kuvamine |
lcd.createChar() |
LiquidCrystal | Loob kohandatud sümboli | Südamed, ilmastikuikoonid ja muud sümbolid |
lcd.write() |
LiquidCrystal | Kuvab loodud erisümboli | Animatsioonide ja ikoonide kuvamine |
Kasutamisvõimalused tavaelus
🏠 Kodune ilmajaam
Võimaldab jälgida ruumi temperatuuri ja valgustaset reaalajas ning kuvada andmeid LCD-ekraanil.
🌱 Kasvuhooned
Temperatuuri- ja valgusandureid saab kasutada taimede kasvutingimuste jälgimiseks.
💡 Nutikas valgustus
Fototakisti abil saab automaatselt reguleerida valgustust vastavalt ümbritseva valguse tugevusele.
🌡️ Kliimakontroll
Süsteemi saab kasutada temperatuuri jälgimiseks ja küttesüsteemide juhtimiseks.
🏫 Õppeprojektid
Ilmajaam sobib hästi Arduino, andurite ja LCD-ekraanide tööpõhimõtete õppimiseks.
📊 Keskkonna jälgimine
Andmeid saab koguda ja analüüsida, et jälgida ruumi või töökoha keskkonnatingimusi.
🏠 Kodune ilmajaam
Võimaldab jälgida ruumi temperatuuri ja valgustaset reaalajas ning kuvada andmeid LCD-ekraanil.
🌱 Kasvuhooned
Temperatuuri- ja valgusandureid saab kasutada taimede kasvutingimuste jälgimiseks.
💡 Nutikas valgustus
Fototakisti abil saab automaatselt reguleerida valgustust vastavalt ümbritseva valguse tugevusele.
🌡️ Kliimakontroll
Süsteemi saab kasutada temperatuuri jälgimiseks ja küttesüsteemide juhtimiseks.
🏫 Õppeprojektid
Ilmajaam sobib hästi Arduino, andurite ja LCD-ekraanide tööpõhimõtete õppimiseks.
📊 Keskkonna jälgimine
Andmeid saab koguda ja analüüsida, et jälgida ruumi või töökoha keskkonnatingimusi.
