Amldasgio Arduino a rheoli amser

Prawf Arduino i amldasg gyda milis

Nid wyf yn arbenigwr Arduino, er gwaethaf cael y plât ers amser maith prin yr wyf wedi ymchwilio. Yr amseroedd yr wyf wedi ei ddefnyddio mae wedi bod fel offeryn copïo a gludo cod a grëwyd eisoes ond heb lawer o ddiddordeb mewn dysgu sut mae'n gweithio mewn gwirionedd ond yn syml gyda'r bwriad o wneud iddo weithio a bod yn ddefnyddiol i mi. Y Nadolig hwn, tynnais olygfa'r Geni ychydig gyda rhai LEDs a synhwyrydd uwchsain HC-SR04. Ac mi wnes i stopio arsylwi ar yr hyn oedd yn rhaid ei wneud.

Roeddwn i eisiau gwneud pethau gwahanol gyda dau LED o'r un signal. Whoops. Fe wnes i faglu yn gyflym ar yr hyn fydd yn fy marn i un o'r cyfyngiadau cyntaf y dewch ar eu traws pan ddechreuwch chwarae o gwmpas gydag Arduino. Ac nid oes angen i chi ei wneud yn rhy gymhleth. Rwy'n siarad am rai LEDau yn unig, rydych chi'n sylweddoli na allwch chi wneud yr hyn rydych chi ei eisiau yn gywir.

Gadewch i ni ei gwneud hi'n glir o'r dechrau nid yw amldasgio yn bodoli yn Arduino, ni ellir prosesu dwy swydd yn gyfochrog. Ond mae yna dechnegau i wneud galwadau mor gyflym fel eu bod yn ymddangos eu bod yn gweithio ar yr un pryd.

Rwy'n dweud yr achos yn fwy manwl. Adeg y Nadolig, sefydlais Golygfa'r Geni ac roeddwn i eisiau i rai goleuadau Geni ddod ymlaen pan aeth fy merched ati. Dim byd cymhleth. Roeddwn i eisiau i ddwy gangen o oleuadau dan arweiniad weithio'n wahanol i werthoedd synhwyrydd agosrwydd.

Roeddwn i eisiau pan ddaeth rhywun yn agosach na 10 cm

  • Bydd un o'r canghennau o oleuadau a fyddai'n mynd i'r sêr yn aros ymlaen am 10 eiliad
  • Y byddai'r un arall a fyddai'n mynd y tu mewn i'r tai yn aros ymlaen am 10 eiliad ond ers iddyn nhw wahanu o olygfa'r geni.

Iawn syml? oherwydd gall hyn achosi problemau mawr i chi. Oherwydd nad yw Arduino yn gallu amldasgio, mae'n gweithredu un gorchymyn ar ôl y llall.

 

LEDau mowntio cylched yn fflachio ac amldasgio uwchsonig

Rydw i wedi gwneud a mowntio gyda'r synhwyrydd ultrasonic HC-SR04 a 2 LED, byddai pob un yn hafal i gangen o'r Bethlehem. Nid yw'r rhan gyntaf yn ddoniol iawn, gan ei fod i ffurfweddu gosodiad a gweithrediad y synhwyrydd uwchsain yn y LOOP, ond gallwch ddod o hyd i hyn mewn miloedd o leoedd. Fel diwrnod arall os byddaf yn ymholi mwy, rwy'n gwneud arbennig, am nawr dyma chi (mae'n ddrwg gennyf beidio â rhoi credydau, ond nid wyf yn cofio o ble y cefais ef)

Cod HC-SR04 ar Arduino

int ledPin1 = 8; int ledPin2 = 7; pellter hir; amser hir; amser cyfredol hir; timepast hir; gosod gwagle () {// ymgychwyn pin digidol LED_BUILTIN fel allbwn. pinMode (ledPin1, ALLBWN); pinMode (ledPin2, ALLBWN); Serial.begin (9600); pinMode (3, ALLBWN); / * actifadu pin 9 fel allbwn: ar gyfer y pwls ultrasonic * / pinMode (2, INPUT); / * actifadu pin 8 fel mewnbwn: amser bownsio uwchsain * /} // mae'r swyddogaeth dolen yn rhedeg drosodd a throsodd am byth dolen gwag () {digitalWrite (3, ISEL); / * Oherwydd sefydlogi synhwyrydd * / oediMicroseconds (5); DigitalWrite (3, UCHEL); / * anfon y pwls ultrasonic * / oediMicroseconds (10); amser = pulseIn (2, UCHEL); / * Swyddogaeth i fesur hyd y pwls sy'n dod i mewn. Mae'n mesur yr amser sy'n mynd heibio rhwng anfon y pwls ultrasonic a phan fydd y synhwyrydd yn derbyn y bownsio, hynny yw: o'r adeg y mae pin 12 yn dechrau derbyn y bownsio, UCHEL, nes iddo stopio gwneud hynny, ISEL, hyd y pwls sy'n dod i mewn * / pellter = int (0.017 * amser); / * fformiwla i gyfrifo'r pellter sy'n cael gwerth cyfanrif * / / * Monitro mewn centimetrau gan y monitor cyfresol * / Serial.println ("Pellter"); Serial.println (pellter); Serial.println ("cm"); oedi (1000);

Gyda hyn, bydd y pellter a fesurir gan y synhwyrydd uwchsain yn cael ei adolygu a'i storio

Datrysiad gweithredu LEDS

Y peth cyntaf sy'n dod i'r meddwl yw dechrau rhoi oedi. Nid wyf yn gwybod pam ond mae pob dechreuwr yn meddwl am oedi () ac mae hynny'n cyfyngu'r opsiynau yn fawr oherwydd er nad yw'n defnyddio oedi () mae'r bwrdd yn parhau i weithio ac felly ni allwch wneud unrhyw beth arall yn yr amser atal hwnnw. Yr ateb yw defnyddio millis ()

Yma des i o hyd i ateb syml yn seiliedig ar os a chownteri. Fel yr arferai athro i mi ddweud, gellir rhaglennu unrhyw beth gyda llawer o bethau yn olynol. Ond wrth gwrs nid yw'r gwir yn cain iawn.

// os yw'r pellter yn llai na 10, rydyn ni'n troi'r ddwy LED neu gangen ymlaen ac yn dechrau cyfrif yr amser gyda milis () os (pellter <10) {digitalWrite (ledPin1, UCHEL); digitalWrite (ledPin2, UCHEL); cyfredol amser = millis (); } // os yw'r pellter yn fwy na 10 byddwn yn gwirio'r amser a basiwyd ers iddo gael ei droi ymlaen ac os yw'n fwy na'r un a nodwyd byddwn yn diffodd y LED1 os (pellter> 10) {timepast = millis () - cyfredol ; digitalWrite (ledPin1, ISEL); // os yw'r pellter yn fwy na 10000 byddwn yn diffodd LED2 os (timepast> 10000) {digitalWrite (ledPin2, ISEL); }}}

Yr hyn y mae'r cod hwn yn ei fwriadu yw bod Arduino yn cyflawni'r tri os yn gyson fel y bydd yn mynd drwyddynt mor gyflym fel ei bod yn ymddangos ei fod yn gwneud sawl peth ar yr un pryd. Ond fel y gwyddom eisoes, mae'n parhau i gyflawni brawddegau fesul un.

Unwaith y bydd y pellter yn cael ei fesur a'i storio yn y newidyn pellter, byddai'r ifs yn cael eu gwerthuso:

  • Mae'r cyntaf yn gwirio a yw'r pellter yn llai na'r 10 centimetr a ddymunir. Os felly, rydym yn troi'r ddau LED ymlaen ac yn dechrau cyfrif yr amser gyda millis ()
  • a byddem yn mynd i'r ail pe bai'r pellter yn fwy na 10 cm. Os yw'n cydymffurfio, rydym yn cyfrifo'r amser sydd wedi mynd heibio ac yn dadactifadu 1, a oedd yn dibynnu ar y pellter yn unig.
  • Byddem yn mynd i'r trydydd os ydym yn gwirio a yw mwy na 10 eiliad wedi mynd heibio ers i'r cownter gael ei actifadu, ac os felly, diffodd pin 2
  • Ac felly mae'r ddolen yn mynd ymlaen. Ac eto.

Yn y diwedd, ac er i'r datrysiad weithio, roedd yn amlwg i mi ei bod yn rhaid bod y broblem hon wedi'i phrofi gan lawer o bobl a bod yn rhaid cael datrysiad mwy uniongred. Dechreuais edrych a dod o hyd i un da (nad dyna'r unig un yn sicr) gan y bechgyn Rhaglenni adafruit a rhaglenni sy'n canolbwyntio ar wrthrychau. Mae'n cynnwys creu gwrthrychau gyda dosbarthiadau diffiniedig i wneud galwadau cyflym a pheidio â gorfod ailadrodd y cod gannoedd o weithiau yn ein rhaglen.

Sydd yn y diwedd "yr un peth" â fy ateb gyda os + cownteri ond yn llawer mwy cain ac mae hynny'n darparu cod llawer mwy darllenadwy a llawer mwy effeithlon.

Mae'n anochel bod rheoli amldasgio yn arwain at reoli amser yn Arduino. Ar y dechrau ni chynhwyswyd hyn yn yr erthygl ond rwy'n credu ei fod yn ddiddorol iawn.

Swyddogaethau Arduino ac amser

Fel y dywedais eisoes Rwy'n credu bod yna ddibyniaeth fawr gydag oedi () , o bosibl oherwydd bod pobl sy'n cychwyn allan yn gweld y swyddogaeth hon yn yr holl enghreifftiau a roddir fel arfer o'r chwinciad i unrhyw oleuadau traffig neu unrhyw drin LEDS ymlaen ac i ffwrdd.

Mae gan oedi broblem fawr iawn, a hynny yw pan fyddwn yn galw oedi () am gyfnod, mae popeth yn dod i ben. Nid yw'r bwrdd yn darllen unrhyw synhwyrydd, ac nid yw'n parhau i weithredu brawddegau, ac nid yw'n gwneud unrhyw beth o gwbl, dim ond aros am yr amser yr ydym wedi dweud wrthych am basio ac wrth gwrs os ydym am ddefnyddio'r bwrdd ar gyfer mwy nag un peth ar yr un pryd, nid yw hyn yn ymarferol.

Bydd yn rhaid i ni edrych ar millis () hyd yn oed i oedi Microseconds() Ac mae gennym ni hefyd micros() sy'n dychwelyd nifer y microseconds ers i'r rhaglen ddechrau gweithredu

Blink yn ddi-oed

Enghraifft cŵl i weld sut mae'n gweithio yw rhedeg y Blink chwedlonol ond heb yr oedi. Y prif wahaniaeth yw ein bod yn anghofio am y swyddogaeth oedi () ac yn defnyddio milis () i allu cyfrif yr amser rhwng gweithrediadau.

Os ydych chi'n berson aflonydd fel ni ac eisiau cydweithio i gynnal a chadw a gwella'r prosiect, gallwch chi wneud cyfraniad. Bydd yr holl arian yn mynd i brynu llyfrau a deunyddiau i arbrofi a gwneud tiwtorialau

3 sylw ar "amldasgio Arduino a rheoli amser"

  1. Gall gwybod am fodolaeth "ymyrraeth" mewn arduino eich helpu i weithredu rhaglenni sydd â rhywfaint o amldasgio.

    ateb

Gadael sylw