Programmeerimine
C++ keele põhjal, praktiliste harjutustegaAjahetke salvestamiseks on kõige käepärasem defineerida unsigned long tüüpi numbriline muutuja unsigned long msMem; antud juhul on muutuja nimi tuletatud ühikust ms ja liidetud sellele lühend sõnast mälu (ingl. Memory). Globaalse muutujana kasutamiseks, ehk tsükliteüleselt peab defineerimise asukoht olema ENNE main loop algust. Mingis määratud punktis saab sellesse salvestada aja, näiteks nupuvajutuse peale if (r1){ msMem = millis(); } Nüüd on muutujas talletatud konkreetne aeg, mis tähistab nupuvajutuse hetke, mõõdetuna millisekundites. Tulevikus võime arvutada selle punkti põhjal kahe aja, salvestatud varasema tegevuse ja tulevikus toimuva tegevuse aegade vahe.
if (r2){// teine nupp, rising edge unsigned long kaheAjapunktiVahe = millis() - msMem; pr("Möödunud on ", kaheAjapunktiVahe, " millisekundit"); } Kui millisekundites aja arvestamine on liiga krüptiline, siis võid sekundite saamiseks jagada millisekundid 1000-ga ja saad tulemuse sekundites, näiteks if (r2){ unsigned long kaheAjapunktiVahe = millis() - msMem; pr("Möödunud on ", kaheAjapunktiVahe, " millisekundit"); float tulemSekundites = (float)kaheAjapunktiVahe / 1000; pr("Mis on sekunditeks arvutatuna ", tulemSekundites, " s"); } Tüüpiliselt on sekundites tulemus inimsilmale paremini loetav, samas kui vaja on suuremat täpsust ja komakohtade vältimist, siis võid jääda millisekundite juurde. |
Lihtne taimer Kui eesmärgiks on luua taimer, mis kontrollib etteantud aja möödumist, näiteks 2 sekundi möödumist algushetkest, et teha siis mingi tegevus - lülitus, siis võiks kasutada järgnevat lahendust.
Defineeri samamoodi ENNE main loop tsüklit unsigned long muutuja unsigned long msMem; ja salvesta vajaliku tegevuse, näiteks nupuvajutuse puhul tulevikuhetk, millal peaks tegevus toimuma if (r1){ msMem = millis() + 2000; } Antud juhul tehakse salvestus nupu 1 vajutuse, täpsemalt "rising edge" sündmuse korral. Erinevalt eelmisest näitest ei salvestata nüüd enam mitte seda ajahetke, millal ajavõtu algus toimub, vaid liidetakse sellele soovitud ajaperiood, mis oli antud juhul 2 sekundit ehk 2000 millisekundit.
Salvestatud tulevikuaja möödumise kontrolliks saad nüüd kasutada lihtsat võrdlust tingimuslauses if (millis() > msMem){ o1 = 1; } ja kui esmalt sätestatud ajapunkt on möödunud, siis saad käivitada soovitud tegevuse, antud juhul näiteks panna LED - tule põlema. Antud juhul tekib küll segadus algse väärtusega, siis kui msMem on alles 0, siis tuleks lisada veel lisakontroll, et kui msMem on aktiivne ehk algsest nullist suurem, selliselt if (msMem > 0 && millis() > msMem){ o1 = 1; } Mis lisab küll pisut krüptilisust, kuid ei tohiks siiski olla liiga ületamatult komplitseeritud. Küll võib minna olukord keerukamaks, kui kasutusel on paralleelselt mitu taimerit ja neid tuleb uuendada, seisata ja siis uuesti taaskäivitada. Sellisel juhul on lahenduseks juba eraldi funktsioonide loomine, mis kasutavad teegi tasandil defineeritud muutujaid.
Taimerifunktsioonid teegis Sarnaselt loendurile on ka ajavõtu jaoks teegis lihtne ja puhas lahendus, mis võimaldab kirjutada puhtamat ja lühemat koodi ning keskenduda rohkem programmi ülesehitusele ja loogikale.
Taimeri aja defineerimiseks, näiteks 2000 millisekundi mõõtmiseks kasuta if (r1){ timeStart(2000); } ja nüüd saad aja möödumisel teha ilusa puhta ühekordse lülituse if (timePass()){ o1 = 1; } Juhul kui aeg ei ole veel möödunud, annab timePass() vastuseks "false" ja kui aeg on möödunud, siis ühe korra "true", mille puhul saad siis teha lülituse (üks kord).
Kuni 5 paralleelset taimerit Sarnaselt loenduritele on võimalik kasutada kuni 5 paralleelselt toimivat taimerit, mitme taimeri puhul tuleb sätestada taimeri number kujul timeStart(2000, 1); ja timePass(1); esimese taimeri puhul, 2 teise jaoks jne.
|
Kahe meetodi võrdlus Teeme lihtsa võrdluse, kus eesmärgiks on nupuvajutuse tõusuääre (ingl. rising edge) peale peab käivituma kahesekundiline taimeri ajaintervall ja selle möödudes süttima led tuli. Vasakul on geneerilise meetodi näide, mis vajab esmalt unsigned long muutuja defineerimist (enne main loop algust) ja teisel juhul teegi tasandil juba defineeritud muutuja ja funktsiooni kasutamisega.
Teegifunktsioonide eelised Võimalik on üsna lihtsal moel defineerida ka geneeriliselt muutuja ja selle põhjal aegu võrrelda. Samas on teegi tasandil defineeritud funktsioonidel päris mitu olulist eelist, mis muudavad originalprogrammi loomise kiiremaks, mugavamaks ja vähem krüptiliseks.
| ||||||
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.