Praktika 5: LCD ekraan

Sisukord:

  1. Katse 5.1
  2. Katse 5.2
  3. Katse 5.3 (Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”)

Katse 5.1

Kirjeldus:

Projekt, kus pilt liigub LCD-ekraanil, näidates poissi ja tüdrukut teineteisele südameid ja emotikone saatmas.

Programm:

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

Kuidas programm töötab:

Programm kuvab LCD-ekraanil erinevaid erisümboleid, nagu naeratus, käed üles/alla, kass, tüdruk ja süda. setup() funktsioonis seadistatakse ekraan ja luuakse need erisümbolid. loop() funktsioonis kuvatakse need sümbolid ekraanil, liigutades kursorit ja lisades pausi, et luua liikumise ja efektide tunne.

Katse 5.2

Kirjeldus:

Projekt, kus Arduino Uno plaat loeb aega käivitamise hetkest. (töö alguse)

Programm:

unsigned long algusAeg;
unsigned long kestus;

void setup() 
{
  Serial.begin(9600);
  algusAeg = millis(); // Salvestame, millal töö algas
  Serial.println("Too 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("Too 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
}

Kuidas programm töötab:

Programm mõõdab aega, mis on möödunud alates selle käivitamisest. setup() funktsioonis salvestatakse algusaja väärtus millis() abil ja kuvatakse sõnum “Töö algas!”. loop() funktsioonis arvutatakse möödunud aeg (kestus) ja see teisendatakse tundideks, minutiteks ja sekunditeks. Tulemused kuvatakse iga sekundi tagant seriaalmonitori kaudu.

Katse 5.3 (Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”)

Töö kirjeldus:

Ilmajaam LCD-ekraaniga, mis kuvab aega ja temperatuuri ning seda, kas päike paistab ja kas on soe või külm.

Töö protsess:

Programm töötab koos LCD-ekraaniga, et kuvada ilmastikuandmeid, temperatuuri ja valgustugevust. Ekraanil kuvatakse erinevaid ilmaolekuid (näiteks päike, pilv, vihm) koos vastava teksti ja sümbolitega. Temperatuur ja valgustugevus loetakse anduritega, ja ekraanil vahelduvad erinevad ilmastiku sõnumid sõltuvalt temperatuurist ja valgustusest. Programm vaheldab ka ilmastiku ja temperatuuri kuvamise iga 8 sekundi järel.

Kasutatud komponenid:

Arduino UNO plaat (1tk)
Arendusplaat (1tk)
Juhtmed (20tk)
Takisti (1tk 10 kΩ, 2tk 220Ω)
LCD (1tk 16×2)
Fotoristor (1tk)
Temperatuuriandur (1tk)

LCD rakendamine:

Ta kasutatakse digitaalsetes kellades, koduautomaatikas seadmete staatuse kuvamiseks, mõõteriistades, nagu termomeetrid ja niiskusmõõtjad, ning automaatides ja müügimasinates tooteinfo ja hindade kuvamiseks.

Skeem:

Programm:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

char* weatherTexts[] = {
  "Paistab paike!", 
  "Pilves ilm!",
  "Ilm on soe!", 
  "Ilm on ilus!", 
  "Ilm on kulm!", 
};

byte sun[] = { 0b00100, 0b10101, 0b01110, 0b11111, 0b01110, 0b10101, 0b00100, 0b00000 };
byte cloud[] = { 0b01110, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000, 0b00000 };
byte rain[] = { 0b01000, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000, 0b00000, 0b00000 };
byte snow[] = { 0b00100, 0b01010, 0b00100, 0b00000, 0b00000, 0b01110, 0b01010, 0b00100 };
byte smile[] = { 0b00000, 0b00000, 0b00000, 0b01010, 0b00000, 0b10001, 0b01010, 0b00000 };

const int PHOTO_PIN = A1;
const int TEMP_PIN = A0;
int lightLevel; 
float temp; 
bool isTemp = false;
unsigned long changeTime = 0;
int lastNum = 0;

void setup() 
{
	lcd.begin(16, 2);
	lcd.createChar(1, sun);
	lcd.createChar(2, cloud);
	lcd.createChar(3, sun);
  	lcd.createChar(4, rain);
	lcd.createChar(5, snow);
	lcd.createChar(6, smile);
	Serial.begin(9600);  
	
	delay(500);
	lcd.setCursor(0, 0);
	lcd.print("Ilmajaam: Shrek");
  	for(int i = 0; i < 16; i++)
	{
		lcd.setCursor(i, 1);
		lcd.write(6);
		delay(150);
	}
	
	lcd.clear();
}

float readTemp() 
{
  int sensorValue = analogRead(TEMP_PIN);
  float voltage = (sensorValue * 5.0) / 1023.0;
  float temperatureC = (voltage - 0.500) * 100.0;
  return temperatureC;
}

int readLight() 
{
	return analogRead(PHOTO_PIN);
}

void setCurTopText(int num)
{
	lcd.setCursor(0, 0);
	lcd.print(weatherTexts[num]);
	lcd.write(num+1);
}

void loop() 
{
	unsigned long seconds = millis() / 1000;
	temp = readTemp();
	lightLevel = readLight();
	Serial.println("C: "+(String)temp+", Brightness: "+(String)lightLevel);
	
	lcd.setCursor(0, 1);
	lcd.print("C ");
	lcd.print(temp, 1);
	lcd.print(" Kell ");
	lcd.print(seconds);
	
  	int num = 0;
    if (isTemp)
    {
		num = (lightLevel > 700) ? 0 : 1;
    }
	else
	{
		num = (temp > 26) ? 2 : 
				(temp > 20) ? 3 : 4;
	}
	
	if (lastNum != num)
	{
		lastNum = num;
		lcd.setCursor(0, 0);
		lcd.clear();		
		lcd.setCursor(0, 1);
		lcd.clear();
	}
	
	setCurTopText(num);
	
	if (changeTime < seconds)
	{
		isTemp = !isTemp;
		changeTime = seconds + 8;
		lcd.setCursor(0, 0);
		lcd.clear();		
		lcd.setCursor(0, 1);
		lcd.clear();
	}
  
  	delay(300);
}

Video:

–> LINK <–

Uued funktsioonid:

LiquidCrystal – Arduino teek, mida kasutatakse LCD-ekraani juhtimiseks.
lcd.begin – algatab ekraani määratud suurusega
lcd.createChar – loob kohandatud sümboleid
lcd.setCursor – määrab kursor asukoha
lcd.print – kuvab teksti või arve
lcd.write – kuvab ühe sümboli
lcd.clear – puhastab ekraani