Obsah:

Digitálne hodinky na Arduine pomocou stroja s konečným stavom: 6 krokov
Digitálne hodinky na Arduine pomocou stroja s konečným stavom: 6 krokov

Video: Digitálne hodinky na Arduine pomocou stroja s konečným stavom: 6 krokov

Video: Digitálne hodinky na Arduine pomocou stroja s konečným stavom: 6 krokov
Video: Высокая плотность 2022 2024, November
Anonim
Digitálne hodinky na Arduine pomocou stroja s konečným stavom
Digitálne hodinky na Arduine pomocou stroja s konečným stavom

Dobrý deň, ukážem vám, ako je možné pomocou YAKINDU Statechart Tools vytvoriť digitálne hodinky a fungovať na zariadení Arduino, ktoré používa štít klávesnice LCD.

Pôvodný model digitálnych hodiniek bol prevzatý od Davida Harela. Publikoval článok o

„[…] Široké rozšírenie konvenčného formalizmu stavových automatov a stavových diagramov.“

V tomto príspevku použil na svoj výskum príklad digitálnych hodiniek. Použil som to ako inšpiráciu a hodinky som prestaval pomocou nástrojov YAKINDU Statechart Tools (nástroj na vytváranie grafických modelov stavových strojov a generovanie kódu C/C ++) a vrátil som ich k životu na Arduine.

Zásoby

Hardvér:

  • Arduino Uno alebo Mega
  • Štít LCD klávesnice

Softvér:

  • Nástroje YAKINDU Statechart
  • Eclipse C ++ IDE pre Arduino

Krok 1: Ako fungujú digitálne hodinky

Image
Image

Na úvod definujeme, ako by mali digitálne hodinky fungovať. Pamätáte si tieto … povedzme … "super cool" digitálne hodinky, ktoré mal každý v 90. rokoch? Integrované stopky, rôzne alarmy a ich nepríjemné pípanie každú celú hodinu. Ak nie, pozrite sa na digitálne hodinky z 90. rokov.

V zásade ide teda o konfigurovateľné hodinky s rôznymi režimami. Zobrazí sa hlavne aktuálny čas, ale existujú aj ďalšie funkcie. Ako vstup máte tlačidlo zapnutia/vypnutia, režimu a nastavenia. Okrem toho môžete svetlo zapnúť a vypnúť. Pomocou tlačidla režimu môžete rozlišovať medzi režimami a aktivovať/deaktivovať funkcie hodín:

  • Zobraziť čas (hodiny)
  • Zobraziť dátum (dátum)
  • Nastavte budík (Alarm 1, Alarm 2)
  • Povoliť/zakázať zvonkohru (Nastaviť zvonkohru)
  • Používajte stopky (Stopky)

V rámci ponúk môžete na konfiguráciu režimu použiť tlačidlo zapnutia/vypnutia. Tlačidlo nastavenia umožňuje nastaviť čas - napr. pre hodiny alebo budíky. Stopky je možné ovládať - spúšťať a zastavovať - pomocou tlačidla na zapnutie a vypnutie svetla. Môžete tiež použiť integrovaný počítadlo kôl

Ďalej je tu zvonkohra, ktorá zvoní každú celú hodinu, a integrované ovládateľné podsvietenie. V prvom kroku som ich nepripojil k Arduinu.

Krok 2: Štátny stroj

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

Nechcem ísť príliš podrobne na vysvetlenie tohto príkladu. Nie je to preto, že je to príliš zložité, ale je to trochu príliš veľké. Pokúsim sa vysvetliť základnú myšlienku toho, ako to funguje. Vykonanie by malo byť samovysvetľujúce tým, že sa na model pozriete alebo ho stiahnete a simulujete. Niektoré časti stavového stroja sú zhrnuté v čiastkových oblastiach, ako je napríklad nastavená časová oblasť. Vďaka tomu by mala byť zaistená čitateľnosť stavového stroja.

Model je rozdelený na dve časti - grafickú a textovú. V textovej časti budú definované udalosti, premenné atď. V grafickej časti - stavový diagram - je špecifikované logické prevedenie modelu. Na vytvorenie stavového stroja, ktorý spĺňa špecifikované správanie, sú potrebné niektoré vstupné udalosti, ktoré je možné použiť v modeli: onoff, set, mode, light a light_r. V sekcii definícií sa používa interná udalosť, ktorá každých 100 ms zvyšuje časovú hodnotu:

každých 100 ms / čas += 1

Na základe krokov 100 ms sa aktuálny čas vypočíta vo formáte HH: MM: SS:

display.first = (čas / 36000) % 24;

display.second = (čas / 600) % 60; display.third = (čas / 10) % 60;

Hodnoty budú pripojené k LCD displeju pomocou operácie updateLCD vždy, keď bude vyvolaný stavový stroj:

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

Základné spustenie stavového automatu je už definované v časti Ako fungujú digitálne hodinky. V rámci tohto nástroja som použil niekoľko „špeciálnych“modelovacích prvkov ako CompositeState, History, Sub-Diagrams, ExitNodes atď. Podrobný popis nájdete v Používateľskej príručke.

Krok 3: Štít klávesnice LCD

Štít klávesnice LCD je celkom vhodný pre jednoduché projekty, ktoré vyžadujú obrazovku pre vizualizáciu a niektoré tlačidlá ako vstup - typické, jednoduché rozhranie HMI (Human Machine Interface). Štít klávesnice LCD obsahuje päť používateľských tlačidiel a ďalšie na resetovanie. Všetkých päť tlačidiel je spojených s pinom A0 Arduina. Každý z nich je pripojený k deliču napätia, ktorý umožňuje rozlíšenie tlačidiel.

Na nájdenie konkrétnych hodnôt, ktoré sa môžu samozrejme líšiť od výrobcu, môžete použiť analogRead (0). Tento jednoduchý projekt zobrazuje aktuálnu hodnotu na LCD:

#include "Arduino.h"

#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); neplatné nastavenie () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write („nameraná hodnota“); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); oneskorenie (200); }

Toto sú moje namerané výsledky:

  • Žiadne: 1023
  • Vyberte: 640
  • Vľavo: 411
  • Dole: 257
  • Hore: 100
  • Vpravo: 0

S týmito prahovými hodnotami je možné čítať tlačidlá:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; výsledok = analogRead (0); if (výsledok <50) {return RIGHT; } if (result <150) {return UP; } if (result <300) {return DOWN; } if (result <550) {return LEFT; } if (result <850) {return SELECT; } vrátiť ŽIADNE; }

Krok 4: Rozhranie štátneho automatu

Rozhranie štátneho automatu
Rozhranie štátneho automatu

Generovaný kód C ++ stavového stroja poskytuje rozhrania, ktoré je potrebné implementovať na ovládanie stavového stroja. Prvým krokom je prepojenie udalostí s klávesmi štítu klávesnice. Už som ukázal, ako sa tlačidlá čítajú, ale na ich prepojenie so stavovým automatom je potrebné odblokovať tlačidlá - inak by boli udalosti vyvolané viackrát, čo má za následok nepredvídateľné správanie. Koncept softvérového debouncingu nie je nový. Môžete sa pozrieť na dokumentáciu k Arduinu.

Vo svojej implementácii zisťujem klesajúcu hranu (uvoľnenie tlačidla). Prečítam hodnotu tlačidla, počkám 80 ms (lepšie výsledky som získal s 80 namiesto 50), výsledok uložím a prečítam novú hodnotu. Ak starý výsledok nebol ŽIADNY (nestlačený) a nový výsledok je ŽIADNY, viem, že tlačidlo bolo stlačené predtým a teraz bolo uvoľnené. Potom zdvihnem zodpovedajúcu vstupnú udalosť stavového stroja.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); oneskorenie (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); prestávka; } prípad VĽAVO: {stateMachine-> getSCI_Button ()-> raise_set (); prestávka; } prípad DOLE: {stateMachine-> getSCI_Button ()-> raise_light (); prestávka; } prípad NAHORU: {stateMachine-> getSCI_Button ()-> raise_light_r (); prestávka; } prípad VPRAVO: {stateMachine-> getSCI_Button ()-> raise_onoff (); prestávka; } predvolené: {break; }}}}

Krok 5: Spojenie vecí dohromady

Hlavný program používa tri časti:

  • Štátny stroj
  • Časovač
  • Display Handler (typický lcd.print (…))

DigitalWatch* stateMachine = nové DigitalWatch (); CPPTimerInterface* timer_sct = nové CPPTimerInterface (); DisplayHandler* displayHandler = nový DisplayHandler ();

Stavový stroj používa obslužný program displeja a dostal časovač, ktorý bude aktualizovaný tak, aby riadil časované udalosti. Potom sa inicializuje a zadá stavový automat.

neplatné nastavenie () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Smyčka robí tri veci:

  • Zvýšte vstupné udalosti
  • Vypočítajte uplynulý čas a aktualizujte časovač
  • Zavolajte stavový automat

long current_time = 0; long last_cycle_time = 0; void loop () {raiseEvents (); last_cycle_time = aktuálny_čas; current_time = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Krok 6: Získajte príklad

To je všetko. Pravdepodobne som nespomenul všetky detaily implementácie, ale môžete sa pozrieť na príklad alebo zanechať komentár.

Pridajte príklad do spusteného IDE pomocou: Súbor -> Nový -> Príklad -> Príklady stavového diagramu YAKINDU -> Ďalej -> Arduino -digitálne hodinky (C ++)

> IDE si môžete stiahnuť tu <<

Môžete začať s 30 -dňovou skúšobnou verziou. Potom musíte získať licenciu, ktorá je bezplatná na nekomerčné použitie!

Odporúča: