This is an old revision of the document!


Arduino koolituse harjutuste lahendused








Harjutus #1.1

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

/*
Nimetus: Harjutus #1.1 Digitaalsed sisend-väljundid
Kirjeldus: Modifitseerida programmi nii, et nupule vajutades vilgub LED kolm korda
Autor: Rain Ellermaa
Kuupäev: 05.06.2014
Versioon: 1.0
*/
 
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int rohelineLED = 13; // Viik kuhu on ühendatud nupp roheline LED 
// Globaalsed muutujad
int NupuOlek = 0; // Nupu oleku muutuja
 
void setup() 
{ 
  pinMode(rohelineLED, OUTPUT); // algväärtustame LED viigu väljundiks 
  pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks 
}
 
void loop()
{
  // Kui nupu olek on madal (GND) e nupp alla vajutatud
  if (digitalRead(nupp) == LOW) 
  {
    // Lihtne variant, kirjutame kolm korda üht sama asja 
    digitalWrite(rohelineLED, HIGH); // süütame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
    digitalWrite(rohelineLED, LOW); // kustutame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
    digitalWrite(rohelineLED, HIGH); // süütame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
    digitalWrite(rohelineLED, LOW); // kustutame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
    digitalWrite(rohelineLED, HIGH); // süütame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
	digitalWrite(rohelineLED, LOW); // kustutame LED-i 
    delay(500); // ootame 0.5 sekundi (500 millisekundit)
 
    // Keeruline variant, kasutame tingimustsüklit, et korrata sama tegevust 3 korda
    for(int kordaja = 0; kordaja < 3; kordaja++)
    {
      digitalWrite(rohelineLED, HIGH); // süütame LED-i 
      delay(500); // ootame 0.5 sekundi (500 millisekundit)
      digitalWrite(rohelineLED, LOW); // kustutame LED-i 
      delay(500); // ootame 0.5 sekundi (500 millisekundit)
    }
 
  } 
}

Harjutus #1.2

Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab led konstantselt vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise

/*
Nimetus: Harjutus #1.2 Digitaalsed sisend-väljundid
Kirjeldus: Modifitseerida programmi nii, et nupule vajutades hakkab led konstantselt 
           vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise
Autor: Rain Ellermaa
Kuupäev: 16.01.2013
Versioon: 1.0
*/
 
// Konstandid
const int nupp = A0; // Viik kuhu on ühendatud nupp
const int rohelineLED = 13; // Viik kuhu on ühendatud nupp roheline LED 
// Globaalsed muutujad
int VilkumiseOlek = 0; // Nupu oleku muutuja
 
void setup() 
{ 
  pinMode(rohelineLED, OUTPUT); // algväärtustame LED viigu väljundiks 
  pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks 
}
 
void loop()
{
  // Kui nupu olek on madal (GND) ja LED vilgub
  if ((digitalRead(nupp) == LOW) && (VilkumiseOlek == 1))
  {
    VilkumiseOlek = 0;	// Lõpetame vilkumise
    while((digitalRead(nupp) == LOW));	// ootame nupu lahti laskmist
    delay(100);
  }
  // Kui nupu olek on madal (GND) ja LED ei vilgu
  else if ((digitalRead(nupp) == LOW) && (VilkumiseOlek == 0))
  {
    VilkumiseOlek = 1;	// Alustame vilkumisega
    while((digitalRead(nupp) == LOW));	// ootame nupu lahti laskmist
    delay(100);
  }
 
  // Kui vilkumine on lubatud, vilguta LEDi
  if(VilkumiseOlek == 1)
  {  
    digitalWrite(rohelineLED, LOW); // kustutame LED-i 
    delay(500); // ootame 1 sekundi (1000 millisekundit)
    digitalWrite(rohelineLED, HIGH); // süütame LED-i 
    delay(500); // ootame 1 sekundi (1000 millisekundit) 
  } 
}

Harjutus #2

Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone.

/*
Nimetus: Näide #2 Analoog sisend 
Kirjeldus: Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delayMicroseconds funktsioone.
Autor: Rain Ellermaa
Kuupäev: 05.06.2014
Versioon: 1.0
*/
 
int pote_sisend = A5; // määrame potentsiomeetri sisendviigu
int led_roheline = 13; // määrame rohelise LEDi ühendusviigu
 
int pote = 0; // muutuja potentsiomeetri väärtuse salvestamiseks
 
void setup() 
{
  pinMode(led_roheline, OUTPUT); // algväärtustame LED viigu väljundiks 
}
 
void loop() 
{
  pote = analogRead(pote_sisend)+1;  // loeme analoogsisendi väärtuse
 
  // Vilgutame LEDi väga kõrgel sagedusel, et paistaks tuhmim
  digitalWrite(led_roheline, HIGH);  // süütame LED-i 
  delayMicroseconds(pote);           // Ootame potensiomeetriga määratud mikrosekundid
  digitalWrite(led_roheline, LOW);   // kustutame LED-i
  delayMicroseconds(1026-pote);      // Ootame ülejäänud mikrosekundid
}

Harjutus #3.1

Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED).

/*
Nimetus: Näide #3 Takistuslikud andurid
Kirjeldus: Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse 
           nupuga programmi mällu ja selle nivoo hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED).
 
Autor: Rain Ellermaa
Kuupäev: 05.06.2014
Versioon: 1.0
*/
#include <LiquidCrystal.h> // Kaasame vajaliku teegi
#include <math.h>
 
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
int pote_sisend = A5;  // määrame potentsiomeetri sisendviigu
int NTC_sisend  = A3;  // määrame temperatuurianduri sisendviigu
int led 	= 13;  // määrame LED ühendusviigu
int nupp 	= A0;  // määrame nupu ühendusviigu
 
// muutujad potentsiomeetri ja temperatuuri väärtuse salvestamiseks
int pote = 0; 
long ntc = 0;
double temperatuur = 0;
int seade = -1;
 
void setup() 
{
  pinMode(led, OUTPUT); // seadistame LED viigu väljundiks 
  pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks 
 
  lcd.begin(16, 2); //Määrame LCD read ja veerud
  lcd.setCursor(0, 1); lcd.print("Seade:    ");
  lcd.setCursor(7, 1); lcd.print(seade);
}
 
void loop() 
{
  pote = map(analogRead(pote_sisend),0,1023,-20,100);  // loeme potensiomeetri väärtuse ja teisendame vahemikku -20C - 100C
  ntc = analogRead(NTC_sisend); // loeme temperatuuri anduri väärtuse
 
  // Teisendame temperatuurianduri väärtuse temperatuuriks
  temperatuur = log(((10240000/ntc) - 10000));
  temperatuur = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * temperatuur * temperatuur))* temperatuur);
  temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse
 
  // Kuvame informatsiooni LCD ekraanile
  lcd.setCursor(0, 0);  lcd.print("Pot:    ");
  lcd.setCursor(4, 0);  lcd.print(pote);
  lcd.setCursor(8, 0);  lcd.print("Tmp:    ");
  lcd.setCursor(12, 0); lcd.print(temperatuur);
 
  // Kui nupule vajutatakse, salvesta seadesuurus
  if(digitalRead(nupp) == LOW)
  {
    seade = pote;
    lcd.setCursor(0, 1); lcd.print("Seade:    ");
    lcd.setCursor(7, 1); lcd.print(seade);
  }
 
  // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud
  if((temperatuur > seade) && (digitalRead(nupp) == HIGH))
  {
    digitalWrite(led, HIGH); // süütame LED-i
  }
  else 
  {
    digitalWrite(led, LOW); // vastasel korral kustutame LED-i
  }
}

Harjutus #3.2

Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati (1 kraad: heledus 25 %, 2 kraadi: heledus 50 %, 3 kraadi: heledus 75 % ja 5 kraadi: heledus 100 %)

/*
Nimetus: Näide #3 Takistuslikud andurid
Kirjeldus: Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus 
           sõltub sellest, kui palju nivootemperatuuri ületati: 
             kuni 1 kraad: heledus 25 % 
             kuni 2 kraadi: heledus 50 % 
             kuni 3 kraadi: heledus 75 % 
             üle selle: heledus 100 %
 
Autor: Rain Ellermaa
Kuupäev: 05.06.2014
Versioon: 1.0
*/
#include <LiquidCrystal.h> // Kaasame vajaliku teegi
#include <math.h>
#include <SoftPWM.h>
 
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
int pote_sisend = A5;  // määrame potentsiomeetri sisendviigu
int NTC_sisend  = A3;  // määrame temperatuurianduri sisendviigu
int led 	= 13;  // määrame LED ühendusviigu
int nupp 	= A0;  // määrame nupu ühendusviigu
 
// muutujad potentsiomeetri ja temperatuuri väärtuse salvestamiseks
int pote = 0; 
long ntc = 0;
double temperatuur = 0;
int seade = -1;
 
void setup() 
{
  pinMode(led, OUTPUT); // seadistame LED viigu väljundiks 
  pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks 
 
  lcd.begin(16, 2); //Määrame LCD read ja veerud
  lcd.setCursor(0, 1); lcd.print("Seade:    ");
  lcd.setCursor(7, 1); lcd.print(seade);
 
  SoftPWMBegin();
}
 
void loop() 
{
  pote = map(analogRead(pote_sisend),0,1023,-20,100);  // loeme potensiomeetri väärtuse ja teisendame vahemikku -20C - 100C
  ntc = analogRead(NTC_sisend); // loeme temperatuuri anduri väärtuse
 
  // Teisendame temperatuurianduri väärtuse temperatuuriks
  temperatuur = log(((10240000/ntc) - 10000));
  temperatuur = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * temperatuur * temperatuur))* temperatuur);
  temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse
 
  // Kuvame informatsiooni LCD ekraanile
  lcd.setCursor(0, 0);  lcd.print("Pot:    ");
  lcd.setCursor(4, 0);  lcd.print(pote);
  lcd.setCursor(8, 0);  lcd.print("Tmp:    ");
  lcd.setCursor(12, 0); lcd.print(temperatuur);
 
  // Kui nupule vajutatakse, salvesta seadesuurus
  if(digitalRead(nupp) == LOW)
  {
    seade = pote;
    lcd.setCursor(0, 1); lcd.print("Seade:    ");
    lcd.setCursor(7, 1); lcd.print(seade);
  }
 
  // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud
  if((temperatuur > seade) && (digitalRead(nupp) == HIGH))
  {
    int vahe = temperatuur - seade;
    switch(vahe)
    {
      case 0: DimLED(led, 25); break;
      case 1: DimLED(led, 50); break;
      case 2: DimLED(led, 75); break;
      default: DimLED(led, 100); break;
    }
  }
  else 
  {
    DimLED(led, 0); // vastasel korral kustutame LED-i
  }
}
 
void DimLED(int led, int value)
{
/*  digitalWrite(led, HIGH);        // süütame LED-i 
  delayMicroseconds((value*10)+1);     // Ootame potensiomeetriga määratud mikrosekundid
  digitalWrite(led, LOW);         // kustutame LED-i
  delayMicroseconds(1001-(value*10));  // Ootame ülejäänud mikrosekundid  
*/  
  SoftPWMSetPercent(led, value);
}

Harjutus #4.1

Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele.

 

Harjutus #4.2

Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti.

 

Harjutus #5

Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani.

 

Praktiline projekt #1

Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). Temperatuurinivoo määratakse potentsiomeetriga. Õhuklapi asend sõltub temperatuuri erinevusest. Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi, jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust.

/*
Nimetus: Projekt #1
 Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor).
 Temperatuurinivoo määratakse potentsiomeetriga.
 Õhuklapi asend sõltub temperatuuri erinevusest.
 Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%.
 Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi,
 jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust. 
 
Kirjeldus: 
          Kasutab Steinhart-Hart termistori valemit:
          temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3}
          kus A = 0.001129148, B = 0.000234125 ja C = 8.76741E-08
Autor: Milan Malesevic and Zoran Stupic 
Modifikatsioon: Raivo Sell
Kuupäev: 15.01.2013/4.06.2014
Versioon: 1.1
*/
 
// Kaasame vajalikud teegid
#include <math.h>
#include <LiquidCrystal.h>
#include <SoftPWM.h>
#include <Servo.h>
Servo Aknaservo;
 
// Initsialiseerime LCD koos vastavate viikude ühendamisega
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int andur = A4; // määrame potentsiomeetri sisendviigu
int pote_sisend=A1;
int LED=A5;
int nupud=A0;
int pote_temp=0;
int seade_temp=0;
int nullistSajani;
unsigned long laks=0;
boolean korras=true;
void setup() {
  Aknaservo.attach(A2);
    // Initialize
  //SoftPWMBegin();
  // Create and set pin 13 to 0 (off)
  //SoftPWMSet(13, 0);
  pinMode(pote_sisend,INPUT);
  pinMode(LED,OUTPUT);
  pinMode(nupud,INPUT);
  lcd.begin(16, 2); //Määrame LCD read ja veerud
  lcd.print("Temperatuur"); // Trükime tervitusteksti
  seade_temp=25;
  delay (500);
  lcd.clear();
  Aknaservo.write(0);
 
  Serial.begin(9600);  
}
 
void loop() {
  while(korras)
  {
  if(millis()-1000>laks){
    lcd.clear(); // Puhastame ekraani vanadest andmetest
    Termistor(analogRead(andur)); // Käivitame funktsooni
    laks=millis();
  }
  if(analogRead(nupud)>490 && analogRead(nupud)<900)
  {
    korras^=1;
    Aknaservo.write(0);
  }
   Serial.println(analogRead(nupud));
  }
  if(!korras)
    {
      digitalWrite(LED,1);
      delay(1000);    
      digitalWrite(LED,0);
      delay(1000);
      Termistor(analogRead(andur));     
    }
}
 
void Termistor(int RawADC) {
   double Temp;
   long Takistus;
  // Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti 
  Takistus=((10240000/RawADC) - 10000);    
 pote_temp=analogRead(pote_sisend);
 pote_temp=map(pote_temp,0,1023,-10,35);
  //Esimene rida 
  lcd.setCursor(0, 0);
  lcd.print("Pot:");
  lcd.print(pote_temp);  //Trükime pinge väärtuse 
  //Teine rida
  if(analogRead(nupud)<100)
    seade_temp=pote_temp;
  lcd.setCursor(0, 1);
  lcd.print("Seade:");
  lcd.print(seade_temp); //Trükime takistuse väärtuse
 
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp);
  Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse
 
  lcd.setCursor(8, 0);
  lcd.print("Tmp:");
  lcd.print(Temp); //Trükime temperatuuri väärtuse
  int vahe=Temp-seade_temp;
  //lcd.setCursor(8,1);
  //lcd.print(vahe);
  if(korras){  
    switch (vahe) {
    case 1:
      Aknaservo.write(Teisenda(25));
      break;
    case 2:
      Aknaservo.write(Teisenda(50));
      break;
    case 3:
    case 4:
      Aknaservo.write(Teisenda(75));
      break;
    case 5:
      Aknaservo.write(Teisenda(100));      
      break;  
    }  
  }
  if(seade_temp<Temp)
  {    
  }
  else
  {
    Aknaservo.write(Teisenda(0));    
    korras=true;
  }
  }
  int Teisenda(int protsent)
  {
    return map(protsent,0,100,0,180);
  }

Praktiline projekt #2

Ventilaatori juhtimine XRF kaudu. Luua programm, mis suudab XRF raadiomooduliga lugeda kaugmoodulilt temperatuuri ning kui temperatur ületab kohalikul kontrolleril seatud nivoo käivitatakse kaugmoodulil asetsev ventilaator. Suhtkuseks kaugmooduliga tuleb kasutada allolevat protokolli: xTEMP – tagastab kümnekordse temperatuuri Celsiuse kraadides (24,5C puhul saadetakse 245) vastus: xNNN xFANn – FAN1 käivitab ventilaatori, FAN0 peatab ventilaatori vastus xFANn

Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva.

 
arduino_lahendused.1402384885.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