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:56] – 193.40.244.197 | 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 66: | Line 514: | ||
temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3} | temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3} | ||
kus A = 0.001129148, | kus A = 0.001129148, | ||
- | Autor: | + | Autor: |
- | Modifikatsioon: | + | Kuupäev: |
- | Kuupäev: | + | |
Versioon: 1.1 | Versioon: 1.1 | ||
*/ | */ | ||
- | // Kaasame | + | #include < |
#include < | #include < | ||
- | #include < | ||
- | #include < | ||
#include < | #include < | ||
- | Servo Aknaservo; | ||
// Initsialiseerime LCD koos vastavate viikude ühendamisega | // Initsialiseerime LCD koos vastavate viikude ühendamisega | ||
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
- | int andur = A4; // määrame potentsiomeetri sisendviigu | + | Servo myservo; |
- | int pote_sisend=A1; | + | |
- | int LED=A5; | + | int pote_sisend |
- | int nupud=A0; | + | int NTC_sisend |
- | int pote_temp=0; | + | int led = 13; // määrame LED ühendusviigu |
- | int seade_temp=0; | + | int nupp = A0; // määrame nupu ühendusviigu |
- | int nullistSajani; | + | |
- | unsigned long laks=0; | + | // muutujad potentsiomeetri ja temperatuuri väärtuse salvestamiseks |
- | boolean korras=true; | + | int pote = 0; |
- | void setup() { | + | long ntc = 0; |
- | | + | double temperatuur |
- | | + | int seade = -1; |
- | // | + | |
- | // Create and set pin 13 to 0 (off) | + | void setup() |
- | // | + | { |
- | pinMode(pote_sisend,INPUT); | + | |
- | | + | pinMode(nupp, INPUT); |
- | pinMode(nupud, | + | |
lcd.begin(16, | lcd.begin(16, | ||
- | lcd.print(" | + | |
- | seade_temp=25; | + | lcd.setCursor(7, 1); lcd.print(seade); |
- | delay (500); | + | |
- | lcd.clear(); | + | |
- | Aknaservo.write(0); | + | |
- | + | ||
- | | + | |
} | } | ||
- | void loop() { | + | void loop() |
- | | + | { |
+ | | ||
+ | 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) | ||
{ | { | ||
- | if(millis()-1000> | + | seade = pote; |
- | lcd.clear(); // Puhastame ekraani vanadest andmetest | + | lcd.setCursor(0, 1); lcd.print(" |
- | Termistor(analogRead(andur)); // Käivitame funktsooni | + | |
- | | + | |
} | } | ||
- | | + | |
+ | // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud | ||
+ | | ||
{ | { | ||
- | | + | |
- | | + | |
- | } | + | |
- | | + | |
- | } | + | |
- | if(!korras) | + | |
{ | { | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | Termistor(analogRead(andur)); | + | |
} | } | ||
- | } | ||
- | |||
- | void Termistor(int RawADC) { | ||
- | | ||
- | long Takistus; | ||
- | // Valem: Takistus = (1024 * JaguriTakisti/ | ||
- | Takistus=((10240000/ | ||
- | | ||
- | | ||
- | //Esimene rida | ||
- | lcd.setCursor(0, | ||
- | lcd.print(" | ||
- | lcd.print(pote_temp); | ||
- | //Teine rida | ||
- | if(analogRead(nupud)< | ||
- | seade_temp=pote_temp; | ||
- | lcd.setCursor(0, | ||
- | lcd.print(" | ||
- | lcd.print(seade_temp); | ||
- | |||
- | Temp = log(((10240000/ | ||
- | Temp = 1/ | ||
- | Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse | ||
- | | ||
- | lcd.setCursor(8, | ||
- | lcd.print(" | ||
- | lcd.print(Temp); | ||
- | int vahe=Temp-seade_temp; | ||
- | // | ||
- | // | ||
- | 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; | ||
- | } | ||
} | } | ||
- | | + | else |
- | { | + | |
- | } | + | |
- | | + | |
{ | { | ||
- | | + | |
- | korras=true; | + | |
- | } | + | |
- | } | + | |
- | int Teisenda(int protsent) | + | |
- | { | + | |
- | return map(protsent, | + | |
} | } | ||
+ | delay(100); | ||
+ | } | ||
+ | |||
</ | </ | ||
====== Praktiline projekt #2 ====== | ====== Praktiline projekt #2 ====== | ||
Line 198: | 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 204: | 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; | ||
+ | } | ||
</ | </ | ||