This is an old revision of the document!


Arduino vihiku harjutuste lahendused

Harjutus #1.1

/*
Nimetus: Näide #1.1 Digitaalsed sisend-väljundid
Kirjeldus: Nuppu korraks vajutades vilgub LED 3 korda
*/
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int led = 13; // Viik kuhu on ühendatud roheline LED
// Globaalsed muutujad
int nupuOlek = 0; // Nupu oleku muutuja ja algväärtustamine
 
void setup() { 
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks 
  pinMode(nupp, INPUT_PULLUP); // algväärtustame nupu viigu sisendiks ja aktiveerime sisemise pull-up takisti
}
 
void loop(){
  nupuOlek = digitalRead(nupp); // salvestame muutujasse nupu hetke väärtuse
  if (nupuOlek == LOW) { // Kui nupu on alla vajutatud
    for(int i = 0; i < 3; i++){
      digitalWrite(led, HIGH); // süütame LED-i
      delay(200); //viide led põlemas hoidmiseks
      digitalWrite(led, LOW); //  kustutame LED-i
      delay(200); //viide led kustus hoidmiseks
    }
  }
}

Harjutus "1.2

NB! LED vilkumisel on sees pikad viited, mistõttu vilkumise välja lülitamiseks tuleb lülitit pikemalt all hoida.

/*
Nimetus: Näide #1.2 Digitaalsed sisend-väljundid
Kirjeldus: LED vilkumise sisse/välja lülitamine lülitiga
*/
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int led = 13; // Viik kuhu on ühendatud roheline LED
// Globaalsed muutujad
bool vilguta = false; //muutuja vilgutamise sisse välja lülitamiseks
 
void setup() { 
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks 
  pinMode(nupp, INPUT_PULLUP); // algväärtustame nupu viigu sisendiks ja aktiveerime sisemise pull-up takisti
}
 
// Algus identne näitega #1.1
void loop(){
  if(digitalRead(nupp) == LOW){ //kontrolli kas lülitit on vajutatud
    vilguta = !vilguta; //inverteerime vilgutamise muutuja, et vilkumine sisse/välja lülitada
    delay(50); //kontaktide värelemise viide (debounce)
    while(digitalRead(nupp) == LOW); //ootab kuni nupp lastakse lahti
  }
 
  if (vilguta == 1) { // Kui nupu olek on madal 
    delay(1000); //led kustus hoidmise viide
    digitalWrite(led, HIGH); // süütame LED-i 
    delay(1000); // led põlemas hoidmise viide
  } 
  digitalWrite(led, LOW); // kustutame LED-i 
}

Harjutus #1.3

/*
  Nimetus: Näide #1.3 Digitaalsed sisend-väljundid
  Kirjeldus: Iga nupu vajutusega vilgub LED aina rohkem kordi
*/
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int led = 13; // Viik kuhu on ühendatud roheline LED
// Globaalsed muutujad
int nupuVajutusi = 0;
 
void setup() {
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
  pinMode(nupp, INPUT_PULLUP); // algväärtustame nupu viigu sisendiks ja aktiveerime sisemise pull-up takisti
}
 
void loop() {
  if (digitalRead(nupp) == LOW) { // kontrollib kas nupu olek on madal
    nupuVajutusi++; //liidame ühe muutuja väärtusele
    delay(50); //lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    while (digitalRead(nupp) == LOW) { //tsükkel jätkub lõputult kuni nupu olek on madal
      // Ootame nupu lahtilaskmist
    }
    for(int i = 0; i < nupuVajutusi*2;i++){
      digitalWrite(led, !digitalRead(led)); // LED viigu väljund inverteeritakse kasutades viigu hetke olekut
      delay(200); //viide, et hoida led kustus/põlemas
    }
    delay(50); //lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
  }
}

Harjutus 2.1

/*
Nimetus: Näide #2.1 LED juhtimine potentsiomeetriga 
Kirjeldus: Potentsiomeetri pööramisel üle etteantud piiri süttib LED
*/
const int pote = A0; // määrame potentsiomeetri ühendusviigu (sisend)
const int led = 13; // määrame LED ühendusviigu (väljund)
int poteOlek = 0; // muutuja potentsiomeetri väärtuse salvestamiseks
 
void setup() {
  //mikrokontrolleri viigud on tavaolekus sisendid
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
}
void loop() {
  poteOlek = analogRead(pote); // loeme anduri väärtuse
  if(poteOlek >= 1023 || poteOlek <= 0)digitalWrite(led, HIGH); // kustutame LED-i
  else digitalWrite(led, LOW); // süütame LED-i
}

Harjutus 2.2

/*
Nimetus: Näide #2.2 LED juhtimine potentsiomeetriga
Kirjeldus: Potentsiomeetri asendist sõltub LED vilkumise sagedus
*/
 
const int pote = A0; // määrame potentsiomeetri ühendusviigu (sisend)
const int led = 13; // määrame LED ühendusviigu (väljund)
const int fikseeritud_viide = 512;
int poteOlek = 0; // muutuja potentsiomeetri väärtuse salvestamiseks
 
void setup() {
  //mikrokontrolleri viigud on tavaolekus sisendid
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
}
void loop() {
  poteOlek = analogRead(pote); // loeme anduri väärtuse
  digitalWrite(led, HIGH); // kustutame LED-i
  if(poteOlek > 512) delay(1023 - poteOlek); // tekitame viite <poteOlek> millisekundit
  else delay(fikseeritud_viide); // tekitame viite <poteOlek> millisekundit
  digitalWrite(led, LOW); // süütame LED-i
  if(poteOlek < 512) delay(poteOlek); // tekitame viite <poteOlek> millisekundit
  else delay(fikseeritud_viide); // tekitame viite <poteOlek> millisekundit
}

Harjutus 2.3

/*
  Nimetus: Näide #2.3 LED juhtimine potentsiomeetriga
  Kirjeldus: Potentsiomeetri asendi muutuse kiiruse järgi LED heleduse reguleerimine
*/
 
//Konstandid
const int pote = A0; // määrame potentsiomeetri ühendusviigu (sisend)
const int led = 13; // määrame LED ühendusviigu (väljund)
const int maxLoendurVaartus = 150;
//Globaalsed muutujad
int poteOlek = 0;
int viimanePoteOlek = 0;
int kiirus = 0;
int loendur = 0;
 
void setup() {
  //mikrokontrolleri viigud on tavaolekus sisendid
  pinMode(led, OUTPUT); // algväärtustame LED viigu väljundiks
}
void loop() {
  poteOlek = analogRead(pote); // loeme anduri hetkeväärtuse
  //Arvutame kiiruse anduri hetkeväärtuse ja eelneva väärtuse lahutustehtena
  //Olenevalt kumb pidi potentsiomeetri liigutab on vaja ka tehe teha ühte
  //või teistpidi, et ei tekiks negatiivset arvu
  if(poteOlek > viimanePoteOlek) kiirus = poteOlek - viimanePoteOlek;
  else  kiirus = viimanePoteOlek - poteOlek;
 
  if(kiirus > 100) kiirus = 100; //piirab kiiruse väärtuse ära, et ei tekiks negatiivset viidet
  //kui potentsiomeetr ei liigu, siis võib siiski analoog-digitaal muunduri müra tõttu led tuhmilt põleda.
  //Selle olukorra eemaldamiseks seame minimaalse kiiruse väärtuse, millest alates LED põlema võib minna
  if(kiirus > 5){ 
    digitalWrite(led, HIGH); // süütab LED-i
    delayMicroseconds(kiirus); // hoia LED põlemas kiiruse väärtusega võrdne arv mikrosekundeid 
  }
  digitalWrite(led, LOW); //kustutab LED-i
  delayMicroseconds(100 - kiirus); // hoia LED kustus 100st mikrosekundist ülejäänud arv mikrosekundeid
 
  //Kuna PWM signaali ehk LED heleduse reguleerimiseks peab loop() tsükkel võimalikult kiirelt töötama,
  //siis ei saa lisanduvaid viiteid lubada, et led põleks võimalikult stabiilselt. Samas potentsiomeetri 
  //hetke väärtuse ja eelneva väärtuse uuendamise vahe on liiga väike, et tekiks adekvaatne kiiruse väärtus.
  //Probleemi lahenduseks on kasutatud viite tekitamiseks muutuja suurendamise meetodit, mis jõudes ette
  //antud väärtuseni teeb tegevuse ja nullib loenduri.
  loendur++; //suurenda muutujat loendur ühe võrra
  if(loendur >= maxLoendurVaartus){
    viimanePoteOlek = poteOlek; //uuenda eelmise potentsiomeetri väärtust
    loendur = 0; // nulli loendur
  }
}

Harjutus 2.2

 

Harjutus 2.3

 

Harjutus 2.2

 

Harjutus 2.3

 
et/arduino/book/lahendused.1484055800.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