Programmeerimine
C++ keele põhjal, praktiliste harjutustegaTüüpiliselt ei luba Arduino teek liita Serial.print() käsu siseselt liita kokku mitut tekstilist fraasi, mis on vaikimisi const char ja täisarvulisi int muutujaid (ingl. int) vaheldumisi sõnedega. Näiteks harjutuses "laborirobot" on kolm muutujat, mootori number, selle staatus (sees või väljas) ja reeversi staatus (kas sees või väljas). Selleks, et saada vaikimisi Arduino standardit kasutades dünaamiline tagasiside lause kujul, näiteks
1. mootor on 1, reevers 0
tuleks klassikalises Arduino C++ käsitluses kirjutada järgnevalt Serial.print("1"); Serial.print(". mootor on"); Serial.print(o1); Serial.print(", reevers "); Serial.println(o4); Pane tähele, et esimesed read on Serial.print(); ja viimane Serial.println(); mille ln - on lühend "line" ehk lisab jadaühenduse sõnumile lõppu ka reavahetuse, mille tulemusena algab järgmine rida uuelt realt.
Sellist meetodit nimetatakse kettimiseks, sest iga element on justkui eraldi ketilüli. Kirjaviisi poolest on see üsna kohmakas, võtab programmikoodis palju ridu ja väljendit Serial.print() tuleb kirjutada üha uuesti ja uuesti. Vaata näiteks komplekssemat, viie erineva andmetüübiga kettimise näidet.
x.concat(y) Arduino String klass (ek sõne) sisaldab vaikimisi funktsiooni, millega on võimalik liita mitu sõnet kokku üheks pikemaks sõneks, näiteks vaatame järgnevat skripti String x = "Tere "; String y = "protsessor"; x.concat(y); muudab sõne x väärtuseks "Tere protsessor". Funktsiooni concat nimi tuleb ingliskeelsest väljendist concatenate, mida võiks antud kontekstis nimetada eesti keeles sõnede ühendamiseks.
+ operaatoriga Suurepäraselt lihtne võimalus on liita kokku mitut muutujat, mille puhul on tüüpide puhul pisut rohkem vabadust, saab kokku liita sõne ja numbrilise (int) muutuja String x = "Temperatuur "; int y = 21; String z = x + y; nüüd on z väärtusega "Temperatuur 21", kuid silmas tasub pidada, et tekstiline element peab olema eksplitsiitselt olema eelnevalt sõne (ingl String), mitte "const char". Selline eelnevalt sõnena defineerimine võib olla kohmakas, kuid õnneks on võimalik muutujaid lihtsal moel ühtlustada ja muuta sõneks String() funktsiooniga, näiteks Serial.print() jaoks käsitlemiseks järgnevalt
Serial.print("Temperatuur " + String(21));
Mis annab jadapordi kaudu täpselt samamoodi väljundiks "Temperatuur 21" nagu eelmise näitega
C++ vs. Python Tüüpide konverteerimine on üsna universaalne erinevates keeltes, siis on vahetevahel ühelt keelelt teisele üleminekul segiminekuoht, mida võib suurepäraselt tasandada originaalfunktsioonidega, näiteks lihtne funktsioon võimaldab jadaühenduse Serial.println muuta lühemaks ja universaalsemaks ning saada lahti segiminekuprobleemist. void print(String inText){ Serial.println(inText); } mida võib nüüd kasutada lühema ja segiminekut vältiva süntaksiga print("Temperatuur" + String(21)); ja jadaühenduse väljundiks on täpselt samamoodi "Temperatuur 21" nagu varemgi.
Samamoodi võib pakendada Arduino sõne funktsiooni String() lühemaks, Pythoni sarnaseks kui kirjutada originaalfunktsioon str() järgneval kujul void str(int inp){ return String(inp); } mis on kohandatud täisarvu int tüübi konverteerimiseks sõneks (ingl String), et kasutada seda print() funktsioonis vaikimisi const char tüüpi tekstiga ühe lausungina järgnevalt print("Temperatuur" + str(21)); mis annab vastuseks täpselt samamoodi "Temperatuur 21", nagu ka varasematel juhtudel. Lihtsamate täisarvuliste muutujate puhul on selline lühendamine käepärane ja lihtsustab koodi, muudab selle ka ülevaatlikumaks. Siiski tasub silmas pidada, et selline lihtne int => String konversioon on kitsalt ainult nende tüüpide vaheliseks muutuseks, ega hõlma teisi tüüpe nagu näiteks ujukomaarvud (ingl. float). | ||
Toimivate lahenduste võrdlus Võrdleme selguse huvides toimivaid lahendusi, milles on külg-külje kõrval näha Pythonis kasutatavad stringide liitmise ja printimise võtted, teises veerus Arduino String klassi meetodid ja kolmandas nanoTronic 0.68 versiooni teegipõhine lahendus, milles on kitsalt int => String konversioon
| |||||||||
Ülaltoodud näited kasutavad Arduino String klassi meetodit, kuid efektiivsemaks mälukasutuseks on oluline aru saada sõnede tüüpide erinevusest
Arduino programmeerimisel on 1. const char* (C-stiilis sõne)
DefineerimineSõne defineerimiseks on kõige levinum kasutada massiivi ja // 1. Kõige tüüpilisem ja mälusäästlikum viis konstantse sõne jaoks const char* konstante_sone = "See on konstantne C-stiilis sõne."; // Või massiivi abil const char konstante_massiiv[] = "Teine konstantne sõne."; // F-makro kasutamine, et tagada sõne salvestamine Flash-mällu Serial.println(F("See läheb otse Flash-mällu."));
2. String (Arduino String klass)
DefineerimineString muudetav_sone = "Algne tekst"; int number = 42; String number_sone = String(number); |
Järeldus: Väikese mäluga mikrokontrollerites, nagu Arduino, võib
| |||||||||||||||
Kõige mälusõbralikum lahendus Selleks, et vältida SRAM mälu ülekoormamist ja String objektiga seotud ebaefektiivsust tuleks kas pigem kasutada Serial.println(); kettimist või lahendada muul moel väljundisse sõnede saatmisel String objekti kasutamist ja eelistada alati char tüüpi.
Lahenduseks on originaalfunktsioon, mis aktsepteerib sisendina erinevaid andmetüüpe, ilma et peaks muretsema nende eelneva konverteerimise pärast (int, float, bool, char*, String, jne). Samas väldib SRAM ülekoormamist, sest String objektiga tehteid ei teha. Lisa enda teeki või programmi algusesse järgnev funktsioon void pr(){// mugavam print funktsoon Serial.println(); // tühi uus rida } template<typename T, typename... Args> void pr(T first, Args... rest){ Serial.print(first); pr(rest...); }// end pr Mis võimaldab ülimugavalt printida erineva tüübiga elemente ühes lauses, täpselt nagu Pythonis int t = 21; String cyh = "C"; float rhk = 101.3; const char* ryh = "hPa"; bool rvs = true; pr("Temperatuur ", t, " ", cyh, " ja rõhk ", rhk, " ", ryh, " reevers ", rvs); Prindib lause "Temperatuur 21 C ja rõhk 101.30 hPa reevers 1"
Võrreldes varasemate lahendustega on see nii SRAM suhtes mälusõbralikuim lahendus kui ka oluliselt lihtsam arenduse poolest koodi kirjutada. |
Laboriroboti staatused Seega käsitlesime siin sellel lehel erinevaid võimalusi, kuidas kettimise asemel võiks tagasisidestust kirjutada ühele reale. Toome siinkohal ära need kolm töötavat näidet, mis oli selle lehe alguses harjutuse "Laborirobot" mootorite tagasidestuseks, lausungi "1. mootor on 1, reevers 0" kuvamiseks. Serial.println(String(1) + ". mootor on " + o1 + ", reevers " + o4); print(str(1) + ". mootor on " + o1 + ", reevers " + o4); pr(1, ". mootor on ", o1, ", reevers ", o4); Millest esimene kirjutab välja standard jadapordi väljundi Serial.prinln() ja kasutab selle sees String() sõnede liitmist + plussmärkidega
Teine variant on modifitseeritud nanoTronic 0.68 versiooni teegis sisalduvate print() ja str() kasutusega, kuid toimib põhimõtteliselt samamoodi sõnede liitmise meetodil.
Kolmas lahendus on lisada kas programmi algusesse või teeki täiesti uus rekursiivne funktsioon pr() milles käsitletakse erinevaid sisendeid (int, float, bool, char*, String, jne) ilma neid konverteerimata ja selleks SRAM mälu kasutamata. Samuti on kolmas, pr() programmi kirjutamisel kõige lühem ja elegantsem lahendus. |
Monteeri lihtsalt ja kiiresti
Riistvara montaa¾ on jaotatud etappideks ja toetatud õppevideodega. Vaata lähemalt.
Tarkvaratugi
Loe riistvaralist portide lugemist ja muutujate defineerimist toetava tarkvarateegi kohta
C++ on masinate keel
Maailmas kõige enam kasutusel olev seadmete programmeerimiseks kasutatav keel on C++ mis võimaldab väikestel kiipidel ökonoomselt programmiloogikat lahendada ja teha ka suuri kõrgkeelele omaseid andmetöötlusi.
Populaarne Nano standard
Laiendusplaadi nanoTronic disainimisel on aluseks võetud Arduino Nano standard, mis võimaldab teha nii automatiseerimist, vanade asjade digitaliseerimist kui ka luua akutoitel töötavaid ökonoomseid mobiilsid seadmeid.
Ülesanded samm-sammult
Selleks, et C++ paremini tundma õppida on loodud ülesannetekogu, milles saab alguses teha lihtsamaid, samm-sammult keele võimalusi tutvustavaid harjutusi ja siirduda siis järjest edasi jõukohaste väljakutsetega.
Projekti fookusest
Projekt nanoTronic on loodud eelkõige hariduslikel eesmärkidel, et edendada mehhatroonika erialal programmeerimise süvendatud õpet, parema struktuuri ja loogikakasutusega skriptide kirjutamist.