This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| arduino_lahendused [2014/06/06 10:22] – created raivo | arduino_lahendused [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Arduino koolituse harjutuste lahendused ====== | ====== Arduino koolituse harjutuste lahendused ====== | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ====== Harjutus #1.1 ====== | ||
| + | Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda | ||
| + | <code c> | ||
| + | /* | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| + | } | ||
| + | |||
| + | 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, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | | ||
| + | // Keeruline variant, kasutame tingimustsüklit, | ||
| + | for(int kordaja = 0; kordaja < 3; kordaja++) | ||
| + | { | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 0.5 sekundi (500 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | 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 | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Harjutus #1.2 Digitaalsed sisend-väljundid | ||
| + | Kirjeldus: Modifitseerida programmi nii, et nupule vajutades hakkab led konstantselt | ||
| + | | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| + | } | ||
| + | |||
| + | 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, | ||
| + | delay(500); // ootame 1 sekundi (1000 millisekundit) | ||
| + | digitalWrite(rohelineLED, | ||
| + | delay(500); // ootame 1 sekundi (1000 millisekundit) | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | </ | ||
| + | ====== Harjutus #2 ====== | ||
| + | |||
| + | Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone. | ||
| + | <code c> | ||
| + | /* | ||
| + | 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 = A1; // 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, | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | pote = analogRead(pote_sisend)+1; | ||
| + | |||
| + | // Vilgutame LEDi väga kõrgel sagedusel, et paistaks tuhmim | ||
| + | digitalWrite(led_roheline, | ||
| + | delayMicroseconds(pote); | ||
| + | digitalWrite(led_roheline, | ||
| + | delayMicroseconds(1026-pote); | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ====== Harjutus #3.1 ====== | ||
| + | Koostada programm, mis trükib potentsiomeetri väärtuse rea algusesse. Vajutades nupule vahetatakse rida ja jooksev väärtus kirjutatakse uuele reale. Vajutades uuesti nuppu vahetatakse aktiivse kirjutamise rida tagasi. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | // Initialize LCD | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | const int nupp = A0; // Viik kuhu on ühendatud nupp | ||
| + | int pote_sisend = A1; // set potentiometer pin | ||
| + | int y=0; | ||
| + | |||
| + | void setup() { | ||
| + | lcd.begin(16, | ||
| + | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | |||
| + | if (digitalRead(nupp) == LOW) { // if button pressed | ||
| + | while (digitalRead(nupp) == LOW){} // wait for button release | ||
| + | if (y) y=0; else y=1; | ||
| + | } | ||
| + | lcd.setCursor(0, | ||
| + | lcd.print(analogRead(pote_sisend)); | ||
| + | lcd.print(" | ||
| + | delay (100); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====== Harjutus #4.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). | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #3 Takistuslikud andurid | ||
| + | Kirjeldus: Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse | ||
| + | | ||
| + | |||
| + | Autor: Rain Ellermaa | ||
| + | Kuupäev: 05.06.2014 | ||
| + | Versioon: 1.0 | ||
| + | */ | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Initsialiseerime LCD koos vastavate viikude ühendamisega | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | |||
| + | int pote_sisend = A1; // määrame potentsiomeetri sisendviigu | ||
| + | int NTC_sisend | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | | ||
| + | lcd.begin(16, | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | pote = map(analogRead(pote_sisend), | ||
| + | ntc = analogRead(NTC_sisend); | ||
| + | | ||
| + | // Teisendame temperatuurianduri väärtuse temperatuuriks | ||
| + | temperatuur = log(((10240000/ | ||
| + | temperatuur = 1/ | ||
| + | temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | | ||
| + | // Kuvame informatsiooni LCD ekraanile | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(4, | ||
| + | lcd.setCursor(8, | ||
| + | lcd.setCursor(12, | ||
| + | | ||
| + | // Kui nupule vajutatakse, | ||
| + | if(digitalRead(nupp) == LOW) | ||
| + | { | ||
| + | seade = pote; | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | } | ||
| + | |||
| + | // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud | ||
| + | if((temperatuur > seade) && (digitalRead(nupp) == HIGH)) | ||
| + | { | ||
| + | digitalWrite(led, | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | digitalWrite(led, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ====== Harjutus #4.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 %) | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #3 Takistuslikud andurid | ||
| + | Kirjeldus: Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus | ||
| + | | ||
| + | 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 < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // 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 | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | | ||
| + | lcd.begin(16, | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | | ||
| + | SoftPWMBegin(); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | pote = map(analogRead(pote_sisend), | ||
| + | ntc = analogRead(NTC_sisend); | ||
| + | | ||
| + | // Teisendame temperatuurianduri väärtuse temperatuuriks | ||
| + | temperatuur = log(((10240000/ | ||
| + | temperatuur = 1/ | ||
| + | temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | | ||
| + | // Kuvame informatsiooni LCD ekraanile | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(4, | ||
| + | lcd.setCursor(8, | ||
| + | lcd.setCursor(12, | ||
| + | | ||
| + | // Kui nupule vajutatakse, | ||
| + | if(digitalRead(nupp) == LOW) | ||
| + | { | ||
| + | seade = pote; | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | } | ||
| + | |||
| + | // 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, | ||
| + | delayMicroseconds((value*10)+1); | ||
| + | digitalWrite(led, | ||
| + | delayMicroseconds(1001-(value*10)); | ||
| + | */ | ||
| + | SoftPWMSetPercent(led, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ====== Harjutus #5.1 ====== | ||
| + | |||
| + | Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele. | ||
| + | <code c> | ||
| + | // Kaasame vajalikud teegid | ||
| + | #include < | ||
| + | |||
| + | Servo myservo; | ||
| + | int nupud = A0; // määrame potentsiomeetri sisendviigu | ||
| + | int pos = 0; // variable to store the servo position | ||
| + | |||
| + | void setup() { | ||
| + | myservo.attach(A2); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | if (analogRead(nupud) <= 90) // Kui on vajutatud parem nupp | ||
| + | { | ||
| + | pos++; | ||
| + | if (pos > 180) | ||
| + | pos = 170; | ||
| + | } | ||
| + | else if ((analogRead(nupud) >= 450) && (analogRead(nupud) <= 550)) // Kui on vajutatud vasak nupp | ||
| + | { | ||
| + | pos--; | ||
| + | if (pos < 1) | ||
| + | pos = 1; | ||
| + | } | ||
| + | myservo.write(pos); | ||
| + | delay(15); | ||
| + | } | ||
| + | </ | ||
| + | ====== Harjutus #5.2 ====== | ||
| + | |||
| + | Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti. | ||
| + | <code c> | ||
| + | // Kaasame vajalikud teegid | ||
| + | #include < | ||
| + | |||
| + | Servo myservo; | ||
| + | int nupud = A0; // määrame potentsiomeetri sisendviigu | ||
| + | int andur = A3; // valgusanduri määramine | ||
| + | |||
| + | int pos = 0; // variable to store the servo position | ||
| + | int pos_max = 0; // variable to store the servo position bi max light | ||
| + | int lugemMax = 0; // | ||
| + | int andur_vaartus=0;// | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | myservo.attach(A2); | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | if (analogRead(nupud) <= 90){ //tehakse läbi nupu vajutamisel | ||
| + | lugemMax = 0; //suurima väärtuse nullimine | ||
| + | pos_max = 0; | ||
| + | |||
| + | // | ||
| + | myservo.write(0); | ||
| + | delay(500); | ||
| + | | ||
| + | //suurima valguskoha otsimine | ||
| + | for(pos = 50; pos < 140; pos += 1) // Liigutame servot 50'st 140'ni | ||
| + | { | ||
| + | myservo.write(pos); | ||
| + | delay(50); | ||
| + | andur_vaartus=analogRead(andur); | ||
| + | Serial.print(" | ||
| + | Serial.print(pos); | ||
| + | Serial.print(" | ||
| + | Serial.println(andur_vaartus); | ||
| + | if (andur_vaartus > lugemMax) | ||
| + | { | ||
| + | lugemMax = andur_vaartus; | ||
| + | pos_max = pos; // vastava positsiooni meelde jätmine | ||
| + | } | ||
| + | } | ||
| + | //Pärast skännimist eredaimasse punkti paika keeramine | ||
| + | myservo.write(pos_max); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ====== Harjutus #6 ====== | ||
| + | |||
| + | Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani. | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #4.1 Jadaliides | ||
| + | */ | ||
| + | #include < | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | |||
| + | // Globaalsed muutujad | ||
| + | char data; | ||
| + | char rida = 0; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | lcd.begin(16, | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | | ||
| + | { | ||
| + | data = Serial.read(); | ||
| + | | ||
| + | | ||
| + | rida ^= 1; // Vahetame rida 0 ja 1 vahel | ||
| + | | ||
| + | } | ||
| + | else if (data == ' | ||
| + | { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ====== 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. | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Projekt #1 | ||
| + | Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). | ||
| + | | ||
| + | | ||
| + | Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. | ||
| + | | ||
| + | | ||
| + | |||
| + | Kirjeldus: | ||
| + | Kasutab Steinhart-Hart termistori valemit: | ||
| + | temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3} | ||
| + | kus A = 0.001129148, | ||
| + | Autor: Rain Ellermaa | ||
| + | Kuupäev: 10.06.2014 | ||
| + | Versioon: 1.1 | ||
| + | */ | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Initsialiseerime LCD koos vastavate viikude ühendamisega | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | Servo myservo; | ||
| + | |||
| + | int pote_sisend = A5; // määrame potentsiomeetri sisendviigu | ||
| + | int NTC_sisend | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | |||
| + | lcd.begin(16, | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | |||
| + | myservo.attach(A2); | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | pote = map(analogRead(pote_sisend), | ||
| + | ntc = analogRead(NTC_sisend); | ||
| + | |||
| + | // Teisendame temperatuurianduri väärtuse temperatuuriks | ||
| + | temperatuur = log(((10240000/ | ||
| + | temperatuur = 1/ | ||
| + | temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | |||
| + | // Kuvame informatsiooni LCD ekraanile | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(4, | ||
| + | lcd.setCursor(8, | ||
| + | lcd.setCursor(12, | ||
| + | |||
| + | // Kui nupule vajutatakse, | ||
| + | if(digitalRead(nupp) == LOW) | ||
| + | { | ||
| + | seade = pote; | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | } | ||
| + | |||
| + | // 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: myservo.write(50); | ||
| + | case 1: myservo.write(90); | ||
| + | case 2: myservo.write(130); | ||
| + | default: myservo.write(180); | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | myservo.write(0); | ||
| + | } | ||
| + | delay(100); | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | ====== 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: xNNNN | ||
| + | xFANn – FAN1 käivitab ventilaatori, | ||
| + | vastus xFANn | ||
| + | |||
| + | Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva. | ||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Initsialiseerime LCD koos vastavate viikude ühendamisega | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | Servo myservo; | ||
| + | |||
| + | int pote_sisend = A5; // määrame potentsiomeetri sisendviigu | ||
| + | int NTC_sisend | ||
| + | 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, | ||
| + | pinMode(nupp, | ||
| + | |||
| + | lcd.begin(16, | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | |||
| + | myservo.attach(A2); | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | char temp1; | ||
| + | char temp2; | ||
| + | char temp3; | ||
| + | char temp4; | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | // Loeme temperatuuri | ||
| + | temperatuur = -100; | ||
| + | Serial.println(" | ||
| + | while(temperatuur == -100) | ||
| + | { | ||
| + | while(Serial.available() < 5); // Oota, kuni saabub vastuse pakett | ||
| + | if(Serial.read() == ' | ||
| + | { | ||
| + | // Loeme sisse temperatuuri | ||
| + | // (vaja on lahutada ASCII 0, et saada ASCII koodist number) | ||
| + | temp1 = Serial.read()-' | ||
| + | temp2 = Serial.read()-' | ||
| + | temp3 = Serial.read()-' | ||
| + | temp4 = Serial.read()-' | ||
| + | |||
| + | // Arvutame temperatuuri | ||
| + | temperatuur = temp1*100 + temp2*10 + temp3; | ||
| + | temperatuur += temp4 * 0.1; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | // Mõõdame seadesuuruse | ||
| + | pote = map(analogRead(pote_sisend), | ||
| + | |||
| + | // Kuvame informatsiooni LCD ekraanile | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(4, | ||
| + | lcd.setCursor(8, | ||
| + | lcd.setCursor(12, | ||
| + | |||
| + | // Kui nupule vajutatakse, | ||
| + | if(digitalRead(nupp) == LOW) | ||
| + | { | ||
| + | seade = pote; | ||
| + | lcd.setCursor(0, | ||
| + | lcd.setCursor(7, | ||
| + | } | ||
| + | |||
| + | // 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: myservo.write(50); | ||
| + | case 1: myservo.write(90); | ||
| + | case 2: myservo.write(130); | ||
| + | default: myservo.write(180); | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | myservo.write(0); | ||
| + | } | ||
| + | delay(100); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Kaugseadme kood: | ||
| + | <code c> | ||
| + | /* | ||
| + | Nimetus: Näide #4.1 Jadaliides | ||
| + | */ | ||
| + | #include < | ||
| + | #include < | ||
| + | int NTC_sisend = A4; // määrame temperatuurianduri sisendviigu | ||
| + | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| + | |||
| + | const int mAIN1 = 12; | ||
| + | const int mAIN2 = 11; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | lcd.begin(16, | ||
| + | pinMode(3, | ||
| + | pinMode(mAIN1, | ||
| + | pinMode(mAIN2, | ||
| + | digitalWrite(mAIN1, | ||
| + | digitalWrite(mAIN2, | ||
| + | } | ||
| + | |||
| + | char data; | ||
| + | char rida = 0; | ||
| + | String string; | ||
| + | char stringpos; | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | | ||
| + | { | ||
| + | data = Serial.read(); | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | } | ||
| + | else if(string == " | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | else if(string == " | ||
| + | { | ||
| + | | ||
| + | int tempr = Termistor(analogRead(NTC_sisend))*10; | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | double Termistor(long RawADC) | ||
| + | { | ||
| + | double Temp; | ||
| + | |||
| + | Temp = log(((10240000/ | ||
| + | Temp = 1/ | ||
| + | Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse | ||
| + | | ||
| + | return Temp; | ||
| + | } | ||
| + | </ | ||