include <LiquidCrystal.h>

LiquidCrystal raamatukogu võimaldab juhtida LCD-dokumente HD44780 kontrolleriga.

byte smiley[8] = { … };
byte armsDown[8] = { … };


Need massiivid kirjeldavad kohandatud märke (8×5 pikslit), näiteks smiley, kass, tüdruk jne.

Initsialiseerimine setup():
cpp
Kopeeri
Redigeeri
lcd.begin(16, 2); // 16 märki, 2 rida
lcd.createChar(nr, symbol);
Funktsioon createChar() laeb loodud sümbolid ekraanile:

lcd.createChar(1, smiley); – salvestab smiley lahtrisse 1

Selliseid sümboleid saab laadida maksimaalselt 8 (lahtrid 0-7).

Näita kassi ja tüdrukut:
cpp
Kopeeri
Redigeeri
lcd.setCursor(2, 0); // Asukoht: 3. märk, 1. rida
lcd.write(5); // Märk “kass” (kass)
lcd.write(6); // Märk “tydruk” (tüdruk)


Näita “poiss” käed allapoole:
cpp
Kopeeri
Redigeeri
lcd.setCursor(13, 1);
lcd.write(3); // armsDown
delay(400);


Näita smiley nägusid:
cpp
Kopeeri
Redigeeri
lcd.setCursor(4, 0);
for (int koht = 0; koht < 10; koht++) { lcd.write(1); // smiley delay(400); }

Poiss tõstab käed üles: cpp Kopeeri Redigeeri lcd.setCursor(13, 1); lcd.write(4); // käedUp “Viskab” südamed: cpp Kopeeri Redigeeri for (int koht = 13; koht >= 4; koht–) {
lcd.setCursor(koht, 0);
lcd.write(7); // v2ikesyda (süda)
delay(400);
}


Kokkuvõte:
See kood loob animeeritud stseeni LCD-ekraanil:

Vasakul on kass ja tüdruk

Paremal on poiss, kes tõstab käed üles

Keskele ilmuvad naerualused

Seejärel „lendavad“ südamed

🧩 Mis on LCD1602 & Keypad Shield?

LCD1602 & Keypad Shield on laiendusmoodul, mis ühendub otse Arduino Uno peale.
Sisaldab LCD-ekraani ja 5 juhtnuppu, sobides kasutajaliidese loomiseks.


📟 LCD-ekraan (16×2)

  • Kuvab 2 rida, igaüks 16 tähemärki
  • Kasutab Hitachi HD44780 protokolli
    → ühilduv LiquidCrystal teegiga
  • LCD ühendatud otse Arduino digitaalsete pinidega
FunktsioonArduino pin
RSD8
Enable (E)D9
Data D4 – D7D4, D5, D6, D7
TaustvalgusD10 (valikuline)

🎛️ Nupud (Keypad)

  • 5 nuppu: UP, DOWN, LEFT, RIGHT, SELECT
  • Kõik nupud ühendatud ühe analoogpinni A0 kaudu
  • Nupu vajutus tuvastatakse analoogväärtuste järgi

🔌 Paigaldus ja kasutus

  • Ühendub otset Arduino Uno peale (“shield” / kilp)
  • Sobib väikeste liidestega projektidele
    (menüüd, valikud, seadistused)

🧩 5.3. Töö kestus millis() abil

🕒 Mis on millis()?

  • millis() on Arduino sisemine taimer, mis tagastab aja millisekundites, mis on möödunud alates seadme käivitamisest.
  • 1 sekund = 1000 ms
  • Sobib tööaja, loendurite või animatsioonide ajastamiseks ilma delay() funktsioonita.

📋 Mida see teeb?

  • Arvutab, kui kaua on töö kestnud alates käivitamisest.
  • Kuvab aega formaadis HH:MM:SS, nt:
python-replCopyEditTöö kestus: 00:00:05  
Töö kestus: 00:00:06  
...

🔁 Piirangud

  • Ei kuva reaalset kellaaega ega kuupäeva (nagu RTC moodul teeks).
  • Aeg läheb nulli, kui Arduino taaskäivitub või reset tehakse.

🎓 Kus kasutada?

  • Projektides, kus on vaja töö või mängu kestust jälgida
  • Asenduseks delay() funktsioonile ajastamisel
  • Aegade mõõtmiseks (nt vilkumise, animatsiooni, loenduri juhtimine)

Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 5, 6, 7, 8);
const int TEMP_PIN = A0, LDR_PIN = A1;
bool toggleVariant = false;
int lastIdx        = -1;  // eelmise sõnumi indeks

// Eemalda 'const' – nüüd on õige tüüp uint8_t*
byte icons[5][8] = {
  {0b00100,0b10101,0b01110,0b11111,0b01110,0b10101,0b00100,0b00000},
  {0,0b00110,0b01111,0b11111,0b11111,0b00000,0,0},
  {0b00110,0b01111,0b11111,0b00100,0b01010,0b10001,0,0},
  {0b01110,0b10101,0b11011,0b00100,0b11011,0b10101,0b01110,0},
  {0,0b01010,0b11111,0b11111,0b01110,0b00100,0,0}
};

const char* msgs[5] = {
  "Selge taevas",
  "Pilvine ilm",
  "Vihm varitseb",
  "Lumi langeb",
  "Armasta ilma"
};

const char* alts[5] = {
  "Taevas puhas",
  "Pilv katmas",
  "Tibutab vett",
  "Karge lumi",
  "Naudi ilma"
};

float readTemp() {
  float v = analogRead(TEMP_PIN) * (5.0 / 1023.0);
  return (v - 0.5) * 100.0;
}

int readLdr() {
  return analogRead(LDR_PIN);
}
int frameCount = 0;
void setup() {
  lcd.begin(16, 2);
  for (int i = 0; i < 5; i++) {
    lcd.createChar(i, icons[i]);
  }
  lcd.setCursor(0, 0);
  lcd.print("IlmaNurk");
  delay(2000);
  lcd.clear();
  Serial.begin(9600);
}

void loop() {
  frameCount++;
  // Iga 5. iteratsiooni järel näita reklaami
  if (frameCount >= 5) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("IlmaNurk soovitab");
    lcd.setCursor(0, 1);
    lcd.print("Joo teed! :)");
    delay(3000);
    frameCount = 0;
    return;
  }
  float t = readTemp();
  int l = readLdr();
  int idx = (l > 800) ? 4 : (t > 25) ? 0 : (t < 0) ? 3 : (l < 300) ? 2 : 1;
  
  if (idx != lastIdx) {
    lastIdx = idx;
    toggleVariant = false;
  }

  // vali kas peamine või variant
  const char* txt = toggleVariant ? alts[idx] : msgs[idx];
  toggleVariant = !toggleVariant;
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(txt);
  lcd.setCursor(15, 0);
  lcd.write(idx);

  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.print(t, 1);
  lcd.print("C S:");
  lcd.print(millis() / 1000);
  
  Serial.print("Temp: ");
  Serial.print(t, 1);
  Serial.print(" C, Light: ");
  Serial.print(analogRead(LDR_PIN));
  Serial.print(", Index: ");
  Serial.println(idx);
  delay(2000);
}

📘 Mida see projekt teeb:

  1. Mõõdab temperatuuri ja valgustugevust.
  2. Määrab ilmaolude tüübi (nt: selge, pilvine, vihmane jne).
  3. Kuvab tekstilise teate ja ikooni LCD ekraanil.
  4. Vahetab peamise ja alternatiivse teate iga kord.
  5. Iga 5. kord kuvab LCD reklaami/sõnumi: „IlmaNurk soovitab – Joo teed!“
  6. Näitab ka temperatuuri ja tööaega sekundites.
  7. Saadab andmed Serial Monitori kaudu.

🧠 Uued funktsioonid ja selgitused:

Käsk / FunktsioonSelgitus
#include <LiquidCrystal.h>Lisab teegi LCD-ekraani jaoks.
LiquidCrystal lcd(...)Määrab, millised pinnid on ühendatud LCD-ga.
lcd.begin(16, 2);Algatab LCD töö (16 tähemärki, 2 rida).
lcd.createChar(i, icons[i]);Loob kasutaja enda tehtud graafilised ikoonid.
lcd.setCursor(x, y);Määrab, kuhu tekst kirjutatakse (x = veerg, y = rida).
lcd.print(...)Kuvab teksti LCD-l.
lcd.write(idx);Kuvab enda loodud ikooni vastavalt indeksile.
analogRead(...)Loeb anduri väärtust (0–1023).
millis()Tagastab aega millisekundites alates käivitamisest.
Serial.begin(9600);Käivitab ühenduse Serial Monitoriga.
Serial.print()Kuvab andmed arvutisse (monitori).

📦 Muutujad ja nende tähendus:

  • TEMP_PIN – analoogsisend temperatuurile.
  • LDR_PIN – analoogsisend valgusele.
  • frameCount – loeb, mitu tsüklit on tehtud (reklaamiks iga 5 kord).
  • idx – määrab ilmaolude tüübi (0–4):
    • 0 – selge
    • 1 – pilvine
    • 2 – vihm
    • 3 – lumi
    • 4 – “armasta ilma” (väga valge või muu eriline)

🖼️ Näide ekraanilt:

makefileCopyEditTaevas puhas   ☼
T:24.5C S:127

Või reklaami ajal:

nginxCopyEditIlmaNurk soovitab
Joo teed! :)

📈 Kuidas ilma määratakse?

cppCopyEditint idx = (l > 800) ? 4 :
          (t > 25)  ? 0 :
          (t < 0)   ? 3 :
          (l < 300) ? 2 : 1;

Tõlge lihtsamalt:

  • Kui väga hele valgus4 (“Armasta ilma”)
  • Kui soe (t > 25°C)0 (“Selge taevas”)
  • Kui väga külm (t < 0°C)3 (“Lumi”)
  • Kui väga pime (valgus < 300)2 (“Vihm”)
  • Muidu → 1 (“Pilvine”)