Praktika 5: Interaktiivne infoekraan “Ilmajaam”

Katse 5.1: -LCD ekraani kasutamine-

Ekraani ühendamine ja teksti kuvamine 1602 LCD ekraanil.

Komponendid:

Arduino Uno

x1

Breadboard

x1

1602 LCD ekraan

x1

Potentsiomeeter

x1

330 Ω takisti

x1

Juhtmed

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:

Arduino Uno

x1

Breadboard

x1

LCD 16x2

x1

Potentsiomeeter

x1

TMP36

x1

Fototakisti

x1

330 Ω takisti

x1

10 kΩ takisti

x1

Juhtmed

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.