Arduino multitasken en tiidbehear

Arduino test foar multitasken mei milis

Ik bin gjin Arduino-ekspert, nettsjinsteande it hawwen fan de plaat foar in lange tiid Ik haw amper ûndersocht. De kearen dat ik it haw brûkt is it west as in al kopieare en plakke koade foar ark, mar sûnder folle belangstelling om echt te learen hoe't it wurket, mar gewoan mei de bedoeling it te meitsjen en nuttich te wêzen foar my. Dizze krystdei stimde ik de Krystsint in bytsje ôf mei wat LED's en in ultrasoan-sensor fan HC-SR04. En ik stoppe om te observearjen wat der dien wurde moast.

Ik woe gewoan ferskillende dingen dwaan mei twa LED's fan itselde sinjaal. Oeps. Ik stroffele gau oer wat ik tink sil wêze ien fan 'e earste beheiningen dy't jo tsjinkomme as jo begjinne mei Arduino, En jo hoege it net te yngewikkeld te meitsjen. Ik haw it gewoan oer guon LED's, jo beseffe dat jo net kinne dwaan wat jo wolle.

Litte wy it fan it begjin ôf dúdlik meitsje multitasken bestiet net yn Arduino, twa banen kinne net parallel ferwurke wurde. Mar d'r binne techniken om sa snel te skiljen dat se lykje gear te wurkjen.

Ik fertel de saak yn mear detail. Mei Kryst sette ik in Krystsintrum op en woe dat bepaalde Krystljochten ljochte as myn dochters benaderen. Neat yngewikkeld. Ik woe gewoan dat twa tûken fan ledlampen oars soene wurkje as de wearden fan in tichtenssensor.

Ik woe doe't ien tichterby kaam as 10 sm

  • Ien fan 'e tûken fan ljochten dy't nei de stjerren soene gean, sil 10 sekonden bliuwe
  • Dat de oare dy't yn 'e huzen soe gean 10 sekonden bliuwe soe, mar om't se har skieden fan' e kerststêd.

Ienfaldich is it net? om't dit jo grutte problemen kin feroarsaakje. Om't Arduino net yn steat is om te multitasken, fiert it it iene kommando nei it oare út.

 

LED's foar circuitmontering knipperje en ultrasone multitasken

Ik haw in dien montage mei de ultrasone sensor fan HC-SR04 en 2 LED's, elk soe lykweardich wêze oan in tûke fan 'e Bethlehem. It earste diel is net heul grappich, om't it is om de opset en wurking fan 'e ultrasoan-sensor yn' e LOOP te konfigurearjen, mar jo kinne dit op tûzenen plakken fine. Lykas in oare dei as ik mear ûndersykje, doch ik in spesjale, foar no binne jo hjir (sorry dat ik gjin credits sette, mar ik wit net wer't ik it wei ha)

HC-SR04 koade op Arduino

int ledPin1 = 8; int ledPin2 = 7; lange ôfstân; lange tiid; lange hjoeddeistige tiid; long timepast; void setup () {// initialisearje digitale pin LED_BUILTIN as útfier. pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); Serial.begin (9600); pinMode (3, OUTPUT); / * aktivearring fan pin 9 as útfier: foar de ultrasone puls * / pinMode (2, INPUT); / * aktivearring fan pin 8 as ynput: echografie stuiteringstiid * /} // de loopfunksje rint oer en wer foargoed leech lus () {digitalWrite (3, LOW); / * Troch sensorstabilisaasje * / fertraging Microsekonden (5); digitalWrite (3, HIGH); / * ferstjoeren fan de ultrasone puls * / fertragingMicrosekonden (10); tiid = pulseIn (2, HIGH); / * Funksje om de lingte fan de ynkommende pols te mjitten. Mjit de tiid dy't ferstreke is tusken it ferstjoeren fan 'e ultrasone puls en as de sensor de bounce ûntfangt, dat is: fanôf wannear't pin 12 it bounce begjint te ûntfangen, HIGH, oant it stopt mei dwaan, LOW, de lingte fan' e ynkommende puls * / ôfstân = int (0.017 * tiid); / * formule om de ôfstân te berekkenjen en in gehielwearde te krijen * / / * Monitoring yn sintimeter troch de seriële monitor * / Serial.println ("Ofstân"); Serial.println (ôfstân); Serial.println ("cm"); fertraging (1000);

Hjirmei wurdt de ôfstân mjitten troch de ultrasoan-sensor besjoen en opslein

LEDS operaasje oplossing

It earste ding dat yn 't sin komt is om fertraging te setten. Ik wit net wêrom, mar alle begjinners tinke oan fertraging () en dat beheint de opsjes sterk, om't by it brûken fan fertraging () it bestjoer net trochgiet mei wurkjen en dêrom kinne jo neat oars dwaan yn dy ophingingstiid. De oplossing is milis () te brûken

Hjir fûn ik in ienfâldige oplossing basearre op if en counters. As in learaar fan my eartiids sei, kin alles wurde programmearre mei in protte as op in rige. Mar fansels is de wierheid net heul elegant.

// as de ôfstân minder is dan 10, sette wy de twa LED's of tûken oan en begjinne de tiid te tellen mei millis () as (ôfstân <10) {digitalWrite (ledPin1, HIGH); digitalWrite (ledPin2, HIGH); hjoeddeistige tiid = millis (); } // as de ôfstân grutter is dan 10, sille wy de trochgeande tiid kontrolearje sûnt dizze waard ynskeakele en as dizze grutter is dan de oantsjutte, sille wy de LED1 útsette as (ôfstân> 10) {timepast = millis () - hjoeddeistige tiid ; digitalWrite (ledPin1, LOW); // as de ôfstân grutter is dan 10000 sille wy LED2 útsette as (timepast> 10000) {digitalWrite (ledPin2, LOW); }}}

Wat dizze koade is fan doel is dat de Arduino dizze trije as konstant útfiert, sadat it sa rap trochgean sil dat it liket dat it ferskate dingen tagelyk docht. Mar sa't wy al witte, giet it trochgean mei it útfieren fan sinnen ien foar ien.

Ienris wurdt de ôfstân metten en opslein yn 'e fariabele ôfstân, de ifs wurde evaluearre:

  • De earste kontroleart as de ôfstân minder is dan de winske 10 sm. As dat sa is, sette wy de twa LED's oan en begjinne de tiid te tellen mei millis ()
  • en wy soene nei de twadde gean as foar de ôfstân grutter dan 10 sm. As it foldocht, berekkenje wy de tiid dy't led 1 is foarby en deaktivearje, dy't allinich ôfhinklik wie fan 'e ôfstân.
  • Wy soene nei de tredde gean as wêr't wy kontrolearje as mear dan 10 sekonden binne ferrûn sûnt de teller waard aktivearre, en as ja, pin 2 útsette
  • En sa giet de loop troch. En op 'e nij.

Oan it ein, en hoewol de oplossing wurke, wie it my dúdlik dat dit probleem troch in protte minsken ûnderfûn wêze moast en dat der in mear ortodokse oplossing wêze moast. Ik begon te sykjen en fûn in goeie (dy't wis net de iennichste is) fan 'e jonges Adafruit en objektorientearre programmearring, It bestiet út it meitsjen fan objekten mei definieare klassen om rappe opropen te meitsjen en de koade net hûnderten kearen yn ús programma te herheljen.

Wat op it lêst "deselde" is as myn oplossing mei as + tsjinkomt mar folle eleganter en dat leveret in folle lêsbere en folle effisjinter koade.

It behearen fan multitasken liedt ûnûntkomber ta tiidbehear yn Arduino, Earst waard dit net opnommen yn it artikel, mar ik tink dat it heul ynteressant is.

Arduino en tiidfunksjes

Lykas ik al kommentaar haw Ik tink dat d'r in grutte ôfhinklikens is mei fertraging () , mooglik om't minsken dy't begjinne, dizze funksje sjogge yn alle foarbylden dy't normaal wurde setten fan 'e blink nei elke ferkearsljocht of elke manipulaasje fan LEDS oan en út.

Fertraging hat in heul grut probleem en dat is dat as wy in oprop meitsje fertrage () foar in hoemannichte tiid stoppet alles. It boerd lêst gjin sensor, en bliuwt it ek sinen útfiere, of alles wat dwaan, wachtsje gewoan op 'e tiid dat wy it hawwe sein om troch te gean en fansels as wy it boerd foar mear dan ien ding wolle brûke by deselde tiid is dit net libbensfetber.

Wy sille efkes sjen moatte milis () Sels fertragingMicrosekonden () En wy hawwe ek micros () wêrtroch it oantal mikrosekonden weromkomt sûnt it programma begon te fieren

Knipperje sûnder fertraging

In cool foarbyld om te sjen hoe't it wurket run de mytyske Blink mar sûnder de fertraging, It wichtichste ferskil is dat wy de fertraging () -funksje ferjitte en millis () brûke om de tiid tusken operaasjes te tellen.

3 opmerkingen oer "Arduino multitasken en tiidbehear"

  1. Wite oer it bestean fan "ynterrumpen" yn arduino kin jo helpe om programma's te ymplementearjen mei in bepaalde mjitte fan multitasken.

    antwurd

Leave a comment