This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| arduino_lahendused [2014/06/10 07:21] – rellermaa | arduino_lahendused [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 28: | Line 28: | ||
| pinMode(rohelineLED, | pinMode(rohelineLED, | ||
| pinMode(nupp, | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| } | } | ||
| Line 88: | Line 89: | ||
| pinMode(rohelineLED, | pinMode(rohelineLED, | ||
| pinMode(nupp, | pinMode(nupp, | ||
| + | digitalWrite(nupp, | ||
| } | } | ||
| Line 137: | Line 139: | ||
| */ | */ | ||
| - | int pote_sisend = A5; // määrame potentsiomeetri sisendviigu | + | int pote_sisend = A1; // määrame potentsiomeetri sisendviigu |
| int led_roheline = 13; // määrame rohelise LEDi ühendusviigu | int led_roheline = 13; // määrame rohelise LEDi ühendusviigu | ||
| Line 149: | Line 151: | ||
| void loop() | void loop() | ||
| { | { | ||
| - | pote = analogRead(pote_sisend)+1; | + | pote = analogRead(pote_sisend)+1; |
| // Vilgutame LEDi väga kõrgel sagedusel, et paistaks tuhmim | // Vilgutame LEDi väga kõrgel sagedusel, et paistaks tuhmim | ||
| Line 155: | Line 157: | ||
| delayMicroseconds(pote); | delayMicroseconds(pote); | ||
| digitalWrite(led_roheline, | digitalWrite(led_roheline, | ||
| - | delayMicroseconds(1026-pote); | + | 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). | ||
| Line 178: | Line 212: | ||
| LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
| - | int pote_sisend = A5; // määrame potentsiomeetri sisendviigu | + | int pote_sisend = A1; // määrame potentsiomeetri sisendviigu |
| - | int NTC_sisend | + | int NTC_sisend |
| int led = 13; // määrame LED ühendusviigu | int led = 13; // määrame LED ühendusviigu | ||
| int nupp = A0; // määrame nupu ühendusviigu | int nupp = A0; // määrame nupu ühendusviigu | ||
| Line 233: | Line 267: | ||
| } | } | ||
| } | } | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| </ | </ | ||
| - | ====== 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 %) | ||
| Line 337: | Line 366: | ||
| SoftPWMSetPercent(led, | SoftPWMSetPercent(led, | ||
| } | } | ||
| + | </ | ||
| - | + | ====== Harjutus #5.1 ====== | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ====== Harjutus #4.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 379: | 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 511: | 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 517: | 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; | ||
| + | } | ||
| </ | </ | ||