Digitális óra Arduino -n véges állapotú gép használatával: 6 lépés
Digitális óra Arduino -n véges állapotú gép használatával: 6 lépés
Anonim
Digitális óra az Arduino -n véges állapotú gép használatával
Digitális óra az Arduino -n véges állapotú gép használatával

Sziasztok, megmutatom, hogyan hozható létre digitális óra a YAKINDU Statechart Tools segítségével, és hogyan futtatható egy Arduino -n, amely LCD billentyűpajzsot használ.

A digitális óra eredeti modelljét David Hareltől vették. Közölt egy dokumentumot a

"[…] Az állami gépek és állapotdiagramok hagyományos formalizmusának széles körű kiterjesztése."

Ebben a dolgozatban a digitális óra példáját használta kutatásaihoz. Inspirációként használtam, és újratelepítettem az órát a YAKINDU Statechart Tools segítségével (egy eszköz az állapotgépek grafikus modelljeinek létrehozásához és a C/C ++ kód létrehozásához), és életre keltettem egy Arduino -n.

Kellékek

Hardver:

  • Arduino Uno vagy Mega
  • LCD billentyűpajzs

Szoftver:

  • YAKINDU Állapotjelző eszközök
  • Eclipse C ++ IDE az Arduino számára

1. lépés: A digitális óra működése

Image
Image

Kezdjük azzal, hogy meghatározzuk a digitális óra működését. Emlékszel ezekre … tegyük fel, hogy „rendkívül klassz” digitális órák, amelyekkel mindenki rendelkezett még a 90 -es években? Beépített stopper, különböző riasztók és bosszantó hangjelzés minden teljes órában. Ha nem, nézze meg: a 90 -es évek digitális órája.

Tehát alapvetően ez egy konfigurálható óra, különböző módokkal. Főként az aktuális idő jelenik meg, de vannak más funkciók is. Bemenetként van be- és kikapcsolás, üzemmód és beállító gomb. Ezenkívül be- és kikapcsolhatja a lámpát. A mód gombbal megkülönböztetheti az üzemmódokat, és aktiválhatja/letilthatja az óra funkcióit:

  • Az idő megjelenítése (óra)
  • A dátum megjelenítése (Dátum)
  • Riasztás beállítása (1. riasztás, 2. riasztás)
  • Harangszó engedélyezése/letiltása (Harangszó beállítása)
  • A stopper használata (Stopper)

A menükben a be/ki gombbal konfigurálhatja az üzemmódot. A set gomb lehetővé teszi az idő beállítását - pl. az órához vagy az ébresztőkhöz. A stopper a fény be- és kikapcsolása gombbal vezérelhető - indítható és leállítható. Használhat integrált körszámlálót is

Ezenkívül van egy csengő, amely minden teljes órában harangozik, és integrált szabályozható háttérvilágítás. Első lépésben nem kötöttem őket az Arduino -hoz.

2. lépés: Az állapotgép

LCD billentyűpajzs
LCD billentyűpajzs

Nem akarom részletezni a példa magyarázatát. Nem azért, mert túl bonyolult, csak egy kicsit túl nagy. Megpróbálom elmagyarázni a működésének alapgondolatát. A végrehajtásnak magától értetődőnek kell lennie, ha megnézi a modellt, vagy letölti és szimulálja. Az állapotgép egyes részei alrégiókban összegződnek, például a beállított időrégió. Ezzel biztosítani kell az állapotgép olvashatóságát.

A modell két részre oszlik - egy grafikusra és egy szövegesre. A szöveges részben az eseményeket, változókat stb. Határozzák meg. A grafikus részben - az állapotdiagramban - a modell logikai végrehajtása van megadva. A megadott viselkedésnek megfelelő állapotgép létrehozásához bizonyos bemeneti eseményekre van szükség, amelyek használhatók a modellben: onoff, set, mode, light és light_r. A definíció szakaszban egy belső eseményt használunk, amely 100 ms -onként növeli az időértéket:

100 ms / alkalommal += 1

A 100 ms -os lépések alapján az aktuális időt ÓÓ: HH: SS formátumban kell kiszámítani:

kijelző.első = (idő / 36000) % 24;

display.second = (idő / 600) % 60; display.third = (idő / 10) % 60;

Az értékek az updateLCD művelet használatával minden alkalommal bekapcsolódnak az LCD kijelzőre, amikor az állapotgépet meghívják:

display.updateLCD (display.first, display.second, display.third, display.text)

Az állapotgép alapvető végrehajtását már a Digitális óra működése című szakasz határozza meg. Az eszközön belül néhány "speciális" modellezési elemet használtam, mint például a CompositeState, a History, az Aldiagramok, az ExitNodes stb. Részletes leírás a Felhasználói útmutatóban található.

3. lépés: LCD kezelőpajzs

Az LCD billentyűpajzs nagyon jó az egyszerű projektekhez, amelyekhez képernyő szükséges a megjelenítéshez és néhány gomb bemenetre - tipikus, egyszerű HMI (Human Machine Interface). Az LCD billentyűpajzs öt felhasználói gombot és egy másikat tartalmaz a visszaállításhoz. Az öt gomb együttesen az Arduino A0 érintkezőjéhez van csatlakoztatva. Mindegyik feszültségosztóhoz van csatlakoztatva, amely lehetővé teszi a gombok megkülönböztetését.

Az analogRead (0) segítségével megtalálhatja a konkrét értékeket, amelyek természetesen eltérhetnek a gyártótól. Ez az egyszerű projekt megjeleníti az aktuális értéket az LCD -n:

#include "Arduino.h"

#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("Mért érték"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); késleltetés (200); }

Ezek a mért eredményeim:

  • Nincs: 1023
  • Válasszon: 640
  • Balra: 411
  • Le: 257
  • Fel: 100
  • Helyes: 0

Ezekkel a küszöbértékekkel lehet olvasni a gombokat:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; eredmény = analógRead (0); if (eredmény <50) {return RIGHT; } if (eredmény <150) {return UP; } if (eredmény <300) {return DOWN; } if (eredmény <550) {return LEFT; } if (eredmény <850) {return SELECT; } vissza NINCS; }

4. lépés: Az állapotgép illesztése

Az állami gép illesztése
Az állami gép illesztése

Az állapotgép generált C ++ kódja interfészeket biztosít, amelyeket az állapotgép vezérléséhez végre kell hajtani. Az első lépés az események összekapcsolása a billentyűpajzs billentyűivel. Már mutattam, hogyan kell olvasni a gombokat, de az állapotgéphez való illesztéshez szükség van a gombok lekapcsolására - ellenkező esetben az események többször is felmerülnek, ami kiszámíthatatlan viselkedést eredményez. A szoftver -visszavonás fogalma nem új. Megnézheti az Arduino dokumentációját.

A megvalósításom során leeső élt észlelek (a gomb felengedése). Elolvastam a gomb értékét, várok 80 ms -ot (jobb eredményt kaptam 80 helyett 50 helyett), elmentettem az eredményt és elolvastam az új értéket. Ha a oldResult nem volt NINCS (nincs megnyomva), és az új eredmény NINCS, tudom, hogy a gombot korábban megnyomták, és most elengedték. Ezután felvetem az állapotgép megfelelő bemeneti eseményét.

int oldState = NINCS; static void raiseEvents () {int buttonPressed = readButton (); késleltetés (80); oldState = gomb megnyomva; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); szünet; } eset BALRA: {stateMachine-> getSCI_Button ()-> raise_set (); szünet; } eset LE: {stateMachine-> getSCI_Button ()-> raise_light (); szünet; } case UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); szünet; } case JOBB: {stateMachine-> getSCI_Button ()-> raise_onoff (); szünet; } alapértelmezett: {break; }}}}

5. lépés: A dolgok összekapcsolása

A fő program három részből áll:

  • Az államgépezet
  • Egy időzítő
  • A kijelzőkezelő (tipikus lcd.print (…))

DigitalWatch* stateMachine = új DigitalWatch (); CPPTimerInterface* timer_sct = új CPPTimerInterface (); DisplayHandler* displayHandler = új DisplayHandler ();

Az állapotgép kijelzőkezelőt használ, és kapott egy időzítőt, amelyet frissíteni fognak az időzített események vezérlésére. Ezt követően az állapotgép inicializálódik és belép.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateGép-> init (); stateMachine-> enter (); }A hurok három dolgot tesz:

  • Emelje fel a beviteli eseményeket
  • Számítsa ki az eltelt időt és frissítse az időzítőt
  • Hívja fel az állami gépet

hosszú aktuális_idő = 0; hosszú utolsó_ciklusidő = 0; void loop () {raiseEvents (); last_cycle_time = aktuális_idő; aktuális_idő = millis (); timer_sct-> updateActiveTimer (állapotGép, aktuális_idő - utolsó_ciklusidő); stateMachine-> runCycle (); }

6. lépés: Szerezze meg a példát

Ez az. Valószínűleg nem említettem a megvalósítás minden részletét, de megnézheti a példát, vagy megjegyzést írhat.

A példa hozzáadása egy futó IDE -hez:

> Az IDE letölthető innen <<

Kezdheti egy 30 napos próbaidőszakkal. Ezt követően licencet kell szereznie, amely nem kereskedelmi használatra ingyenes!

Ajánlott: