Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”

5. Katse LCD ekraani kasutamine

https://www.tinkercad.com/things/2yzrkps1VHu-smooth-stantia-densor
// 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:

https://www.tinkercad.com/things/gdqCgw7jxrO-ilm

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