Ülesanne #1

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (7tk)
  • 330 Ω takisti (1tk -220Ω, 2tk – 10kΩ)
  • LED (1tk)
// 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);
}

Ilmajaam

Video

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

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

Kirjeldus

Luua kujundatud mini-ilmajaam, mis kuvab andmete põhjal teavet LCD-ekraanil. Kasutades erinevaid andureid (nt temperatuurisensor, valgustundlik andur, kella moodul jne), kuvatakse reaalajas ilmastikutingimused, asjakohased laused ja vastavad pildid, mis võivad muutuda sõltuvalt ajast või mõõdetud andmetest.

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (22tk)
  • 220 Ω Takisti (1tk)
  • 10 kΩ Takisti (1tk)
  • LCD-ekraan (1tk)
  • Potentiometer (1tk)
  • Temperatuuri andur (1tk)
  • Fototakisti (1tk)

Uuritud funktsioonid

lcd.clear()Puhastab kogu LCD-ekraani ja seab kursori tagasi algusesse.
lcd.print(“tekst”)Kuvab LCD-ekraanil antud teksti, alustades määratud kursori positsioonist.
#include <LiquidCrystal.h>Lisab LiquidCrystal teegi, mis võimaldab kasutada LCD-ekraani koos Arduino-ga.
lcd.setCursor(col, row)Määrab, kuhu kuvatakse järgmine tekst, paigutades kursori soovitud veeru ja rea peale.
lcd.createChar(num, data[])Loob kohandatud sümboli, kus num on sümboli indeks (0–7) ja data[] määrab selle kuju.
LiquidCrystal lcd(rs, e, d4, d5, d6, d7)Luuakse LCD-ekraani objekt ja määratakse ühenduspinnid (RS, E, D4–D7).
lcd.write(byte(num))Kuvab LCD-ekraanil varem loodud kohandatud sümboli vastava numbriga.
lcd.begin(cols, rows)Alustab LCD-ekraani töö, määrates tulpade ja ridade arvu (nt lcd.begin(16, 2);).

Selgitus

Ühendame Liquidcrystali teegi ja loome lcd-objekti, näidates tihvtid, millega ekraan on ühendatud. See võimaldab meil suhelda LCD-ekraaniga.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Kuulutame välja kaks analoognõela: üks temperatuurianduri jaoks, teine valgusanduri jaoks. Samuti loome muutujaid pinge ja temperatuuri hoidmiseks.

const int temperaturePin = A1;
const int lightPin = A0;

float voltage, degreesC;

Loome stringide massiivid-fraasid, mis kuvatakse ekraanil sõltuvalt temperatuurist ja valgustusest.

char* tempTekstid[] = {
  "Vaga kulm!",       
  "Soe ja monus!",     
  "Soojus kasvab!",  
  "Palavus!"   
};

char* lightTekstid[] = {
  "Paikseline",   
  "Pilvine",      
  "Vihmane"       
};

Määratleme kohandatud sümbolid: emotikon, vihm, kraadiikoon, süda ja pilv. Need laaditakse LCD-sse ja kuvatakse õigel hetkel.

byte smile[8] = {...};
byte rain[8] = {...};
byte degrees[8] = {...};
byte heart[8] = {...};
byte cloud[8] = {...};

Initsialiseerime jadapordi silumiseks. Seejärel valmistame ette LCD (16×2) ja kirjutame loodud sümbolid kuvamällu.

Serial.begin(9600);

lcd.begin(16, 2);
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, heart);
lcd.createChar(5, cloud);

Kuvame avakuva: “Ilmajaam” ja “TTHK”, samuti mängime alumisel real liikuva südame ja emotikoni animatsiooni.

lcd.setCursor(0, 0);
lcd.print("Ilmajaam:");
lcd.setCursor(0, 1);
lcd.print("TTHK");

for (int koht = 9; koht <= 15; koht++) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(4));
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" ");
}

for (int koht = 14; koht >= 9; koht--) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(2));
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" ");
}

Loeme temperatuuri analoogväärtuse, teisendame selle pingeks ja seejärel Celsiuse kraadiks, kasutades TMP valemit.

voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;

Loeme valgustustaset, skaleerime ja piirame seda edasiseks töötlemiseks vahemikus 0-255.

int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);

Praeguse temperatuuri põhjal valime sobiva sõnumi.

  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];
  }

Valime sõnumi ja vastava ikooni valgustuse põhjal.

  char* lightTekst;
  byte lightIcon;
  if (lightLevel > 170){
    lightTekst = lightTekstid[2];
    lightIcon = 3;
  } else if (lightLevel > 85){
    lightTekst = lightTekstid[1];
    lightIcon = 5;
  } else {
    lightTekst = lightTekstid[0];
    lightIcon = 2;
  }

Puhastame ekraani ja näitame temperatuuri kirjeldust ning täpset väärtust koos kraadide sümboliga.

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTekst);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);

Kuvame ilmastiku kirjelduse valgustuse järgi koos vastava ikooni ja praeguse temperatuuriga.

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(lightTekst);
lcd.setCursor(strlen(lightTekst) + 1, 0);
lcd.write(lightIcon);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);

Kood

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// määrame andurite pin-id
const int temperaturePin = A1;
const int lightPin = A0;

// loome muutujad mõõtmistulemusteks
float voltage, degreesC;

// määrame temperatuuritekstid
char* tempTekstid[] = {
  "Vaga kulm!",       
  "Soe ja monus!",     
  "Soojus kasvab!",  
  "Palavus!"   
};

// määrame valgusetingimuste tekstid
char* lightTekstid[] = {
  "Paikseline",   
  "Pilvine",      
  "Vihmane"       
};

// loome pildikoodid LCD jaoks
byte smile[8] = {
    0b00000,
    0b01010,
    0b01010,
    0b00000,
    0b10001,
    0b01110,
    0b00000,
    0b00000
};

byte rain[8] = {
    0b00100,
    0b00100,
    0b01010,
    0b01010,
    0b11101,
    0b11111,
    0b11111,
    0b01110
};

byte degrees[8] = {
    0b01110,
    0b01010,
    0b01110,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
};

byte heart[8] = {
    0b00000,
    0b01010,
    0b11111,
    0b11111,
    0b01110,
    0b00100,
    0b00000,
    0b00000
};

byte cloud[8] = {
    0b00000,
    0b00000,
    0b01100,
    0b11011,
    0b11101,
    0b01110,
    0b00000,
    0b00000
};

void setup() {
  Serial.begin(9600); // käivitame jadapordi suhtluse

  lcd.begin(16, 2); // määrame LCD mõõtmed
  lcd.createChar(1, degrees);
  lcd.createChar(2, smile);
  lcd.createChar(3, rain);
  lcd.createChar(4, heart);
  lcd.createChar(5, cloud);

  lcd.setCursor(0, 0);
  lcd.print("Ilmajaam:");
  lcd.setCursor(0, 1);
  lcd.print("TTHK");

  // kuvame südame animatsiooni paremal
  for (int koht = 9; koht <= 15; koht++) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(4));
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" ");
  }

  // kuvame naeratuse animatsiooni vasakule
  for (int koht = 14; koht >= 9; koht--) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(2));
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" ");
  }

  lcd.setCursor(9, 1);
  lcd.write(byte(2));

  delay(1000);
}

void loop() {
  // arvutame temperatuuri anduri pinge põhjal
  voltage = analogRead(temperaturePin) * 0.004882814;
  degreesC = (voltage - 0.5) * 100.0;

  // loeme valguse taseme ja teisendame skaalale
  int lightLevel = analogRead(lightPin);
  lightLevel = map(lightLevel, 300, 800, 0, 255);
  lightLevel = constrain(lightLevel, 0, 255);

  Serial.print("Temp: ");
  Serial.print(degreesC);
  Serial.print(" °C | Light level: ");
  Serial.println(lightLevel);

  // valime temperatuuri kirjelduse
  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];
  }

  // valime valguse kirjelduse ja ikooni
  char* lightTekst;
  byte lightIcon;
  if (lightLevel > 170){
    lightTekst = lightTekstid[2];
    lightIcon = 3;
  } else if (lightLevel > 85){
    lightTekst = lightTekstid[1];
    lightIcon = 5;
  } else {
    lightTekst = lightTekstid[0];
    lightIcon = 2;
  }

  // kuvame temperatuuriga ekraani
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(tempTekst);
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print(degreesC, 1);
  lcd.write(byte(1));
  lcd.print("C");
  delay(2000);

  // kuvame valgusekirjelduse ikooniga
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(lightTekst);
  lcd.setCursor(strlen(lightTekst) + 1, 0);
  lcd.write(lightIcon);
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print(degreesC, 1);
  lcd.write(byte(1));
  lcd.print("C");
  delay(2000);
}