This shows you the differences between two versions of the page.
| et:arduino:programming [2017/06/22 09:57] – kaupo.raid | et:arduino:programming [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Programmeerimine ====== | ||
| + | ===== Programmi struktuur ===== | ||
| + | Arduino programmeerimiskeeles on kohustuslikud funktsioonid //setup()// ja //loop()//, mis peavad alati eksisteerima, | ||
| + | |||
| + | **Näide Arduino programmi struktuurist: | ||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | Programmi selgitav kommentaar ja autor | ||
| + | */ | ||
| + | |||
| + | // Makro-deklaratsioonid | ||
| + | #define PI 3.141 | ||
| + | |||
| + | // Globaalsed muutujad | ||
| + | int e; | ||
| + | // Seadistuste funktsioon | ||
| + | |||
| + | void setup() { | ||
| + | // Funktsiooni läbitakse vaid ühe korra | ||
| + | } | ||
| + | |||
| + | // Peatsükkel | ||
| + | void loop() { | ||
| + | // Funktsiooni täidetakse korduvalt, | ||
| + | // Tavaliselt on siin programmi põhitegevused | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Kommentaarid ===== | ||
| + | Programmi saab kirjutada teksti, mida ei kompileerita ja mis on programmeerijale abiks selgitamisel või märkmete tegemisel. Samuti saab kommentaare kasutada programmilõikude ajutiseks täitmisest kõrvaldamiseks. | ||
| + | |||
| + | **Näited kahte liiki kommentaarist: | ||
| + | <code c> | ||
| + | // Üherealine kommentaar | ||
| + | // Kommentaariks loetakse kahe kaldkriipsu järel olevat teksti | ||
| + | |||
| + | /* | ||
| + | Mitmerealine kommentaar | ||
| + | Kommentaari algus ja lõpp määratakse kaldkriipsude ja tärnidega | ||
| + | */ | ||
| + | </ | ||
| + | |||
| + | ===== Muutujad ja konstandid ===== | ||
| + | Muutujad ja konstandid on erinevate andmete hoidmiseks defineeritavad mälupesad. Muutujatele saab programmi täitmise ajal omistada erinevaid ühte tüüpi väärtusi, konstantidele omistatakse kindel väärtus ühe korra ja seda programmi täitmise ajal enam ei muudeta. | ||
| + | |||
| + | === Andmetüübid === | ||
| + | |||
| + | Arduino programmeerimiskeele baasandmetüübid (enamus neist on täisarvud, kaks viimast on ujukomaarvud): | ||
| + | |||
| + | ^ Tüüp | ||
| + | | boolean | ||
| + | | byte | 0 | 255 | 8 | ||
| + | | (signed) char | -128 | 127 | 8 | ||
| + | | unsigned char | 0 | 255 | 8 | ||
| + | | (signed) int | -32768 | ||
| + | | unsigned int | 0 | 65535 | 16 | | ||
| + | | (signed) long | -2 147 483 648 | 2 147 483 647 | 32 | | ||
| + | | unsigned long | 0 | 4 294 967 295 | 32 | | ||
| + | | float | -3.4< | ||
| + | | double | ||
| + | |||
| + | Sulgudes olevat sõna //signed// ei pea kasutama, kuna vaikimisi on andmetüübid bipolaarsed. Arduino programmeerimiskeeles on teksti hoidmiseks //String// objekt, mis lubab teha erinevaid tekstitöötluse toiminguid: teksti lisamine ja eemaldamine, | ||
| + | \\ | ||
| + | Konstante saab tekitada kahel viisil: | ||
| + | * makro #define kaudu | ||
| + | * muutuja deklareerimisega lisades ette märksõna //const// | ||
| + | |||
| + | === Muutujate deklareerimine ja defineerimine === | ||
| + | Muutujate deklareerimisel ehk loomisel peab olema vähemalt 2 elementi: andmetüüp ja nimi. Muutuja deklareerimisel on võimalik see kohe ka algväärtustada ehk defineerida. Muutuja deklareerimisel väljaspool funktsiooni on tegemist globaalse muutujaga ja sellele pääsevad ligi kõik funktsioonid. Globaalsete muutujate väärtused säilivad kuni mikrokontrollerilt toite eemaldamiseni. Muutuja deklareerimisel funktsiooni sees on see kasutatav vaid selles kindlas funktsioonis ja pärast funktsiooni sulgemist kustutatakse kõik lokaalsed muutujad mälust. | ||
| + | |||
| + | **Muutuja nime valikul kehtivad reeglid:** | ||
| + | * Muutuja nimi võib sisaldada väikseid ja suuri ladina tähestiku tähti a - z, alakriipsu(_) ja numbreid 0-9. | ||
| + | * Muutuja nimi peab olema terviklik ehk ei tohi vahel olla tühikuid. | ||
| + | * Muutujate nimed on tõstutundlikud: | ||
| + | * Muutuja nimi ei tohi alata numbriga. | ||
| + | |||
| + | \\ | ||
| + | **Soovitused muutujate deklareerimisel: | ||
| + | * Vältida sama nimega globaalsete ja lokaalsete muutujate deklareerimist. | ||
| + | * Muutuja nime valikul proovida jääda lühidaks, kuid piisavalt konkreetseks, | ||
| + | * Kasutada eesmisi suuri tähti mitmesõnaliste muutujate deklareerimisel: | ||
| + | |||
| + | \\ | ||
| + | **Näited muutujate deklareerimisest ja defineerimisest: | ||
| + | <code c> | ||
| + | // Char tüüpi muutuja deklareerimine | ||
| + | char c; | ||
| + | // Char defineerimine numbriga 65, mis vastab ascii tabeli järgi tähemärgile A | ||
| + | c = 65; | ||
| + | // Char defineerimine tähemärgiga A | ||
| + | // Tähemärkide kasutamisel programmis tuleb need ümbritseda ülakomade vahele | ||
| + | c = ' | ||
| + | |||
| + | /* String objekti loomine ja teksti omistamine. | ||
| + | | ||
| + | tuleb see ümbritseda jutumärkide vahele. */ | ||
| + | String tervitus = "Hello World"; | ||
| + | |||
| + | // Konstandi deklareerimine ja väärtuse omistamine | ||
| + | const int kalibratsiooniKonstant = 187; | ||
| + | |||
| + | // Mitu ühte tüüpi muutujat saab deklareerida ühel real | ||
| + | unsigned long x, kahvel, test_systeem, | ||
| + | </ | ||
| + | |||
| + | ===== Operaatorid ja tehted ===== | ||
| + | |||
| + | === Aritmeetilised === | ||
| + | Arduino programmeerimiskeeles toetatud aritmeetilised tehted on liitmine (+), lahutamine (-), korrutamine (*), jagamine (/) ja mooduli võtmine (%). Keerukamate tehete koostamisel tuleb järgida tehete järjekorda. Tehted sooritatakse suunaga vasakult paremale. Esmalt tehakse * / % ja seejärel + -. Kui on vaja mingeid tehteid eelisjärjekorras teha, siis selleks kasutada sulge. | ||
| + | |||
| + | **Näited aritmeetiliste tehete kasutamisest: | ||
| + | <code c> | ||
| + | /* Esimesena tehakse liitmine kuna see on sulgudes, | ||
| + | | ||
| + | x saab väärtuse 16. */ | ||
| + | int x = 8 * (1 + 7) / 4; | ||
| + | |||
| + | // Liitev-omistav operaator, x väärtuseks saab 21, lahti kirjutatud: x=x+5 | ||
| + | x += 5; | ||
| + | |||
| + | // Ühe lahutamise kiirmeetod, x väärtuseks saab 20, lahti kirjutatud: x=x-1 | ||
| + | x--; | ||
| + | </ | ||
| + | |||
| + | === Loogilised tehted === | ||
| + | Loogilised tehted on eitus (!), loogiline korrutamine (&& | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | **Näited tehete kasutamisest: | ||
| + | <code c> | ||
| + | // Toome näite kahe toa kliima parameetri kasutamisest toa tuulutuse juhtimiseks | ||
| + | // Kui muutuja ' | ||
| + | boolean niiske, palav, tuulutus; | ||
| + | |||
| + | // Algväärtustame kliima parameetrid | ||
| + | niiske = true; | ||
| + | palav = true; | ||
| + | |||
| + | /* Eitus | ||
| + | | ||
| + | ja see väärtus omistatakse samale muutujale. */ | ||
| + | palav = !palav; | ||
| + | |||
| + | /* Loogiline korrutamine | ||
| + | | ||
| + | | ||
| + | kuna toas ei ole palav (eelneva tehtega eitasime muutuja ' | ||
| + | tuulutus = niiske && palav; | ||
| + | |||
| + | // Loogiline liitmine | ||
| + | // Ventilaator lülitatakse sisse, kui toas on niiske, palav või mõlemad korraga. | ||
| + | tuulutus = niiske || palav; | ||
| + | |||
| + | /* Esmalt teostatakse eitus, siis loogiline liitmine ning loogiline korrutamine. | ||
| + | | ||
| + | ja ventilaator veel ei tööta. */ | ||
| + | tuulutus = niiske || palav && !tuulutus | ||
| + | </ | ||
| + | |||
| + | === Võrdlused === | ||
| + | Arvude väärtuste võrdlemisel saadakse loogilised väärtused. Võrdlustehted on samaväärsus (==), erinevus (!=), suurem (>), suurem-võrdne (> =), väiksem (<) ja väiksem-võrdne (< =). | ||
| + | < | ||
| + | **Näited võrdluste kasutamisest: | ||
| + | <code c> | ||
| + | int x = 10, y = 1; | ||
| + | |||
| + | // Suurem-kui võrdlustehe, | ||
| + | // Tehte ümber on sulud vaid selguse pärast | ||
| + | bool b = (5 > 4); | ||
| + | |||
| + | // Erinevuse tehe | ||
| + | // Tehte tulemus on väär | ||
| + | b = (4 != 4); | ||
| + | |||
| + | // Aritmeetiline, | ||
| + | // Tehte tulemus on väär, sest esimene loogilise korrutise operand on väär | ||
| + | b = (x + 4 > 15) && (y < 4); | ||
| + | </ | ||
| + | |||
| + | === Tingimuslaused === | ||
| + | Tingimuslause võimaldab vastavalt sulgudes oleva loogikaavaldise tõesusele täita või mitte täita tingimusele järgnevat lauset või programmilõiku. Tingimuslause võtmesõna on //if//. Tingimuslause võib olla pikem ja sisaldada ka lauset või programmilõiku, | ||
| + | |||
| + | Tingimuslauseid võib moodustada lühemaid ja pikemaid: | ||
| + | |||
| + | * **if**(loogikaavaldis)\\ | ||
| + | Tõese avaldise korral täidab määratud tegevuse. | ||
| + | |||
| + | * **if**(loogikaavaldis)...**else**\\ | ||
| + | Kui avaldis ei ole tõene siis täidetakse //else// ehk muu juhu tegevus. | ||
| + | |||
| + | * **if**(loogikaavaldis).. **else if**(loogikaavaldis)...**else**\\ | ||
| + | Kui esimene avaldis ei kehtinud, siis | ||
| + | kontrollib järgnevaid ning kui ükski ei olnud tõene, siis täidab muu juhu tegevuse. | ||
| + | |||
| + | **Näide tingimuslause ülesehitusest: | ||
| + | <code c> | ||
| + | // Kõigi kolme elemendiga if lause struktuur | ||
| + | if(andur1 == 1 && andur2 == 1){ | ||
| + | // Tee midagi | ||
| + | } | ||
| + | else if(andur1 == 1 || andur2 == 1){ | ||
| + | // Tee midagi muud | ||
| + | } | ||
| + | else if(andur3 != 0){ | ||
| + | // Tee midagi muud | ||
| + | } | ||
| + | else{ | ||
| + | // Kui ükski eelnev lause ei olnud tõene, siis tee seda osa | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Tsüklid === | ||
| + | Tsüklid võimaldavad ühte tegevust või programmilõiku täita mitu korda järjest. Peamised tsüklite tüübid on //for// ja //while//. | ||
| + | |||
| + | * **for**(muutuja algväärtustamine; | ||
| + | Tsüklit korratakse, kuni võrdlus annab tulemuseks tõene.\\ | ||
| + | |||
| + | <code c> | ||
| + | for(int i=0; i<10; i++){ | ||
| + | x++; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * **while**(loogikaavaldis)\\ | ||
| + | Tsüklit korratakse, kuni avaldis on tõene.\\ | ||
| + | |||
| + | <code c> | ||
| + | // While tsüklit täidetakse, | ||
| + | int i = 0; | ||
| + | | ||
| + | while(i < 10){ | ||
| + | i++; | ||
| + | } | ||
| + | |||
| + | // While tsüklit täidetakse, | ||
| + | int i = 0; | ||
| + | int lipp = 0; | ||
| + | | ||
| + | while(lipp == 0){ | ||
| + | i++; | ||
| + | if(i > 10) lipp = 1; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Tsüklis liikumine**\\ | ||
| + | Tsüklites on võimalik käimasoleva tsükli mõjutamiseks kasutada käske //break// ja // | ||
| + | |||
| + | <code c> | ||
| + | /* Tsüklis suurendatakse muutujat loendur. | ||
| + | | ||
| + | mis sunnib programmi alustama uue tsükliga. | ||
| + | Seega loenduri suurendamine jääb kolmel juhul vahele. */ | ||
| + | int loendur = 0; | ||
| + | |||
| + | for(int i=10; i>=0; i--){ | ||
| + | if(i==2 || i==4 || i==8) continue; | ||
| + | loendur++; | ||
| + | } | ||
| + | |||
| + | // Lõputus tsüklis suurendatakse i väärtust. | ||
| + | // Kui i väärtus on võrdne 10-ga, siis väljutakse tsüklist. | ||
| + | int i = 0; | ||
| + | |||
| + | while(1){ | ||
| + | i++; | ||
| + | if(i == 10) break; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Funktsioonid ===== | ||
| + | Funktsioon on programmilõik, | ||
| + | |||
| + | **Näited funktsioonidest: | ||
| + | |||
| + | <code c> | ||
| + | int x; | ||
| + | int y = 3; | ||
| + | |||
| + | void setup() | ||
| + | {} | ||
| + | |||
| + | void loop() { | ||
| + | // Liitmisfunktsioon, | ||
| + | x = sum(y, 5); | ||
| + | // Väljalülitamise funktsiooni väljakutsumine, | ||
| + | power_off(); | ||
| + | } | ||
| + | |||
| + | // Kahe int tüüpi parameetriga funktsioon, mis tagastab int-tüüpi väärtuse | ||
| + | int sum(int a, int b) { | ||
| + | // Kahe arvu liitmine ja summa tagastamine | ||
| + | return a + b; | ||
| + | } | ||
| + | |||
| + | // Ilma parameetrite ja tagastatava väärtuseta funktsioon | ||
| + | void power_off(void) | ||
| + | {} | ||
| + | </ | ||
| + | |||
| + | ===== Viikude juhtimise funktsioonid ===== | ||
| + | |||
| + | Arduino programmeerimiseks on juba defineeritud hulk erinevaid funktsioone. Need ei ole standard C keele käsud vaid spetsiaalselt Arduino riistvara jaoks loodud funktsioonid. Kõige olulisemad ja vältimatult mikrokontrollerite programmide jaoks vajalikud on viikude juhtimise funktsioonid. Enne viikude kasutamist tuleb määrata nende töörežiim. Esmalt on vaja määrata, kas viik hakkab tööle sisendina või väljundina. Kui viik peaks töötama sisendina on vaja otsustada, kas aktiveerida sisemine //pull-up// takisti. | ||
| + | |||
| + | **Viigu seadistamine: | ||
| + | * pinMode(viigu_nr, | ||
| + | * INPUT - sisend | ||
| + | * OUTPUT - väljund | ||
| + | * INPUT_PULLUP - sisend, millel on aktiveeritud sisemine //pull-up// takisti | ||
| + | |||
| + | \\ | ||
| + | **Viigu oleku lugemine:** | ||
| + | * digitalRead(viigu_nr) - viigu oleku lugemine digitaalsel kujul ehk 0 või 1. | ||
| + | * analogRead(viigu_nr) - viigu oleku lugemine analoogväärtusena ehk 0 - 1023. Funktsioon töötab ainult analoogviikudel, | ||
| + | |||
| + | |||
| + | **Viigu oleku muutmine:** | ||
| + | * digitalWrite(viigu_nr, | ||
| + | * analogWrite(viigu_nr, | ||
| + | |||
| + | **Näited: | ||
| + | <code c> | ||
| + | // Tavalise lüliti väärtuse lugemine | ||
| + | const int nupp = 12; | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(nupp, | ||
| + | } | ||
| + | void loop(){ | ||
| + | if(digitalRead(nupp) == 0){ | ||
| + | // Nupu vajutusel täidetav programmi osa | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | // Analoogväljundiga anduri lugemine | ||
| + | const int andurAN = A0; | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(andurAN, | ||
| + | } | ||
| + | void loop(){ | ||
| + | if(analogRead(andurAN) > 500){ | ||
| + | // Kui anduri analoogsisendi väärtus on suurem kui 500, | ||
| + | // siis täidetakse see programmi osa | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | // Digitaalse väljundi seadistamine ja oleku muutmine | ||
| + | const int led = 13; | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(led, | ||
| + | } | ||
| + | void loop(){ | ||
| + | digitalWrite(led, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | // Analoogväljundi (PWM signaali) seadistamine ja oleku muutmine | ||
| + | const int led = 11; | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(led, | ||
| + | } | ||
| + | void loop(){ | ||
| + | analogWrite(led, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Ajastusfunktsioonid ===== | ||
| + | Programmi töös on tihti vaja teostada kindla ajastusega tegevusi. Selleks on Arduino-l olemas neli funktsiooni, | ||
| + | |||
| + | * **delay**(viite_pikkus) - viide, mis hoiab programmi kinni kasutaja määratud hulga millisekundeid. | ||
| + | <code c> | ||
| + | // Loenduri tekitamine, mis loendab sekundeid | ||
| + | int stopper = 0; | ||
| + | |||
| + | void loop() { | ||
| + | delay(1000); | ||
| + | stopper++; // Muutujale ühe liitmine | ||
| + | } | ||
| + | </ | ||
| + | * **delayMicroseconds**(viite_pikkus) - viide, mis hoiab programmi kinni kasutaja määratud hulga mikrosekundeid. | ||
| + | <code c> | ||
| + | // Loenduri tekitamine, mis loendab millisekundeid | ||
| + | int stopper = 0; | ||
| + | |||
| + | void loop() { | ||
| + | delayMicroseconds(1000); | ||
| + | stopper++; // Muutujale ühe liitmine | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * **millis** - loendab millisekundeid alates mikrokontrolleri programmi tööle hakkamise hetkest. | ||
| + | <code c> | ||
| + | // Loenduri tekitamine, mis loendab sekundeid | ||
| + | unsigned long aeg = millis(); | ||
| + | int stopper = 0; | ||
| + | |||
| + | void loop() { | ||
| + | // Pidev millisekundite arvu võrdlemine eelneva millisekundite arvuga | ||
| + | // Kui kahe arvu vahe on suurem kui 1000,siis suurendame muutujat stopper ühe võrra | ||
| + | if((long)(millis() - aeg) > 1000){ | ||
| + | stopper++; // Muutujale ühe liitmine | ||
| + | aeg = millis(); // Millisekundite arvu salvestamine muutujasse | ||
| + | } | ||
| + | // Programm saab muul ajal vabalt joosta | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * **micros** | ||
| + | <code c> | ||
| + | // Loenduri tekitamine, mis loendab millisekundeid | ||
| + | unsigned long aeg = micros(); | ||
| + | int stopper = 0; | ||
| + | |||
| + | void loop() { | ||
| + | // Pidev mikrosekundite arvu võrdlemine eelneva mikrosekundite arvuga | ||
| + | // Kui kahe arvu vahe on suurem kui 1000, siis suurendame muutujat stopper 1 võrra | ||
| + | if((long)(micros() - aeg) > 1000){ | ||
| + | stopper++; // Liidame muutujale ühe | ||
| + | aeg = micros(); // Millisekundite arvu salvestamine muutujasse | ||
| + | } | ||
| + | // Programm saab muul ajal vabalt joosta | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Teegid ===== | ||
| + | Kontrolleri programmeerimise lihtsustamiseks on riistvara tootjad ja/või vabatahtlikud loonud tarkvarateegid erinevate seadmete kasutamise. Tarkvarateegid on funktsioonide kogumid, mis on loodud riistvara lihtsamaks kasutamiseks ja haldamiseks. Nii on võimalik sisuliselt ühe käsureaga teha operatsioone, | ||
| + | |||
| + | **Mõned Arduino IDE-s vaikimisi olevad teegid:** | ||
| + | * Wire - I2C andmeliides | ||
| + | * EEPROM - püsimälu kasutamine | ||
| + | * Servo - hobi servomootori juhtimine | ||
| + | * GSM - mobiilivõrgu kaudu kommunikatsioon | ||
| + | * SPI - sünkroonne jadaliides | ||
| + | * Ethernet - kaabliga võrgu kaudu kommunikatsioon | ||
| + | * Wifi - juhtmevaba võrgu kaudu kommunikatsioon | ||
| + | * Liquid Crystal - tähemärgiliste LCD ekraanide juhtimine | ||
| + | |||
| + | \\ | ||
| + | Teeke võib ka ise koostada ja seda on mõttekas teha, kui on mingid funktsioonid, | ||
| + | |||
| + | Uue teegi loomiseks võib alustada tavalisest Arduino programmist, | ||
| + | |||
| + | Teegi loomise täpsema juhendi leiab siit:\\ | ||
| + | https:// | ||
| + | |||
| + | Teegi loomise stiilinäite ja soovitused leiab siit:\\ | ||
| + | https:// | ||
| + | |||
| + | |||
| + | < | ||
| + | === Välise teegi lisamine Arduino arenduskeskkonda === | ||
| + | |||
| + | Arduino IDE arenduskeskkonda on võimalik teeke lisada mitmel meetodil. | ||
| + | |||
| + | - Arduino keskkonnas kasutades menüüst nuppu //Add .ZIP Library// | ||
| + | - Arduino teekide halduse akna kaudu (avaneb nupust //Manage Libraries...// | ||
| + | - Kopeerides teegi lahti pakitud kujul kausta ~\Documents\Arduino\libraries (vajab Arduino IDE taaskäivitust) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Teegi näited === | ||
| + | Arduino jaoks loodud teekidega tuleb alati kaasa mõni näide, et tutvustada teegi funktsioonide kasutamist. Need näited leiab Arduino arenduskeskkonna //File// menüü alt. | ||
| + | |||
| + | {{: | ||