Montaa¾      Teegid      Ülesanded      
Aja mõõtmine ja taimerid Selleks, et mõõta mingist tegevusest kulunud aega, on kõige käepärasem kasutada millis(); funktsiooni, mis mõõdab millisekundeid unsigned long tüüpi numbrilise muutujana. Iga möödunud sekund on 1000 millisekundit. Ei loe vaja defineerida ühtegi muutujat Saad kasutada lihtsaid funktsiooninimesid Mitme loenduse korral hästi skaleeruv Funktsioonid on toodud ära juhendis (plaadil) Aja mõõtmine ja taimerid

Programmeerimine

C++ keele põhjal, praktiliste harjutustega

Aja mõõtmine ja taimerid

Selleks, et mõõta mingist tegevusest kulunud aega, on kõige käepärasem kasutada millis(); funktsiooni, mis mõõdab millisekundeid unsigned long tüüpi numbrilise muutujana. Iga möödunud sekund on 1000 millisekundit.

Ajahetke 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. 


Teeme näiteks teise nupuvajutuse peale arvutuse ja prindime selle jadaühenduse kaudu välja

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. 

Aja mõõtmine ja taimerid

 

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. 

GeneerilineTeegiga

unsigned long msMem;

// enne main loopi tuleb defineerida muutuja

 

if (r1){  // nupuvajutus
    msMem = millis() + 2000;
}

 

if (msMem > 0 && millis() > msMem){
    o1 = 1; // led põlema
}

if (r1){// nupuvajutus
    timeStart(2000);
}

 

if (timePass()){
    o1 = 1; // led põlema
}

  

 

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.  

  1. Ei loe vaja defineerida ühtegi muutujat
  2. Saad kasutada lihtsaid funktsiooninimesid
  3. Mitme loenduse korral hästi skaleeruv
  4. Funktsioonid on toodud ära juhendis (plaadil)
Aja mõõtmine ja taimerid

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. 

Veebilehe disain ja CMS

Aja mõõtmine ja taimerid

Ajahetke 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) Selleks, et mõõta mingist tegevusest kulunud aega, on kõige käepärasem kasutada millis(); funktsiooni, mis mõõdab millisekundeid unsigned long tüüpi numbrilise muutujana. Iga möödunud sekund on 1000 millisekundit.

Aja mõõtmine ja taimerid

nanotronic.eu © 2025 nanoTronic » Populaarne standard ja suur jõudlus