Kazalo:

Digitalna ura na Arduinu z uporabo stroja s končnim stanjem: 6 korakov
Digitalna ura na Arduinu z uporabo stroja s končnim stanjem: 6 korakov

Video: Digitalna ura na Arduinu z uporabo stroja s končnim stanjem: 6 korakov

Video: Digitalna ura na Arduinu z uporabo stroja s končnim stanjem: 6 korakov
Video: Дэниел Шмахтенбергер: Уничтожат ли нас технологии? 2024, November
Anonim
Digitalna ura na Arduinu z uporabo stroja za končno stanje
Digitalna ura na Arduinu z uporabo stroja za končno stanje

Pozdravljeni, pokazal vam bom, kako lahko z orodji YAKINDU Statechart Tools ustvarite digitalno uro in jo zaženete na Arduinu, ki uporablja ščit za tipkovnico LCD.

Prvotni model digitalne ure je bil vzet od Davida Harela. Objavil je članek o

"[…] Široka razširitev običajnega formalizma državnih strojev in diagramov stanja."

V tem prispevku je za svoje raziskave uporabil primer digitalne ure. Uporabil sem ga kot navdih in uro obnovil z orodji YAKINDU Statechart Tools (orodje za ustvarjanje grafičnih modelov državnih strojev in z njim ustvarjanje kode C/C ++) in jo oživil na Arduinu.

Zaloge

Strojna oprema:

  • Arduino Uno ali Mega
  • Ščit za tipkovnico LCD

Programska oprema:

  • Orodja za grafikone stanja YAKINDU
  • Eclipse C ++ IDE za Arduino

1. korak: Kako deluje digitalna ura

Image
Image

Začnimo z opredelitvijo delovanja digitalne ure. Se spomnite teh … recimo … "super kul" digitalnih ur, ki so jih imeli vsi v devetdesetih letih? Integrirana štoparica, različni alarmi in njen nadležen pisk vsako polno uro. Če ne, poglejte: digitalna ura 90 -ih.

V bistvu je to nastavljiva ura z različnimi načini. Prikazan bo predvsem trenutni čas, vendar obstajajo še nekatere druge funkcije. Kot vhod imate vklop/izklop, način in gumb za nastavitev. Poleg tega lahko vklopite in izklopite luč. Z gumbom za način lahko ločite med načini in vklopite/izklopite funkcije ure:

  • Prikaz časa (ura)
  • Prikaz datuma (Datum)
  • Nastavite alarm (Alarm 1, Alarm 2)
  • Omogoči/onemogoči zvonjenje (Nastavi zvonjenje)
  • Uporabite štoparico (štoparica)

V menijih lahko z gumbom za vklop/izklop konfigurirate način. Gumb za nastavitev vam omogoča nastavitev časa - npr. za uro ali alarme. Štoparico lahko upravljate - zaženete in ustavite - z gumbom za vklop in izklop luči. Uporabite lahko tudi integriran števec krogov

Poleg tega je zvonec, ki zvoni vsako polno uro, in integrirana nadzorna osvetlitev ozadja. Na prvem koraku jih nisem priključil na Arduino.

2. korak: Državni stroj

Ščit za tipkovnico LCD
Ščit za tipkovnico LCD

Za razlago tega primera se ne želim spuščati v podrobnosti. Ne zato, ker je preveč zapleteno, je le malo preveliko. Poskušal bom razložiti osnovno idejo, kako deluje. Izvedba mora biti samoumevna, tako da si ogledate model ali ga prenesete in simulirate. Nekateri deli državnega stroja so povzeti v podregijah, na primer nastavljeno časovno območje. S tem je treba zagotoviti berljivost državnega stroja.

Model je razdeljen na dva dela - grafični in besedilni. V besedilnem delu bodo opredeljeni dogodki, spremenljivke itd. V grafičnem delu - diagramu stanja - je podana logična izvedba modela. Če želite ustvariti državni stroj, ki izpolnjuje podano vedenje, so potrebni nekateri vhodni dogodki, ki jih je mogoče uporabiti v modelu: onoff, set, mode, light in light_r. V razdelku definicije je uporabljen notranji dogodek, ki vsakih 100 ms poveča časovno vrednost:

vsakih 100 ms / čas += 1

Na podlagi korakov 100 ms bo trenutni čas izračunan v formatu HH: MM: SS:

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

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

Vrednosti bodo povezane z LCD zaslonom z uporabo posodobitve delovanjaCD vsakič, ko se pokliče državni stroj:

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

Osnovna izvedba državnega stroja je že opredeljena v razdelku Kako digitalna ura deluje. Znotraj orodja sem uporabil nekaj "posebnih" elementov modeliranja, kot so CompositeState, History, Pod-diagrami, ExitNodes itd. Podroben opis najdete v uporabniškem priročniku.

3. korak: ščit za tipkovnico LCD

Zaščita tipkovnice LCD je zelo kul za preproste projekte, ki zahtevajo zaslon za vizualizacijo in nekaj gumbov kot vhod - tipičen, preprost HMI (Human Machine Interface). Zaščita tipkovnice LCD vsebuje pet uporabniških gumbov in še enega za ponastavitev. Vseh pet gumbov je skupaj povezanih z A0 pin Arduina. Vsak od njih je povezan z delilnikom napetosti, kar omogoča razlikovanje med gumbi.

S pomočjo analogRead (0) lahko poiščete določene vrednosti, ki se seveda lahko razlikujejo glede na proizvajalca. Ta preprost projekt prikazuje trenutno vrednost na LCD -prikazovalniku:

#vključi "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 ("Izmerjena vrednost"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); zamuda (200); }

To so moji izmerjeni rezultati:

  • Nič: 1023
  • Izberite: 640
  • Levo: 411
  • Dol: 257
  • Gor: 100
  • Desno: 0

S temi pragovi je mogoče prebrati gumbe:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; rezultat = analogRead (0); if (rezultat <50) {return DESNO; } if (rezultat <150) {return UP; } if (rezultat <300) {return DOWN; } if (rezultat <550) {return LEFT; } if (rezultat <850) {return SELECT; } return NONE; }

4. korak: Povezovanje državnega stroja

Povezovanje državnega stroja
Povezovanje državnega stroja

Ustvarjena koda državnega stroja C ++ ponuja vmesnike, ki jih je treba izvesti za nadzor stanja računalnika. Prvi korak je povezovanje dogodkov in dogodkov s tipkami ščita tipkovnice. Že sem pokazal, kako brati gumbe, toda za njihovo povezavo z državnim strojem je treba odstraniti gumbe - sicer bi se dogodki večkrat dvignili, kar ima za posledico nepredvidljivo vedenje. Koncept odprave programske opreme ni nov. Ogledate si lahko dokumentacijo Arduino.

V svoji izvedbi zaznam padajoči rob (spuščam gumb). Prebral sem vrednost gumba, počakal 80 ms (dosegel boljše rezultate z 80 namesto 50), shranil rezultat in prebral novo vrednost. Če oldResult ni bil NONE (brez pritiska) in je novi rezultat NONE, vem, da je bil gumb že pritisnjen in je bil zdaj sproščen. Nato dvignem ustrezen vhodni dogodek stanja stroja.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); zamuda (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); zlom; } primer LEVO: {stateMachine-> getSCI_Button ()-> raise_set (); zlom; } primer DOL: {stateMachine-> getSCI_Button ()-> raise_light (); zlom; } velika črka UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); zlom; } primer DESNO: {stateMachine-> getSCI_Button ()-> raise_onoff (); zlom; } privzeto: {break; }}}}

5. korak: Povežite stvari skupaj

Glavni program uporablja tri dele:

  • Državni stroj
  • Časovnik
  • Vodnik zaslona (tipičen lcd.tisk (…))

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

Državni stroj uporablja rokovalnik zaslona in ima časomer, ki bo posodobljen za nadzor časovnih dogodkov. Nato se državni stroj inicializira in vnese.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Zanka naredi tri stvari:

  • Zvišajte vhodne dogodke
  • Izračunajte pretečeni čas in posodobite časovnik
  • Pokličite državni stroj

dolg trenutni čas = 0; dolg zadnji_cikel_čas = 0; void loop () {raiseEvents (); last_cycle_time = current_time; trenutni_čas = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

6. korak: Pridobite primer

To je to. Verjetno nisem omenil vseh podrobnosti izvedbe, lahko pa si ogledate primer ali pustite komentar.

Tekuči IDE dodajte primer z: Datoteka -> Novo -> Primer -> Primeri grafikonov stanja YAKINDU -> Naprej -> Arduino -Digitalna ura (C ++)

> IDE lahko prenesete tukaj <<

Začnete lahko s 30 -dnevno preskusno različico. Nato morate pridobiti licenco, ki je brezplačna za nekomercialno uporabo!

Priporočena: