Obsah:
- Zásoby
- Krok 1: Jak digitální hodinky fungují
- Krok 2: Státní automat
- Krok 3: Štít klávesnice LCD
- Krok 4: Propojení stavového stroje
- Krok 5: Zapojení věcí dohromady
- Krok 6: Získejte příklad
Video: Digitální hodinky na Arduinu pomocí stroje s konečným stavem: 6 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
Dobrý den, ukážu vám, jak lze digitální hodinky vytvořit pomocí nástrojů YAKINDU Statechart Tools a spustit na Arduinu, který používá štít LCD klávesnice.
Původní model digitálních hodinek byl převzat od Davida Harela. Vydal o tom dokument
„[…] Široké rozšíření konvenčního formalismu stavových strojů a stavových diagramů.“
V tomto příspěvku použil ke svému výzkumu příklad digitálních hodinek. Použil jsem to jako inspiraci a hodinky jsem přestavěl pomocí nástrojů YAKINDU Statechart Tools (nástroj pro vytváření grafických modelů stavových strojů a generování kódu C/C ++ s nimi) a přivedl je zpět k životu na Arduinu.
Zásoby
Hardware:
- Arduino Uno nebo Mega
- Štít klávesnice LCD
Software:
- Nástroje YAKINDU Statechart
- Eclipse C ++ IDE pro Arduino
Krok 1: Jak digitální hodinky fungují
Začněme definováním, jak by měly digitální hodinky fungovat. Pamatujete si tyto … řekněme … "super cool" digitální hodinky, které měl každý v 90. letech? Integrované stopky, různé alarmy a nepříjemné pípání každou celou hodinu. Pokud ne, podívejte se: digitální hodinky 90. let.
V zásadě se tedy jedná o konfigurovatelné hodinky s různými režimy. Zobrazí se hlavně aktuální čas, ale existují i další funkce. Jako vstup máte zapnuto/vypnuto, režim a tlačítko nastavení. Kromě toho můžete světlo zapnout a vypnout. Pomocí tlačítka režimu můžete rozlišovat mezi režimy a aktivovat/deaktivovat funkce hodin:
- Zobrazit čas (hodiny)
- Zobrazit datum (datum)
- Nastavte budík (Alarm 1, Alarm 2)
- Povolit/zakázat zvonkohru (Nastavit zvonění)
- Použijte stopky (stopky)
V nabídkách můžete režim konfigurovat pomocí tlačítka zapnutí/vypnutí. Tlačítko nastavení umožňuje nastavit čas - např. pro hodiny nebo alarmy. Stopky lze ovládat - spouštět a zastavovat - pomocí tlačítka pro zapnutí a vypnutí světla. Můžete také použít integrovaný čítač kol
Dále je zde zvonkohra, která zvoní každou celou hodinu, a integrované podsvícení. V prvním kroku jsem je nepřipojil k Arduinu.
Krok 2: Státní automat
Nechci se příliš rozepisovat o vysvětlení tohoto příkladu. Není to proto, že je to příliš složité, je to jen trochu příliš velké. Pokusím se vysvětlit základní myšlenku, jak to funguje. Provedení by mělo být samovysvětlující-stačí se podívat na model nebo jej stáhnout a simulovat. Některé části stavového stroje jsou sečteny v dílčích oblastech, jako je nastavená časová oblast. S tím by měla být zajištěna čitelnost stavového stroje.
Model je rozdělen na dvě části - grafickou a textovou. V textové části budou definovány události, proměnné atd. V grafické části - stavový diagram - je specifikováno logické provedení modelu. K vytvoření stavového stroje, který splňuje zadané chování, jsou vyžadovány některé vstupní události, které lze v modelu použít: onoff, set, mode, light a light_r. V definiční sekci je použita interní událost, která zvyšuje hodnotu času každých 100 ms:
každých 100 ms / čas += 1
Na základě kroků 100 ms bude aktuální čas vypočítán ve formátu HH: MM: SS:
display.first = (čas / 36000) % 24;
display.second = (čas / 600) % 60; display.third = (čas / 10) % 60;
Hodnoty budou připojeny k LCD displeji pomocí operace updateLCD pokaždé, když bude vyvolán stavový stroj:
display.updateLCD (display.first, display.second, display.third, display.text)
Základní provedení stavového stroje je již definováno v části Jak digitální hodinky fungují. V rámci nástroje jsem použil několik „speciálních“modelovacích prvků jako CompositeState, History, Sub-Diagrams, ExitNodes atd. Podrobný popis najdete v uživatelské příručce.
Krok 3: Štít klávesnice LCD
Štít klávesnice LCD je docela vhodný pro jednoduché projekty, které vyžadují obrazovku pro vizualizaci a některá tlačítka jako vstup - typické, jednoduché rozhraní HMI (Human Machine Interface). Štít klávesnice LCD obsahuje pět uživatelských tlačítek a další pro reset. Všech pět tlačítek dohromady je připojeno ke kolíku A0 Arduina. Každý z nich je připojen k rozdělovači napětí, který umožňuje rozlišení mezi tlačítky.
Můžete použít analogRead (0) k vyhledání konkrétních hodnot, které se samozřejmě mohou lišit podle výrobce. Tento jednoduchý projekt zobrazuje aktuální hodnotu na LCD:
#include "Arduino.h"
#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); neplatné nastavení () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write („naměřená hodnota“); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); zpoždění (200); }
Toto jsou mé naměřené výsledky:
- Žádný: 1023
- Vyberte: 640
- Vlevo: 411
- Dolů: 257
- Nahoru: 100
- Vpravo: 0
S těmito prahovými hodnotami je možné číst tlačítka:
#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; result = analogRead (0); if (result <50) {return RIGHT; } if (result <150) {return UP; } if (result <300) {return DOWN; } if (result <550) {return LEFT; } if (result <850) {return SELECT; } vrátit ŽÁDNÝ; }
Krok 4: Propojení stavového stroje
Vygenerovaný kód C ++ stavového stroje poskytuje rozhraní, která je nutné implementovat pro řízení stavového stroje. Prvním krokem je propojení událostí pomocí kláves štítu klávesnice. Už jsem ukázal, jak tlačítka číst, ale pro jejich propojení se stavovým strojem je nutné odblokování tlačítek - jinak by byly události vyvolány vícekrát, což má za následek nepředvídatelné chování. Koncept softwarového odskakování není nový. Můžete se podívat do dokumentace Arduino.
Ve své implementaci zjišťuji sestupnou hranu (uvolnění tlačítka). Přečtu hodnotu tlačítka, počkám 80 ms (lepší výsledky jsem získal s 80 místo 50), výsledek uložím a přečtu novou hodnotu. Pokud oldResult nebyl NONE (nestisknutý) a nový výsledek je NONE, vím, že tlačítko bylo stisknuto dříve a nyní bylo uvolněno. Poté zvýším odpovídající vstupní událost stavového stroje.
int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); zpoždění (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); přestávka; } případ VLEVO: {stateMachine-> getSCI_Button ()-> raise_set (); přestávka; } případ DOLŮ: {stateMachine-> getSCI_Button ()-> raise_light (); přestávka; } případ NAHORU: {stateMachine-> getSCI_Button ()-> raise_light_r (); přestávka; } případ VPRAVO: {stateMachine-> getSCI_Button ()-> raise_onoff (); přestávka; } výchozí: {break; }}}}
Krok 5: Zapojení věcí dohromady
Hlavní program používá tři části:
- Státní stroj
- Časovač
- Display Handler (typický lcd.print (…))
DigitalWatch* stateMachine = nové DigitalWatch (); CPPTimerInterface* timer_sct = nové CPPTimerInterface (); DisplayHandler* displayHandler = nový DisplayHandler ();
Stavový stroj používá obslužný program zobrazení a dostal časovač, který bude aktualizován tak, aby řídil časované události. Poté se inicializuje a zadá stavový stroj.
neplatné nastavení () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Smyčka dělá tři věci:
- Zvyšte vstupní události
- Vypočítejte uplynulý čas a aktualizujte časovač
- Zavolejte stavový stroj
long current_time = 0; long last_cycle_time = 0; void loop () {raiseEvents (); last_cycle_time = aktuální_čas; current_time = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }
Krok 6: Získejte příklad
A je to. Pravděpodobně jsem nezmínil každý detail implementace, ale můžete se podívat na příklad nebo zanechat komentář.
Přidejte příklad do spuštěného IDE pomocí: Soubor -> Nový -> Příklad -> Příklady stavu YAKINDU Statechart -> Další -> Arduino -Digital Watch (C ++)
> IDE si můžete stáhnout zde <<
Můžete začít s 30denní zkušební verzí. Poté musíte získat licenci, která je pro nekomerční použití zdarma!
Doporučuje:
Digitální manometr/monitor stroje CPAP: 6 kroků (s obrázky)
Digitální manometr/monitor stroje CPAP: Probudili jste se někdy ráno a zjistili jste, že je vaše maska CPAP vypnutá? Toto zařízení vás upozorní, pokud jste nechtěně odstranili masku během spánku. Terapie CPAP (Continuous Positive Airway Pressure) je nejběžnější formou léčby obstrukčního spánku
Digitální dveřní zámek založený na Arduinu pomocí GSM a Bluetooth: 4 kroky
Digitální dveřní zámek založený na Arduinu pomocí GSM a Bluetooth: ABSTRAKT: Zamyslete se nad situací, kdy jste přišli domů zcela unavení a zjistili jste, že jste ztratili klíč od dveří. Co budeš dělat? Musíte buď rozbít svůj zámek, nebo zavolat klíčového mechanika. Takže výroba bezklíčového zámku je zajímavý nápad, jak ušetřit
Jak vyrobit digitální hodinky: 10 kroků (s obrázky)
Jak vyrobit digitální hodinky: Toto je poprvé, co píši Instructable, takže doufám, že píšu dostatečně dobře, abyste to pochopili. Dnes vám řeknu, jak vyrobit digitální hodinky z webu, který jsem našel. Webová stránka se nazývá sainsmart.com. Bylo to opravdu snadné
MechWatch - vlastní digitální hodinky: 9 kroků (s obrázky)
MechWatch - vlastní digitální hodinky: MechWatch jsou hodinky, které jsem navrhl tak, aby měly výhody Arduina z hlediska flexibility, ale chtěl jsem, aby vypadal a cítil se profesionálně vyrobený tak, jak jsem uměl. Za tímto účelem tento návod používá poměrně pokročilou elektroniku pro povrchovou montáž (žádná expozice
Digitální teplotní senzor založený na Arduinu: 5 kroků (s obrázky)
Digitální teplotní senzor založený na Arduinu: Teplotní senzory jsou v dnešní době opravdu běžnou věcí, ale většina z nich je extrémně komplikovaná na výrobu nebo extrémně drahá na nákup. Tento projekt vám poskytne digitální teplotní senzor na bázi Arduina, který je nejen levný a velmi snadný do m