This is an old revision of the document!


TTU Summer School programming

Projekt 1 LED-i juhtimine nupuga

Arduino ühendusskeem

Näide #1.1 Nuppu all hoides LED põleb

https://www.arduino.cc/en/Tutorial/DigitalPins.

/*
Nimetus: Näide #1.1
Kirjeldus: Nuppu all hoides LED põleb 
*/
 
/* Konstandid */
// Viik kuhu on ühendatud nupp
const int nupp = A0; 
 
// Viik kuhu on ühendatud LED
const int led = 13; 
 
/* Globaalsed muutujad */
// Nupu muutuja oleku salvestamine ja selle algväärtustamine
int nupuOlek = 0; 
 
void setup() 
{ 
  // LED viigu väljundi seadistamine 
  pinMode(led, OUTPUT); 
  // Nupu viigu sisendi seadistamine ja sisemise "pull-up" takisti aktiveermine
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
  // Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
  } 
  // Muul juhul seadistame LED viigu madalaks ehk LED ei põle
  else 
  { digitalWrite(led, LOW);
  }
}

Näide #1.2 Nupule vajutades LED süttib 1 sekundiks

/*
Nimetus: Näide #1.2
Kirjeldus: Nupule vajutades süttib LED 1 sekundiks
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
 
  /* Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib,
     programm seisab 1 sekund ja pärast seda seatakse viik tagasi madalaks */
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
    delay(1000); // 1000 millisekundit ehk 1 sekund
  } 
  digitalWrite(led, LOW);
}

Näide #1.3 Nupule vajutades muudab LED oma olekut

/*
  Nimetus: Näide #1.3
  Kirjeldus: Nupule vajutades muudab LED oma olekut püsivalt
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop() 
{
  // Programm ei tee midagi kuni vajutatakse nuppu
  if (digitalRead(nupp) == LOW) 
    {
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    while (digitalRead(nupp) == LOW)
     { //Tsükkel hoiab programmi kinni kuni nupu viigu olek muutub kõrgeks
     }
    /* LED viigu olek inverteeritakse ehk seatakse
       vastupidiseks kasutades hetkeväärtust */
    digitalWrite(led, !digitalRead(led)); 
 
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    }
}

Harjutused

Harjutus #1.1

Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda.

Harjutus #1.2

Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab LED konstantselt vilkuma 1 sekundilise intervalliga ja teine nupule vajutus lõpetab vilkumise.

Harjutus #1.3

Modifitseerida näiteprogrammi nii, et nupule vajutades LED vilgub nii mitu korda, kui on nuppu programmi töötamise jooksul kokku vajutatud. Pärast igat vajutust suureneb vilkumiste arv ühe võrra.

 

Projekt 2 LED-i juhtimine potentsiomeetriga

Näide #2.1 Potentsiomeetri pööramisel üle nivoo süttib LED

/*
Nimetus: Näide #2.1
Kirjeldus: Potentsiomeetri pööramisel üle nivoo süttib LED
*/
 
// Viik kuhu on ühendatud potentsiomeeter
const int pote = A1; 
 
// Viik kuhu on ühendatud LED
const int led = 13; 
 
// Potentsiomeetri muutuja väärtuse salvestamine ja selle algväärtustamine
int poteOlek = 0; 
 
void setup()
{
  /* Mikrokontrolleri viigud on tavaolekus sisendid ja seega ei pea
  potentsiomeetri sisendit eraldi seadistama */
  pinMode(led, OUTPUT); // Seadistame LED viigu väljundiks
}
 
void loop() 
{
  // Viigu muutuja hetkeväärtuse salvestamine
  poteOlek = digitalRead(pote); 
 
  // Kui sisendviik on kõrge, siis seame LED viigu kõrgeks
  if(poteOlek > 0)
  {
    digitalWrite(led, HIGH);
  }
  // Muul juhul seame led viigu madalaks
  else
  {
    digitalWrite(led, LOW);
  }
}

Näide #2.2 LED-i vilkumise sagedus sõltub potentsiomeetri asendist

/* Nimetus: Näide #2.2
   Kirjeldus: LED-i vilkumise sagedus sõltub potentsiomeetri asendist
*/
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
const int pote = A1; 
const int led = 13; 
 
int poteOlek = 0; 
 
void setup()
{
  pinMode(led, OUTPUT);
}
 
void loop() 
{
  // Potentsiomeetri muutuja hetkeväärtuse salvestamine 
  poteOlek = analogRead(pote); 
 
  // LED viigu oleku kõrgeks seadmine
  digitalWrite(led, HIGH); 
 
  // Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
  delay(poteOlek);  
 
  // LED viigu oleku madalaks seadmine
  digitalWrite(led, LOW); 
 
  // Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
  delay(poteOlek); 
}

Näide #2.3 LED-i ereduse juhtimine potentsiomeetri asendi järgi

/* Nimetus: Näide #2.3
   Kirjeldus: LED-i ereduse juhtimine potentsiomeetri asendi järgi */
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
 
const int pote = A1; 
const int led = 13; 
int poteOlek = 0; 
 
void setup()
{
  pinMode(led, OUTPUT);
}
 
void loop() 
{
  // Potentsiomeetri muutuja hetkeväärtuse salvestamine
  poteOlek = analogRead(pote); 
 
/* Kui potentsiomeetri väärtus on suurem kui 0, siis seame LED viigu kõrgeks,
   seejärel programm ootab potentsiomeetri väärtusega võrdse arvu mikrosekundeid */
  if (poteOlek > 0) 
  {
    digitalWrite(led, HIGH);
    delayMicroseconds(poteOlek); 
  }
 
  // Seame LED viigu madalasse olekusse
  digitalWrite(led, LOW); 
 
  // Programm ootab ülejäänud arvu mikrosekundeid perioodist 
  delayMicroseconds(1023 - poteOlek); 
}

Harjutused

Harjutus #2.1

Modifitseerida näitekoodi nii, et LED läheb põlema viigu kõrgest olekust madalasse olekusse minekul. Potentsiomeetri kogu pöördenurk vastab pingevahemikule 0-5 V. Leida ligilähedane pinge väärtus, mille juures Arduino sisend muutub madalast olekust kõrgesse olekusse ja vastupidi. Kas esineb hüsterees lülitumiste vahel? Tulemuse saamiseks võib kasutada potentsiomeetri nurka või jadapordi monitori.

Harjutus #2.2

Modifitseerida näiteprogrammi nii, et potentsiomeetri keskpunktist (väärtus ~512) ühele poole reguleeritakse LED-i põlemas oleku viidet ja teisele poole kustus oleku viidet. Viite pikkuse reguleerimisel peab maksimaalne viite väärtus olema keskpunkti lähedal ja minimaalne lõpp-punktides. Fikseeritud viite pikkus peab olema 512 millisekundit. Seejuures reguleeritav viite pikkus peab jääma vahemikku 0 kuni 511. Tulemusena peaks ühes potentsiomeetri äärmuses LED olema püsivalt põlemas ja teises püsivalt kustus ning keskel võrdselt põlemas ja kustus.

Harjutus #2.3

Modifitseerida näiteprogrammi nii, et LED põleb ainult potentsiomeetri pööramise ajal. LED-i põlemise eredus sõltub potentsiomeetri pööramise kiirusest.

Projekt 3 Alfabeetiline LCD

Näide #3.1 LCD ekraanile kirjutamine

https://www.arduino.cc/en/Reference/LiquidCrystal

/*
Nimetus: Näide #3.1
Kirjeldus: LCD ekraanile kirjutamine
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h> 
 
// LCD objekti tekitamine ja ühendusviikude määramine. 
// NB! Need viigud võivad olla erinevatel LCD laiendusplaatidel erinevad
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
void setup() 
{
  // LCD ridade ja veergude määramine vastavalt riistvarale 
  lcd.begin(16, 2); 
 
  // Ekraani tervitusteksti kuvamine
  lcd.print("Tere Tallinn!"); 
}
 
void loop() 
{
  // Kursori asukohta muutmine: esimene veerg(tähis 0) ja teine rida (tähis 1)
  lcd.setCursor(0, 1); 
 
  // Ekraani loenduri väärtuse kuvamine
  lcd.print(millis()/1000); 
}

Näide #3.2 Erikujuliste tähemärkide kuvamine LCD ekraanil

/*
Nimetus: Näide #3.2
Kirjeldus: Erikujuliste tähemärkide tekitamine ja kuvamine LCD ekraanil
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h>
 
// LCD objekti tekitamine ja ühendusviikude määramine
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
/* Massiiv erikujulise tähemärgi tekitamiseks,
   "0b" numbrite ees ütleb kompilaatorile, et tegemist on kahendsüsteemis arvuga.
   Kahendsüsteemi arvude kasutamisel tekib parem arusaam
   kuvatavate pikslite asukohtadest. */
byte customChar[8] = 
{
  0b11111,
  0b00000,
  0b01010,
  0b00000,
  0b10001,
  0b01110,
  0b00000,
  0b11111
};
 
void setup()
{
  // Tekitab uue erikujulise tähemärgi draiveri mällu kohale 0
  lcd.createChar(0, customChar); 
 
  // LCD ridade ja veergude määramine vastavalt riistvarale
  lcd.begin(16, 2); 
 
  //  Draiveri mälus kohal 0 oleva erikujulise tähemärgi kuvamine ekraanile
  lcd.write((uint8_t)0); 
}
void loop()
{
  /* Tsüklis ei tehta midagi kogu tegevus
     on sooritatud juba //setup// funktsioonis */
}

Näide #3.3 LCD laiendusplaadi nuppude lugemine

/*
Nimetus: Näide #3.3
Kirjeldus: LCD laiendusplaadi nuppude lugemine
*/
// Vajaliku teegi kaasamine
#include <LiquidCrystal.h>
 
// LCD objekti tekitamine ja ühendusviikude määramine
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// Nupude konstandi defineerimine 
const int nuppRIGHT = 0;
const int nuppUP    = 1;
const int nuppDOWN  = 2;
const int nuppLEFT  = 3;
const int nuppSELECT = 4;
const int nuppNONE  = 5;
 
/* Globaalsed muutujad */
// Vajutatud nupu muutuja konstandi salvestamine
int vajutatudNupp;
// Aanaloogsisendi muutuja väärtuse salvestamine
int nupuSisend; 
 
void setup() 
{
  // LCD ridade ja veergude määramine vastavalt riistvarale
  lcd.begin(16, 2); 
 
  // Ekraani info kuvamine
  lcd.print("ADC: ");
 
  // Ekraani analoogsisendi A0 väärtuse kuvamine
  lcd.print(analogRead(A0)); 
}
void loop() 
{
  /* Kutsub välja funktsiooni kontrolliNuppe 
   ja salvestab tagastatud väärtuse muutujasse */
  vajutatudNupp = kontrolliNuppe(); 
 
  // Kontrollib kas mõni nupp on alla vajutatud 
  if(vajutatudNupp < nuppNONE)
  {
    lcd.clear(); // Puhastab ekraani ja liigutab kursori tagasi algasendisse
 
    lcd.print("ADC: "); // Teksti kuvamine ekraanil
 
    lcd.print(nupuSisend); // Muutuja väärtuse kuvamine ekraanil
 
    delay(500); // Lühike viide, et ekraanil väärtust liiga kiirelt ei uuendataks
  }
}

 

// Funktsioon võtab analoogsisendi väärtuse ja võrdleb olemasolevate väärtustega.
// Tagastab arvu vahemikus 0 kuni 5 vastavalt defineeritud konstandile
int kontrolliNuppe()
{
 // Salvestab muutujasse analoogväärtuse viigult A0
 nupuSisend = analogRead(A0);
 if (nupuSisend < 50)   return nuppRIGHT;
 if (nupuSisend < 195)  return nuppUP;
 if (nupuSisend < 380)  return nuppDOWN;
 if (nupuSisend < 555)  return nuppLEFT;
 if (nupuSisend < 790)  return nuppSELECT;
 // Kui ühtegi nuppu pole vajutatud, siis tagastatakse "nuppNONE"
 return nuppNONE;
}

Harjutused

Harjutus #3.1

Muuta näiteprogrammi nii, et mõlemale reale tekkiv tekst oleks võimalikult keskele joondatud.

Harjutus #3.2

Koostada animatsioon LCD ekraanil, kasutades ise genereeritud tähemärke. Tähemärkide massiivide tekitamiseks kasutada generaatorit, mille leiab siit: https://omerk.github.io/lcdchargen/

Harjutus #3.3

Muuta näiteprogrammi nii, et nupud “RIGHT”, “LEFT”, “UP” ja “DOWN” muudavad kuvatava teksti asukohta LCD ekraanil. Tulemusena peaks nupu vajutamisel tekst liikuma nurka vastavalt vajutatud nupu suunale. Nt. Nupu “DOWN” vajutamisel liigub tekst alumisele reale ja nupu “RIGHT” vajutamisel paremasse äärde.

en/arduino/examples.1500959503.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0