5. Katse LCD ekraani kasutamine

// 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);
}
5.2. Töö kestus milles() abil

unsigned long algusAeg;
unsigned long kestus;
void setup() {
Serial.begin(9600);
algusAeg = millis(); // Salvestame, millal töö algas
Serial.println("Töö algas!");
}
void loop() {
kestus = millis() - algusAeg;
unsigned long sekundid = kestus / 1000;
unsigned int tunnid = sekundid / 3600;
unsigned int minutid = (sekundid % 3600) / 60;
unsigned int sek = sekundid % 60;
Serial.print("Töö kestus: ");
if (tunnid < 10) Serial.print('0');
Serial.print(tunnid);
Serial.print(':');
if (minutid < 10) Serial.print('0');
Serial.print(minutid);
Serial.print(':');
if (sek < 10) Serial.print('0');
Serial.println(sek);
delay(1000); // Uuendame iga sekund
}
link: https://www.tinkercad.com/things/ck62DZmEW8c-tremendous-crift
Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”
1. Tehtud näidisülesanded:
• LCD ekraani juhtimine (LiquidCrystal.h raamatukogu kasutamine)
• Temperatuuri mõõtmine TMP36 anduriga
• Valguse mõõtmine fototakisti abil
• Kasutajaliidese loomine tekstide ja piltide kuvamisega LCD-le
• Kohandatud sümbolite (ikoonide) tegemine LCD Character Generatoriga
2. Uuritud funktsioonid:
lcd.begin(16,2) Initsialiseerib LCD ekraani mõõtmetega 16×2
lcd.setCursor(x,y) Asetab kursorit LCD ekraanil positsioonile (x, y)
lcd.print(tekst) Kuvab teksti LCD ekraanile
lcd.clear() Kustutab LCD ekraanilt kogu teksti
lcd.createChar(nr, andmed) Loob kohandatud sümboli LCD jaoks
lcd.write(byte(nr)) Kuvab kohandatud sümbolit LCD ekraanil
analogRead(pin) Loeb analoogsisendi väärtust (0-1023)
delay(ms) Paus programmi täitmises millisekundites
millis() Tagastab aja millisekundites alates programmi käivitumisest
random(min,max) Tagastab juhusliku arvu vahemikus
3. Töö kirjeldus:
Projekti eesmärk oli luua mini-ilmajaam, mis mõõdab ja kuvab:
• Temperatuuri
• Valgustugevust
• Ekraanil vahetuvad laused ja pildid vastavalt mõõdetud väärtustele. Lisaks loodi ja kuvati kohandatud ikoonid (päike, pilv, vihm, lumi jne).
4. Kasutatud komponendid:
• Arduino Uno
• LCD ekraan 16×2
• TMP36 temperatuurisensor
• Fototakisti (LDR sensor)
• 10kΩ potentsiomeeter (LCD kontrasti reguleerimiseks)
• 220Ω takistid
• Juhtmed
• Breadboard (makettplaat)
5.Skeem:

6. Kohandatud programm:
#include <LiquidCrystal.h>
// LCD ühendused: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Andurite pinid
const int sensorPinTemp = A0;
const int sensorPinValgus = A1;
// Kohandatud ikoonid (päike, pilv, vihm, lumi, süda)
byte sun[8] = {
0b00100,
0b10101,
0b01110,
0b11111,
0b01110,
0b10101,
0b00100,
0b00000
};
byte cloud[8] = {
0b00000,
0b00000,
0b01110,
0b10101,
0b11111,
0b11111,
0b01110,
0b00000
};
byte rain[8] = {
0b00000,
0b01110,
0b10101,
0b11111,
0b11111,
0b00100,
0b01010,
0b00100
};
byte snow[8] = {
0b00100,
0b10101,
0b01110,
0b11111,
0b01110,
0b10101,
0b00100,
0b00000
};
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
// Aeg-ajalt reklaamtekst
const char* reklaamTekst = "nastja loh :)";
// Muutujad uuenduse jaoks
unsigned long eelmiseAeg = 0;
const long intervall = 5000; // 5 sekundi tagant uuendus
int reklaamiLoendur = 0;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
// Kohandatud ikoonid
lcd.createChar(0, sun);
lcd.createChar(1, cloud);
lcd.createChar(2, rain);
lcd.createChar(3, snow);
lcd.createChar(4, heart);
// Alguskuva
lcd.setCursor(0, 0);
lcd.print("Ilmajaam:");
lcd.setCursor(0, 1);
lcd.print("PaiksePesa");
delay(3000);
lcd.clear();
}
void loop() {
unsigned long praeguneAeg = millis();
// Värskenda iga 5 sekundi tagant
if (praeguneAeg - eelmiseAeg >= intervall) {
eelmiseAeg = praeguneAeg;
int sensorTempVal = analogRead(sensorPinTemp);
int sensorValgusVal = analogRead(sensorPinValgus);
// Temperatuuri arvutus TMP36 sensorilt
float voltage = sensorTempVal * 5.0 / 1024.0;
float temperature = (voltage - 0.5) * 100;
// Valguse hindamine (skaalame lihtsamaks)
int ValgusVal = sensorValgusVal / 4;
// Seriaalmonitori test
Serial.print("Temp (C): ");
Serial.println(temperature);
Serial.print("Valgus: ");
Serial.println(sensorValgusVal);
lcd.clear();
// Kuvame ilmastiku kirjelduse ja ikooni
lcd.setCursor(0, 0);
if (temperature < 0) {
lcd.print("Voib tulla lund");
lcd.setCursor(15, 0);
lcd.write(byte(3)); // lumi
}
else if (temperature >= 0 && temperature < 10 && ValgusVal < 100) {
lcd.print("Pilvine ja jahe");
lcd.setCursor(15, 0);
lcd.write(byte(1)); // pilv
}
else if (temperature >= 0 && temperature < 10 && ValgusVal >= 100) {
lcd.print("Vihmane ilm");
lcd.setCursor(15, 0);
lcd.write(byte(2)); // vihm
}
else if (temperature >= 10 && temperature < 20 && ValgusVal < 100) {
lcd.print("Pilvine hommik");
lcd.setCursor(15, 0);
lcd.write(byte(1)); // pilv
}
else if (temperature >= 10 && ValgusVal >= 100) {
lcd.print("Paike paistab!");
lcd.setCursor(15, 0);
lcd.write(byte(0)); // paike
}
else {
lcd.print("Ilm muutlik");
lcd.setCursor(15, 0);
lcd.write(byte(1)); // pilv (vaikimisi)
}
// Kuvame temperatuuri allreal
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature, 0);
lcd.print((char)223);
lcd.print("C");
// Aeg-ajalt näitame reklaami (iga 4. kord)
reklaamiLoendur++;
if (reklaamiLoendur >= 4) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(reklaamTekst);
lcd.setCursor(15, 1);
lcd.write(byte(4)); // süda
delay(3000);
reklaamiLoendur = 0;
}
}
}

7. Video:
8. Kasutamisvõimalused tavaelus:
• Kodune ilmajaam
• Kasvuhoone automaatne kliimaseire
• Välikohvikute ilmavaatlus
• Hariduslikud projektid ja töötoad
• Nutikodu süsteemide osana ilmastikuandmete kogumine

