Véges gépek, transzfer, kapcsoló nyilatkozatok amperka

Gyakran előfordul, hogy a program másképp viselkednek függően előfordulása Mindenesetre óta eltelt idő kezdete a munka, stb

Vegyük például egy eszközt hasonlóság koszorú. Tegyük fel, hogy szeretnénk Arduino kapcsolódott LED világítani üzemmód, amely lehet változtatni egy gomb megnyomásával. Mode lehet három:

A LED-ek folyamatosan

A LED-ek ki vannak kapcsolva, a bekapcsolt 2 másodpercenként

LED fokozatosan egyre fényerő nulláról legfeljebb 10 másodpercig, menj ki és indítsa el ismét növekedni fényerő

Nyomja meg a gombot, szeretnénk lépni a következő üzemmódban: 1 → 2, 2 → 3, 3 → 1. Tulajdonképpen ugyanúgy, mint ez történik sok karácsonyfa füzér.

Nem fogunk foglalkozni a vezérlő az egyes LED-külön. Csak azt feltételezik, hogy ezek mind közvetlenül kapcsolódik az egyik Arduino csap át MOSFET tranzisztort vagy más kapcsoló. Néhány más pin az óra egyidejűleg csatlakozik a gombbal lehet megváltoztatni a rendszert.

Ebben a forgatókönyvben a vázlatot, hogy minden a munka, úgy tűnhet, mint ez:

Az eredmény nem volt a legkönnyebb programot. De bőven van logika. Lépésről lépésre fogjuk megérteni, hogy mi van írva itt. Kezdjük néhány makrót.

Mint már említettük, van 3 üzemmód: folyamatos fény, villogó, növeli a fényerőt. De ahogy azt jelzik, hogy a processzor megmondani, melyik az aktuális, mi lesz a következő, stb Mint már tudjuk, mindent, amivel a processzor dolgozik - egészek. Ennek ismeretében tudjuk minden módban egyszerűen számozott:

0 - folyamatos fény, akkor a róla elnevezett STATE_SHINE

1 - villogó mód, hívjuk STATE_BLINK

2 - Rise fényerejű mód, hívjuk STATE_FADE

Használata a közös előtag a nevét, persze, nem szükséges - ez csak egy makró - de csoportosítására kapcsolódó értékek értelmében előtagokat nagyon kényelmesek, és meg tud felelni nekik elég gyakran.

Minden üzemmódban a készülék csinál valami egyedi, különbözik attól, amit történik más mód. A jelenlegi lehet egyetlen mód. Egy lehetséges átmenetek egyértelműen meghatározott: Minden következő aktiválódik, ha a gomb megnyomása után. Ezek a rendszerek a véges automaták. és módok nevezzük államok (Eng. állam).

Beszéd hivatalosan, az állam gép - egy rendszerben véges számú ismert körülmények között, a feltételeket, a közöttük lévő átmenetek vannak rögzítve, és ismert, és az aktuális mindig pontosan egy állapot.

Nos, mi csinálunk egy olyan gép - kiváló. A jelenlegi állapot, azaz a ragyogás mód lesz tárolva a változó nevű ledState. amely eredetileg az értéket STATE_SHINE. Így, amikor az Arduino rendszer lesz állandó izzás.

Mintegy sorsa más makro változók, és beszélni az út mentén.

Lánc közötti átmenetek államok

Nézzük a funkció hurok. Vagy inkább az első rész, és a meghatározások, amelyek rá vonatkoznak:

Először olvassa el az állam a gombok logikus változó isButtonDown. És rögtön azután, hogy ellenőrizze az állapotát, hogy meg lett nyomva, csak azt, de nem ebben az állapotban, a hurok az előző hívást. Meg lehet tanulni egy tipikus technika meghatározására egy gombnyomással. Van mit, miért késlelteti a hívást, és kinevezését wasButtonDown végén van, hogy egyértelmű legyen. Arra koncentrálunk, hogy mi történik belül a feltételes ha.

operátorral

Ennek lényege az, hogy létrehozza a következő helyett a jelenlegi állapot. Használata által meghatározott feltételek szerint a jelenlegi állapot, és a beállított kódot vetkok megfelelő következő állapotot.

Megjegyezzük, hogy a C ++ teszt egyenlőség végzett szimbólum ==. azaz dupla egyenlőségjel. Így ír az üzemeltető „egyenlő”. Az érték a logikai kifejezés igaz, ha az értékek a bal és a jobb oldalon a == egyenlő.

Tipikus programozási hiba -, hogy megzavarja az egyenlőség operátor == értékadó operátor =. Ha írsz:

program teljesen korrekt szempontjából a C ++ fordító, de a hely nem az, amit várt, első változó lesz állítva ledState STATE_SHINE. és csak akkor kell vizsgálni, hogy az igazság az értékét.

Ezért például a mi esetünkben, ha hibázott átadásával ezt a kódot ledState mindig felülírja értékkel STATE_SHINE. amely viszont a nyilvánították a 0. 0 egyenértékű a feltétel hamis. és ezért soha nem fog a blokkon belül a kódot.

Tehát, ha figyelembe vesszük a lánc, ha az egész, azt látjuk, hogy megpróbáljuk megérteni a feltételeket, amelyek az állam be van állítva, és most ez alapján frissíti az értéket ledState. helyezze azt a következő terveinkben üzemmódban.

A logika minden államban

Tettünk mindent, ami szükséges ahhoz, hogy a változó ledState tudta megérteni, hogy pontosan mit kell tenni a LED-ek most. Már csak azt, hogy végre ezt a logikát a gyakorlatban.

Tekintsük a második felében a kódot hurokfunkciót és meghatározások, amelyek használják azt.

A test a hurok, azt látjuk, a lánc feltételes kifejezések, ahol minden feltétel, összehasonlítjuk a jelenlegi állapot ledState felváltva minden lehetséges. A lényeg az, pontosan ugyanaz, mint korábban, amikor kapcsolási állapotát a gombnyomásra: Attól függően, hogy az aktuális értéket ledState teljesítette egy adott blokk kódot.

A fenti, akkor tisztán látni a 3 blokk kód: egyet-egyet a ragyogás módban. Az első ezek közül kerül sor, ha ledState még STATE_SHINE. azaz Ha az aktuális üzemmód - folyamatos fény. A kód blokk ebben az esetben primitív, csak azt kell biztosítani, hogy a LED-ek:

Egyértelmű, hogy a tompított hurok a következő alkalommal, a processzor ismét ebbe a bankfiókban és ismét bekapcsolja a LED-ek már benne. De nincs semmi baj, ez teljesen normális, és nincs mellékhatása.

villogó üzemmódban

További érdekes. Ha az aktuális állapot jött létre STATE_BLINK. azaz villogó üzemmódban 2 másodpercenként, végre egy kóddal ág:

Tudod, hogy annak érdekében, hogy csak pislogott egy LED a Arduino következetesen elég okoz digitalWrite és késés. köztük az akkori deaktiválása:

De másképp cselekedett és bonyolultabb. Miért?

Az a tény, hogy a hívás késleltetést eredményez Alvó processzor, és ez csak „lefagy” egy hívást egy megadott időközönként. Nem tud mást csinálni, de aludni. Most ne feledjük, hogy a koszorú mindig „egyszerre” nem 2 dolog:

Controls izzó LED

Elkapja a pillanatban megnyomja a gombot a mód

Így, ha a villogó üzemmódban a processzor aludt 2 másodpercig, és ez idő alatt kattintsunk a kapcsoló gomb, megnyomásával, hogy észrevétlen marad, és az átmenet a következő üzemmódban nem fog megtörténni. És nem szeretnénk teljesen.

Hogyan lehet megoldani a problémát? Ne használja a késés egyáltalán! Ehelyett minden alkalommal egyre gyülekezetünk lehet újraszámolni, hogy Garland kell ki- és bekapcsolni hogy az aktuális időt.

Ehhez használjuk a kis aritmetikai kifejezés. (Millis () / BLINK_DELAY)% 2.

Ezután fogjuk csak hogy a fennmaradó osztás 2 közbenső eredményt. Így a kapott értéket ezután 0, majd ezután ugyanezen 1 2 másodpercenként. Amire szükségünk van! Egyszerűen át a számított érték érvként hívás esetén digitalWrite.

Fényerő emelkedés mód

Ha az aktuális állapot a mi koszorúkat - STATE_FADE. A harmadik blokk kerül végrehajtásra, amelynek hatására a LED-ek fokozatosan szert fényerő 10 másodpercig, leállítjuk, és a fényerő erősítés újra:

A lényeg az, körülbelül ugyanaz, mint a villogó. Mi csak kissé eltérő kifejezés kiszámítása és hívja analogWrite helyett digitalWrite.

Célunk az, hogy a fényerő a LED-ek, hogy megszerezzék a nullától a maximális 10 másodperc pontosan, vagy ami ugyanaz, 10.000 ezredmásodperc. analogWrite a funkciója, mint a fényerő paraméter vesz értékek 0-tól 255, azaz a mindössze 256 árnyalatokkal. Ezért, hogy növelje a fényerőt egy érettségi kell haladnia 10.000 ms ÷ 256 ≈ 39 ms. Ez ezeket az értékeket határoztunk meg az elején a program:

Mivel a kifejezés Millis () / FADE_STEP_DELAY egység lesz nagyobb minden alkalommal 39 ms halad.

Megjegyzés: a zárójelben a meghatározás FADE_STEP_DELAY. Mivel az értékeket behelyettesítjük a makróprogram ahogy van, megkapjuk a Millis () / (10000/256); és ha a zárójelek nem lenne, akkor viszont Millis () / 10000/256, ami egyáltalán nem ugyanaz a dolog a szempontból a matematika. Ezért hozzá zárójelben körül minden aritmetikai kifejezéseket használva azokat makrókként értékeket.

Végül a közbenső értékek Millis () / FADE_STEP_DELAY megkapjuk a maradék szétválás 256. Így minden kezdődik elölről minden alkalommal egy köztes érték lesz többszöröse 256. Mit kell!

számtani államok

Ismét megnézzük a kódot, amely biztosította számunkra a felvétel egy másik állam, ha rákattint a gombra:

Ha a feltételek nem volt 3 és 33, a kód lenne elnyúlt a sok vonal, de ez semmi új és egyedülálló nem adott volna hozzá a programhoz: maradt volna az azonos típusú. Ha az írás a vázlat tűnik, hogy néhány helyen csökken monoton utasításkészlet, kissé eltér egymástól, szinte biztosan van egy módja, hogy egyszerűsítse a kódot, hogy egyszerűbb, egyértelműbb, tömörebb. Az egyik csak gondolni.

Mit lehet tenni a mi lánc? Emlékezzünk, hogy az állam a processzor - ez csak egész számok. Meghatároztuk azokat makrók segítségével.

Ezek a számok azt határozza meg a sorrendet. Tehát kapcsolási ledState más jelentést - ez nem más, mint a hozzá egységet. Az egyetlen probléma - az átmenet utolsó állapotból az első. De mi már tudjuk, a kezelő való osztás maradéka, és használata könnyű, hogy ezt a forgatókönyvet. Ezután az összes kódot, hogy a következő államok lehetnek írási elágazás nélkül az alábbiak szerint:

Amennyiben TOTAL_STATES - az államok száma, amit lehet meghatározni, mint:

felsorolás enum

Szemszögéből az összeállítás nem különbözik:

De abban az esetben az enum nem volt kifejezetten előírják értéke 0, 1, 2, 3, stb A listák az első állandó értéke automatikusan 0-ra, az egymást követő egy nagyobb.

És minél több jól felsorolás: tudjuk használni a nevét (State ebben az esetben), mint az adatok típusát, mint int. bool stb Ez azt jelenti, tudjuk meg a jelenlegi állapotában a változó az alábbiak szerint:

A színfalak mögött ledState ugyanaz marad egész, mint korábban, de maga a program mára egy kicsit világosabb: mi egyértelműen azonosítható, hogy fognak tárolni a változó.

Gyűlt össze az egészet, akkor kap egy frissített változata a program:

kapcsoló nyilatkozat

Ahhoz, hogy megértsük, mi köze LED füzérek ebben a pillanatban, mi használt lánc kifejezést, ha. ami viszont ledState aránya az összes lehetséges állapot. Ez egy meglehetősen gyakori forgatókönyv neki a C ++ switch utasítás van rá lehetőség. Tudjuk használni a mi szempontunkból:

Nem mondhatjuk, hogy a kód lett tömörebb, de ez egy kicsit világosabbá válnak.

A lényege a kapcsoló kifejezés. Először is, az A értékét egy aritmetikai kifejezést zárójelbe írjuk. Esetünkben - ez csak egyre értékét ledState. Ezután a kód mondat keresett zárójelek között ügy címkét. amelynek értéke számítható. kódfuttatást indul és megy, hogy egymást a végéig egység (nem csak a következő eset). Kivitelezés egység elején fejeződik kifejezést szünetet.

Gyakori hiba, hogy akaratlanul - elfelejteni, hogy a szünet. Ebben az esetben, a processzor végrehajtja a kódot tartozó egyéb jelek, és ez legfőképpen - nem, amire szüksége van. Igen, ez egy kellemetlen tulajdonsága C ++, de annyi volt a történelem. Kezdetben ez történt annak érdekében, hogy képes felsorolni több értéket egyetlen ága. Például, ha a feltételek STATE_FADE STATE_BLINK és a kialakítás volna, hogy nem ugyanaz, írhatnánk:

Szintén a kapcsolót. Az utolsó hely, megadhat egy címkét egy különleges nevet alapértelmezett. Ez nem fog sikerülni, ha nincs más esetben címke nem érhető el érték.

Tehát találkoztál véges állapotú automaták, államok, átmenetek, az elvek a többfeladatos. Példánkban a különböző államok, szoktuk egy viszonylag egyszerű logika egy hívás digitalWrite egyszerű aritmetikai kifejezés; és váltani az államok és a használt soros átkattintási gombot.

Semmi sem akadályozza meg, hogy ezt a témát, hogy sokkal több intelligens készülék. Például, a szoba robot lehet őrjáratok állapot kimutatására macska, macska állami ügyészség kijelző állapotát az akkumulátor töltöttsége alacsony. Kapcsolt lépnek fel az érzékelő jelét, és nem lesz olyan egyszerű. Logic kimondja magukat ebben az esetben is meglehetősen bonyolult: van, hogy az értékeket több érzékelő, válassza ki a mozgás irányát, twist motorok, stb

Csakúgy, mint minden mást, semmi sem akadályozza meg, hogy nem beágyazott áiiapotgépek: azaz, az állam, amelyek önmagukban véges automaták. Fő támogatási kód karcsú és olvasható, akkor sikerülni fog!

Kivéve, ahol másként nincs említve, ezen wiki tartalma a következő licenc vonatkozik az alábbi licenc: CC Attribution-Share Alike 3.0 Unported

oldal Eszközök