Obsah:

Digitální hodinky na Arduinu pomocí stroje s konečným stavem: 6 kroků
Digitální hodinky na Arduinu pomocí stroje s konečným stavem: 6 kroků

Video: Digitální hodinky na Arduinu pomocí stroje s konečným stavem: 6 kroků

Video: Digitální hodinky na Arduinu pomocí stroje s konečným stavem: 6 kroků
Video: Učitel IN 2019 Miroslav Staněk – Škola v epicentru vědeckotechnické revoluce 2024, Listopad
Anonim
Digitální hodinky na Arduinu pomocí stroje s konečným stavem
Digitální hodinky na Arduinu pomocí stroje s konečným stavem

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í

Image
Image

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

Štít klávesnice LCD
Štít klávesnice LCD

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

Propojení stavového stroje
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: