This is an old revision of the document!
Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda
/* Nimetus: Harjutus #1.1 Digitaalsed sisend-väljundid Kirjeldus: Modifitseerida programmi nii, et nupule vajutades vilgub LED kolm korda Autor: Rain Ellermaa Kuupäev: 05.06.2014 Versioon: 1.0 */ // Konstandid const int nupp = A0; // Viik kuhu on ühendatud nupp const int rohelineLED = 13; // Viik kuhu on ühendatud nupp roheline LED // Globaalsed muutujad int NupuOlek = 0; // Nupu oleku muutuja void setup() { pinMode(rohelineLED, OUTPUT); // algväärtustame LED viigu väljundiks pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks } void loop() { // Kui nupu olek on madal (GND) e nupp alla vajutatud if (digitalRead(nupp) == LOW) { // Lihtne variant, kirjutame kolm korda üht sama asja digitalWrite(rohelineLED, HIGH); // süütame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, LOW); // kustutame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, HIGH); // süütame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, LOW); // kustutame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, HIGH); // süütame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, LOW); // kustutame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) // Keeruline variant, kasutame tingimustsüklit, et korrata sama tegevust 3 korda for(int kordaja = 0; kordaja < 3; kordaja++) { digitalWrite(rohelineLED, HIGH); // süütame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) digitalWrite(rohelineLED, LOW); // kustutame LED-i delay(500); // ootame 0.5 sekundi (500 millisekundit) } } }
Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab led konstantselt vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise
/* Nimetus: Harjutus #1.2 Digitaalsed sisend-väljundid Kirjeldus: Modifitseerida programmi nii, et nupule vajutades hakkab led konstantselt vilkuma 1 sek intervalliga ja teine nupule vajutus katkestab vilkumise Autor: Rain Ellermaa Kuupäev: 16.01.2013 Versioon: 1.0 */ // Konstandid const int nupp = A0; // Viik kuhu on ühendatud nupp const int rohelineLED = 13; // Viik kuhu on ühendatud nupp roheline LED // Globaalsed muutujad int VilkumiseOlek = 0; // Nupu oleku muutuja void setup() { pinMode(rohelineLED, OUTPUT); // algväärtustame LED viigu väljundiks pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks } void loop() { // Kui nupu olek on madal (GND) ja LED vilgub if ((digitalRead(nupp) == LOW) && (VilkumiseOlek == 1)) { VilkumiseOlek = 0; // Lõpetame vilkumise while((digitalRead(nupp) == LOW)); // ootame nupu lahti laskmist delay(100); } // Kui nupu olek on madal (GND) ja LED ei vilgu else if ((digitalRead(nupp) == LOW) && (VilkumiseOlek == 0)) { VilkumiseOlek = 1; // Alustame vilkumisega while((digitalRead(nupp) == LOW)); // ootame nupu lahti laskmist delay(100); } // Kui vilkumine on lubatud, vilguta LEDi if(VilkumiseOlek == 1) { digitalWrite(rohelineLED, LOW); // kustutame LED-i delay(500); // ootame 1 sekundi (1000 millisekundit) digitalWrite(rohelineLED, HIGH); // süütame LED-i delay(500); // ootame 1 sekundi (1000 millisekundit) } }
Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delay funktsioone.
/* Nimetus: Näide #2 Analoog sisend Kirjeldus: Modifitseerida programmi nii, et potentsiomeetriga määratakse LED-i heledus, kasutades selleks delayMicroseconds funktsioone. Autor: Rain Ellermaa Kuupäev: 05.06.2014 Versioon: 1.0 */ int pote_sisend = A5; // määrame potentsiomeetri sisendviigu int led_roheline = 13; // määrame rohelise LEDi ühendusviigu int pote = 0; // muutuja potentsiomeetri väärtuse salvestamiseks void setup() { pinMode(led_roheline, OUTPUT); // algväärtustame LED viigu väljundiks } void loop() { pote = analogRead(pote_sisend)+1; // loeme analoogsisendi väärtuse // Vilgutame LEDi väga kõrgel sagedusel, et paistaks tuhmim digitalWrite(led_roheline, HIGH); // süütame LED-i delayMicroseconds(pote); // Ootame potensiomeetriga määratud mikrosekundid digitalWrite(led_roheline, LOW); // kustutame LED-i delayMicroseconds(1026-pote); // Ootame ülejäänud mikrosekundid }
Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED).
/* Nimetus: Näide #3 Takistuslikud andurid Kirjeldus: Modifitseerida programmi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo hilisemal ületamisel käivitatakse täiturmehhanism (milleks on LED). Autor: Rain Ellermaa Kuupäev: 05.06.2014 Versioon: 1.0 */ #include <LiquidCrystal.h> // Kaasame vajaliku teegi #include <math.h> // Initsialiseerime LCD koos vastavate viikude ühendamisega LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int pote_sisend = A5; // määrame potentsiomeetri sisendviigu int NTC_sisend = A3; // määrame temperatuurianduri sisendviigu int led = 13; // määrame LED ühendusviigu int nupp = A0; // määrame nupu ühendusviigu // muutujad potentsiomeetri ja temperatuuri väärtuse salvestamiseks int pote = 0; long ntc = 0; double temperatuur = 0; int seade = -1; void setup() { pinMode(led, OUTPUT); // seadistame LED viigu väljundiks pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks lcd.begin(16, 2); //Määrame LCD read ja veerud lcd.setCursor(0, 1); lcd.print("Seade: "); lcd.setCursor(7, 1); lcd.print(seade); } void loop() { pote = map(analogRead(pote_sisend),0,1023,-20,100); // loeme potensiomeetri väärtuse ja teisendame vahemikku -20C - 100C ntc = analogRead(NTC_sisend); // loeme temperatuuri anduri väärtuse // Teisendame temperatuurianduri väärtuse temperatuuriks temperatuur = log(((10240000/ntc) - 10000)); temperatuur = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * temperatuur * temperatuur))* temperatuur); temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse // Kuvame informatsiooni LCD ekraanile lcd.setCursor(0, 0); lcd.print("Pot: "); lcd.setCursor(4, 0); lcd.print(pote); lcd.setCursor(8, 0); lcd.print("Tmp: "); lcd.setCursor(12, 0); lcd.print(temperatuur); // Kui nupule vajutatakse, salvesta seadesuurus if(digitalRead(nupp) == LOW) { seade = pote; lcd.setCursor(0, 1); lcd.print("Seade: "); lcd.setCursor(7, 1); lcd.print(seade); } // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud if((temperatuur > seade) && (digitalRead(nupp) == HIGH)) { digitalWrite(led, HIGH); // süütame LED-i } else { digitalWrite(led, LOW); // vastasel korral kustutame LED-i } }
Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati (1 kraad: heledus 25 %, 2 kraadi: heledus 50 %, 3 kraadi: heledus 75 % ja 5 kraadi: heledus 100 %)
/* Nimetus: Näide #3 Takistuslikud andurid Kirjeldus: Kombineerida LED-i heleduse programm ja eelnev temperatuuri juhtimise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati: kuni 1 kraad: heledus 25 % kuni 2 kraadi: heledus 50 % kuni 3 kraadi: heledus 75 % üle selle: heledus 100 % Autor: Rain Ellermaa Kuupäev: 05.06.2014 Versioon: 1.0 */ #include <LiquidCrystal.h> // Kaasame vajaliku teegi #include <math.h> #include <SoftPWM.h> // Initsialiseerime LCD koos vastavate viikude ühendamisega LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int pote_sisend = A5; // määrame potentsiomeetri sisendviigu int NTC_sisend = A3; // määrame temperatuurianduri sisendviigu int led = 13; // määrame LED ühendusviigu int nupp = A0; // määrame nupu ühendusviigu // muutujad potentsiomeetri ja temperatuuri väärtuse salvestamiseks int pote = 0; long ntc = 0; double temperatuur = 0; int seade = -1; void setup() { pinMode(led, OUTPUT); // seadistame LED viigu väljundiks pinMode(nupp, INPUT); // algväärtustame nupu viigu sisendiks lcd.begin(16, 2); //Määrame LCD read ja veerud lcd.setCursor(0, 1); lcd.print("Seade: "); lcd.setCursor(7, 1); lcd.print(seade); SoftPWMBegin(); } void loop() { pote = map(analogRead(pote_sisend),0,1023,-20,100); // loeme potensiomeetri väärtuse ja teisendame vahemikku -20C - 100C ntc = analogRead(NTC_sisend); // loeme temperatuuri anduri väärtuse // Teisendame temperatuurianduri väärtuse temperatuuriks temperatuur = log(((10240000/ntc) - 10000)); temperatuur = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * temperatuur * temperatuur))* temperatuur); temperatuur = temperatuur - 273.15; // Konverteeri Kelvinid Celciustesse // Kuvame informatsiooni LCD ekraanile lcd.setCursor(0, 0); lcd.print("Pot: "); lcd.setCursor(4, 0); lcd.print(pote); lcd.setCursor(8, 0); lcd.print("Tmp: "); lcd.setCursor(12, 0); lcd.print(temperatuur); // Kui nupule vajutatakse, salvesta seadesuurus if(digitalRead(nupp) == LOW) { seade = pote; lcd.setCursor(0, 1); lcd.print("Seade: "); lcd.setCursor(7, 1); lcd.print(seade); } // Kui temperatuur on kõrgem potensiomeetriga seatud väärtusest ja nuppu pole vajutatud if((temperatuur > seade) && (digitalRead(nupp) == HIGH)) { int vahe = temperatuur - seade; switch(vahe) { case 0: DimLED(led, 25); break; case 1: DimLED(led, 50); break; case 2: DimLED(led, 75); break; default: DimLED(led, 100); break; } } else { DimLED(led, 0); // vastasel korral kustutame LED-i } } void DimLED(int led, int value) { /* digitalWrite(led, HIGH); // süütame LED-i delayMicroseconds((value*10)+1); // Ootame potensiomeetriga määratud mikrosekundid digitalWrite(led, LOW); // kustutame LED-i delayMicroseconds(1001-(value*10)); // Ootame ülejäänud mikrosekundid */ SoftPWMSetPercent(led, value); }
Luua programm, mis võimaldab servomootori positsiooni muuta vastavalt nuppudega seadistatud suurusele.
// Kaasame vajalikud teegid #include <Servo.h> Servo myservo; // create servo object to control a servo int nupud = A0; // määrame potentsiomeetri sisendviigu int pos = 0; // variable to store the servo position void setup() { myservo.attach(A2); // attaches the servo on pin A2 to the servo object } void loop() { if (analogRead(nupud) <= 90) // Kui on vajutatud parem nupp { pos++; // Suurendame positsiooni kuni maksimumväärtuseni if (pos > 180) pos = 170; } else if ((analogRead(nupud) >= 450) && (analogRead(nupud) <= 550)) // Kui on vajutatud vasak nupp { pos--; // Vähendame positsiooni kuni miinimumväärtuseni if (pos < 1) pos = 1; } myservo.write(pos); // annabe servole uue positsiooni delay(15); // oota 15ms servo liikumiseks }
Luua programm, mis servomootori baasil ehitatud radariga ja fotoanduriga leiaks ruumist kõige eredama punkti.
// Kaasame vajalikud teegid #include <Servo.h> Servo myservo; // create servo object to control a servo 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; //suurim väärtus int andur_vaartus=0;//vahemuutuja anduri väärtus ejaoks void setup() { myservo.attach(A2); // attaches the servo on pin A2 to the servo object Serial.begin(9600); } void loop() { if (analogRead(nupud) <= 90){ //tehakse läbi nupu vajutamisel lugemMax = 0; //suurima väärtuse nullimine pos_max = 0; //algasendisse keeramine myservo.write(0); delay(500); //suurima valguskoha otsimine for(pos = 50; pos < 140; pos += 1) // Liigutame servot 50'st 140'ni { myservo.write(pos); // liigutame servot delay(50); // ootame servo liikumist andur_vaartus=analogRead(andur); // anduri väärtuse lugemine Serial.print("pos: "); Serial.print(pos); Serial.print(" - "); Serial.println(andur_vaartus); if (andur_vaartus > lugemMax) // kas anduri väärtus on suuremim { lugemMax = andur_vaartus; // suurima väärtuse salvestamine pos_max = pos; // vastava positsiooni meelde jätmine } } //Pärast skännimist eredaimasse punkti paika keeramine myservo.write(pos_max); } }
Luua programm, mis jadaliidesest saadetud teksti kirjutaks LCD ekraanile. Märk „+“ vahetab rida ning märk „-“ kustutab kogu ekraani.
/* Nimetus: Näide #4.1 Jadaliides */ #include <LiquidCrystal.h> // Kaasame vajaliku teegi LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Globaalsed muutujad char data; char rida = 0; void setup() { Serial.begin(9600); // Seadistame Serial ühenduse 9600 baudrate'ga lcd.begin(16, 2); // Määrame LCD read ja veerud } void loop() { if(Serial.available()) // Kontrollime, kas on Serial ühendusest tulnud andmeid { data = Serial.read(); // Loeme tulnud andmed muutujasse "data" if(data == '+') // Kontrollime kas saadeti '+' märk { rida ^= 1; // Vahetame rida 0 ja 1 vahel lcd.setCursor(0, rida);// Liigutame kursorit } else if (data == '-') // Kontrollime kas saadeti '-' märk { lcd.clear(); // Puhastame ekraani lcd.setCursor(0, rida);// Liigutame kursori tagasi olnud reale } else // Muul juhul { lcd.print(data); // Kirjutame saadud sümboli LCDle } } }
Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). Temperatuurinivoo määratakse potentsiomeetriga. Õhuklapi asend sõltub temperatuuri erinevusest. Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi, jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust.
/* Nimetus: Projekt #1 Luua programm, mis temperatuurinivoo ületamisel muudab õhuklapi asendit (servo mootor). Temperatuurinivoo määratakse potentsiomeetriga. Õhuklapi asend sõltub temperatuuri erinevusest. Iga temperatuuri kraad, mis ületab nivood lisab klapi nurga 25%. Lüliti katkestab igal ajahetkel süsteemi töö (hädastop) ja viib klapi algasendisse tagasi, jättes punase LED-i vilkuma. Edasijõudnud võivad kasutada katkestust. Kirjeldus: Kasutab Steinhart-Hart termistori valemit: temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3} kus A = 0.001129148, B = 0.000234125 ja C = 8.76741E-08 Autor: Milan Malesevic and Zoran Stupic Modifikatsioon: Raivo Sell Kuupäev: 15.01.2013/4.06.2014 Versioon: 1.1 */ // Kaasame vajalikud teegid #include <math.h> #include <LiquidCrystal.h> #include <SoftPWM.h> #include <Servo.h> Servo Aknaservo; // Initsialiseerime LCD koos vastavate viikude ühendamisega LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int andur = A4; // määrame potentsiomeetri sisendviigu int pote_sisend=A1; int LED=A5; int nupud=A0; int pote_temp=0; int seade_temp=0; int nullistSajani; unsigned long laks=0; boolean korras=true; void setup() { Aknaservo.attach(A2); // Initialize //SoftPWMBegin(); // Create and set pin 13 to 0 (off) //SoftPWMSet(13, 0); pinMode(pote_sisend,INPUT); pinMode(LED,OUTPUT); pinMode(nupud,INPUT); lcd.begin(16, 2); //Määrame LCD read ja veerud lcd.print("Temperatuur"); // Trükime tervitusteksti seade_temp=25; delay (500); lcd.clear(); Aknaservo.write(0); Serial.begin(9600); } void loop() { while(korras) { if(millis()-1000>laks){ lcd.clear(); // Puhastame ekraani vanadest andmetest Termistor(analogRead(andur)); // Käivitame funktsooni laks=millis(); } if(analogRead(nupud)>490 && analogRead(nupud)<900) { korras^=1; Aknaservo.write(0); } Serial.println(analogRead(nupud)); } if(!korras) { digitalWrite(LED,1); delay(1000); digitalWrite(LED,0); delay(1000); Termistor(analogRead(andur)); } } void Termistor(int RawADC) { double Temp; long Takistus; // Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti Takistus=((10240000/RawADC) - 10000); pote_temp=analogRead(pote_sisend); pote_temp=map(pote_temp,0,1023,-10,35); //Esimene rida lcd.setCursor(0, 0); lcd.print("Pot:"); lcd.print(pote_temp); //Trükime pinge väärtuse //Teine rida if(analogRead(nupud)<100) seade_temp=pote_temp; lcd.setCursor(0, 1); lcd.print("Seade:"); lcd.print(seade_temp); //Trükime takistuse väärtuse Temp = log(((10240000/RawADC) - 10000)); Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp); Temp = Temp - 273.15; // Konverteeri Kelvinid Celciustesse lcd.setCursor(8, 0); lcd.print("Tmp:"); lcd.print(Temp); //Trükime temperatuuri väärtuse int vahe=Temp-seade_temp; //lcd.setCursor(8,1); //lcd.print(vahe); if(korras){ switch (vahe) { case 1: Aknaservo.write(Teisenda(25)); break; case 2: Aknaservo.write(Teisenda(50)); break; case 3: case 4: Aknaservo.write(Teisenda(75)); break; case 5: Aknaservo.write(Teisenda(100)); break; } } if(seade_temp<Temp) { } else { Aknaservo.write(Teisenda(0)); korras=true; } } int Teisenda(int protsent) { return map(protsent,0,100,0,180); }
Ventilaatori juhtimine XRF kaudu. Luua programm, mis suudab XRF raadiomooduliga lugeda kaugmoodulilt temperatuuri ning kui temperatur ületab kohalikul kontrolleril seatud nivoo käivitatakse kaugmoodulil asetsev ventilaator. Suhtkuseks kaugmooduliga tuleb kasutada allolevat protokolli: xTEMP – tagastab kümnekordse temperatuuri Celsiuse kraadides (24,5C puhul saadetakse 245) vastus: xNNN xFANn – FAN1 käivitab ventilaatori, FAN0 peatab ventilaatori vastus xFANn
Protokollis tähistab „x“ kohaliku seadme numbrit, mille annab juhendaja igale tiimile erineva.