This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
arduino_lahendused [2014/06/06 10:25] – 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 ====== | ====== Harjutus #1.1 ====== | ||
Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda | Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda | ||
<code c> | <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) | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
</ | </ | ||
Line 10: | Line 70: | ||
Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab led konstantselt vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise | Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab led konstantselt vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise | ||
<code c> | <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) | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
</ | </ | ||
Line 16: | Line 131: | ||
Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone. | Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone. | ||
<code c> | <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 ====== | ====== 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). | 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> | <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 #3.2 ====== | + | ====== 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 %) | 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> | <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 #4.1 ====== | + | |
+ | |||
+ | ====== Harjutus #5.1 ====== | ||
Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele. | Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele. | ||
<code c> | <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 #4.2 ====== | + | ====== Harjutus #5.2 ====== |
Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti. | Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti. | ||
<code c> | <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 #5 ====== | + | ====== Harjutus #6 ====== |
Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani. | Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani. | ||
<code c> | <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 ====== | ====== Praktiline projekt #1 ====== | ||
Line 53: | Line 501: | ||
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. | 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> | <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); | ||
+ | } | ||
</ | </ | ||
Line 60: | Line 599: | ||
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: | 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) | xTEMP – tagastab kümnekordse temperatuuri Celsiuse kraadides (24,5C puhul saadetakse 245) | ||
- | vastus: | + | vastus: |
xFANn – FAN1 käivitab ventilaatori, | xFANn – FAN1 käivitab ventilaatori, | ||
vastus xFANn | vastus xFANn | ||
Line 66: | Line 605: | ||
Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva. | Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva. | ||
<code c> | <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; | ||
+ | } | ||
</ | </ | ||