|ru_RU

Teema 5: LCD ekraan

Katse 1

Projekti jaoks on vaja:

  • 1 x 1602 LCD ekraan
  • 1 x potentsiomeeter
  • 16 x isane-isane juhtmed
  • 1 x 330 Ω takisti

Ühenda LCD ekraan Arduino külge ja kasuta näidisprogrammi File → Examples → LiquidCrystal → HelloWorld. Muuda koodis rida lcd.print("hello, world!");, asendades “world” oma nimega. Lae kood plaadile – ekraanil peaks ülal olema tekst “hello, [sinu nimi]” ja all sekundiloendur.

Kui ekraanil ei ilmu midagi, keera potentsiomeeter vasakule maksimaalse kontrastsuse saavutamiseks ja kontrolli ühendusi, eriti A ja K pingejuhtmeid.

Pärast seda saad proovida liikuvat pilti näite kaudu CustomCharacter. LCD koosneb 32 lahtrist (5×8 pikslit igaüks), kus pilt kuvatakse 8-baidiliste jada kaudu. Näites on kujutatud poiss ja tüdruk, kes saadavad südameid ja naerunägusid.

Для проекта нужны:

  • 1 x LCD экран 1602
  • 1 x потенциометр
  • 16 x проводов (папа-папа)
  • 1 x резистор 330 Ом

Подключите LCD экран к Arduino и откройте пример File → Examples → LiquidCrystal → HelloWorld. Замените в коде строку lcd.print("hello, world!");, вставив вместо “world” своё имя. После загрузки на экране появится “hello, [ваше имя]” и счётчик секунд.

Если экран ничего не показывает — поверните потенциометр влево для контраста и проверьте подключения, особенно контакты A и K (подсветка).

Далее можно попробовать создать движущееся изображение, используя пример CustomCharacter. Экран состоит из 32 ячеек (по 5×8 пикселей), картинка формируется байтовыми шаблонами. В примере мальчик и девочка обмениваются сердцами и смайликами.

kood

// 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);

}

Katse 2

Kasutuskomponendid:

  • Arduino Uno
  • millis() funktsioon sisemise taimerina

Mis on millis()?
See on Arduino funktsioon, mis tagastab aja millisekundites alates plaadi käivitamisest. 1000 ms = 1 sekund. Seda saab kasutada lihtsa tööaja jälgimiseks ilma välist kellamoodulit kasutamata.

Mida see kood teeb?

  • Salvestab aja, mil töö algas (algusAeg)
  • Arvutab pidevalt, kui kaua Arduino on töötanud (kestus)
  • Kuvab töö kestuse Serial Monitoris formaadis HH:MM:SS
  • Uuendab aega iga sekund (kasutab delay(1000))

Piirangud:

  • Ei kuva tegelikku kellaaega ega kuupäeva
  • Aeg nullitakse, kui Arduino taaskäivitub

Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”
Kasutatud komponendid

  1. Arduino Uno – mikrokontroller, mis juhib kogu süsteemi.
  2. LCD-ekraan 16×2 – näitab temperatuuri, valgustugevust, ikooni ja tekstsõnumit.
  3. TMP36 temperatuurisensor – mõõdab ümbritsevat temperatuuri (ühendatud A1 pin’ile).
  4. Fotoresistor (valgussensor) – mõõdab valguse tugevust (ühendatud A0 pin’ile).
  5. Takistid – piiravad voolu, et kaitsta sensoreid ja tagada täpsemad mõõtmised.
  6. Breadboard ja juhtmed – ühendavad kõik komponendid omavahel.

Kuidas see töötab?

tekstsõnum, mis vaheldub iga 5 sekundi järel.

Sensorite lugemine:

TMP36 annab analoogsignaali vastavalt temperatuurile. Arduino loeb selle pordi A1 kaudu ja teisendab kraadideks Celsiuse järgi.

Fotoresistor muudab takistust vastavalt valguse hulgale. Arduino loeb pordi A0 kaudu valgustugevuse väärtuse.

Andmete töötlemine:

Koodis arvutatakse temperatuur ja valgustugevus.

Vastavalt nendele väärtustele valitakse sobiv ikoon (päike, pilv, vihm, lumi või kell).

Ekraani uuendamine:

LCD-ekraanil kuvatakse:

temperatuur °C-s,

kellaaeg (ajast, mil süsteem käivitus),

ikoon vastavalt ilmaoludele,

skeem

Kood

#include <LiquidCrystal.h>

// LCD pin connections: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Sensor pins
#define TMP36_PIN A1
#define LIGHT_SENSOR_PIN A0

// Custom icons
byte sunIcon[8] = {
  0b00000,
  0b10101,
  0b01110,
  0b11011,
  0b01110,
  0b10101,
  0b00000,
  0b00000
};

byte cloudIcon[8] = {
  0b00000,
  0b00000,
  0b01110,
  0b11111,
  0b11111,
  0b00000,
  0b00000,
  0b00000
};

byte rainIcon[8] = {
  0b00000,
  0b00100,
  0b01110,
  0b11111,
  0b00100,
  0b01100,
  0b11000,
  0b10000
};

byte snowIcon[8] = {
  0b00000,
  0b00100,
  0b01010,
  0b10001,
  0b01010,
  0b00100,
  0b00000,
  0b00000
};

byte clockIcon[8] = {
  0b00000,
  0b01110,
  0b10001,
  0b10101,
  0b10111,
  0b10001,
  0b01110,
  0b00000
};

// Messages
const char* messages[] = {
  "Sunny day!",
  "Cloudy",
  "Maybe rain",
  "Cold outside",
  "Nice weather",
  "Weather Station"
};

unsigned long lastUpdate = 0;
int messageIndex = 0;
unsigned long startTime = 0;

void setup() {
  lcd.begin(16, 2);

  lcd.createChar(0, sunIcon);
  lcd.createChar(1, cloudIcon);
  lcd.createChar(2, rainIcon);
  lcd.createChar(3, snowIcon);
  lcd.createChar(4, clockIcon);

  lcd.print(" Weather Station");
  lcd.setCursor(0, 1);
  lcd.print("   Loading...");
  delay(2000);
  lcd.clear();

  startTime = millis();
}

float getTemperature() {
  int reading = analogRead(TMP36_PIN);
  float voltage = reading * 5.0 / 1024.0;
  return (voltage - 0.5) * 100.0;
}

void updateDisplay(float temp, int light, unsigned long elapsed) {
  lcd.clear();

  // Top line: temperature + icon
  lcd.setCursor(0, 0);
  lcd.print("T:");
  lcd.print(temp, 1);
  lcd.write(223); // degree symbol
  lcd.print("C ");

  if (temp > 25 && light > 500) lcd.write(byte(0)); // sun
  else if (temp < 5) lcd.write(byte(3));            // snow
  else if (light < 300) lcd.write(byte(1));         // cloud
  else if (temp > 18 && light < 500) lcd.write(byte(2)); // rain
  else lcd.write(byte(4));                          // clock

  lcd.setCursor(9, 0);
  lcd.print("Time:");
  int mins = (elapsed / 60) % 60;
  int secs = elapsed % 60;
  if (mins < 10) lcd.print("0");
  lcd.print(mins);
  lcd.print(":");
  if (secs < 10) lcd.print("0");
  lcd.print(secs);

  // Bottom line: weather message
  lcd.setCursor(0, 1);
  lcd.print(messages[messageIndex]);
}

void loop() {
  unsigned long now = millis();
  float temp = getTemperature();
  int light = analogRead(LIGHT_SENSOR_PIN);
  unsigned long elapsed = (now - startTime) / 1000;

  if (now - lastUpdate >= 5000) {
    lastUpdate = now;
    messageIndex = (messageIndex + 1) % 6;
  }

  updateDisplay(temp, light, elapsed);
  delay(1000);
}

Video:

https://drive.google.com/file/d/1QWRUIpIZbi3IfBfMIdGhX0W_My97gPTV/view?usp=sharing