Obsah:
- Zásoby
- Krok 1: Ako fungujú digitálne hodinky
- Krok 2: Štátny stroj
- Krok 3: Štít klávesnice LCD
- Krok 4: Rozhranie štátneho automatu
- Krok 5: Spojenie vecí dohromady
- Krok 6: Získajte príklad
Video: Digitálne hodinky na Arduine pomocou stroja s konečným stavom: 6 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
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
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
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
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:
Ako strhnúť digitálne posuvné meradlo a ako funguje digitálne posuvné meradlo: 4 kroky
Ako strhnúť digitálne meradlo a ako funguje digitálne meradlo: Mnoho ľudí vie, ako používať na meranie posuvné meradlá. Tento tutoriál vás naučí búrať digitálny strmeň a vysvetlí, ako digitálny posuvný meradlo funguje
Digitálne porovnanie digitálnych výstupov a digitálne: 7 krokov (s obrázkami)
Digitálne analógové audio a digitálne fotoaparáty: Nájdete tu všetky základné inštrukcie, ktoré nájdete v našej databáze. všetky formy a možnosti multimediálnych a multimediálnych multimediálnych nahrávok
Digitálne hodiny Arduino synchronizované pomocou 60 Hz elektrického vedenia: 8 krokov (s obrázkami)
Digitálne hodiny Arduino synchronizované pomocou 60 Hz elektrického vedenia: Tieto digitálne hodiny založené na Arduine sú synchronizované pomocou 60 Hz elektrického vedenia. Má jednoduchý a lacný spoločný anódový 4 -miestny 7 -segmentový displej, ktorý zobrazuje hodiny a minúty. Používa krížový detektor na detekciu, keď prichádzajúca 60 Hz sínusová vlna
Ako vyrobiť digitálne hodinky: 10 krokov (s obrázkami)
Ako si vyrobiť digitálne hodinky: Toto je prvýkrát, čo píšem návod, takže dúfam, že píšem dostatočne dobre, aby ste mu rozumeli. Dnes vám poviem, ako vytvoriť digitálne hodinky z webovej stránky, ktorú som našiel. Webová stránka sa nazýva sainsmart.com. Bolo to naozaj ľahké
MechWatch - vlastné digitálne hodinky: 9 krokov (s obrázkami)
MechWatch - vlastné digitálne hodinky: MechWatch sú hodinky, ktoré som navrhol tak, aby mali výhody Arduina z hľadiska flexibility, ale chcel som, aby vyzeral a cítil sa tak profesionálne, ako som len mohol. Na tento účel tento návod používa pomerne pokročilú elektroniku pre povrchovú montáž (žiadna expozícia