Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme: 6 hapa
Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme: 6 hapa

Video: Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme: 6 hapa

Video: Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme: 6 hapa
Video: Изучите Arduino за 30 минут: примеры и проекты 2025, Janar
Anonim
Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme
Orë dixhitale në Arduino duke përdorur një makinë të gjendjes së fundme

Përshëndetje, unë do t'ju tregoj se si mund të krijohet një orë dixhitale me YAKINDU Statechart Tools dhe të funksionojë në një Arduino, i cili përdor një mburojë të tastierës LCD.

Modeli origjinal i orës dixhitale është marrë nga David Harel. Ai ka botuar një punim në lidhje me

"[…] Shtrirje e gjerë e formalizmit konvencional të makinave shtetërore dhe diagrameve shtetërore."

Në këtë punim, ai përdori shembullin e orës dixhitale për kërkimin e tij. Unë e kam përdorur atë si një frymëzim dhe kam rindërtuar orën me YAKINDU Statechart Tools (një mjet për krijimin e modeleve grafike të makinave shtetërore dhe gjenerimin e kodit C/C ++ me të) dhe e kam kthyer atë në jetë me një Arduino.

Furnizimet

Hardware:

  • Arduino Uno ose Mega
  • Mburoja e tastierës LCD

Softuer:

  • Mjetet e hartës shtetërore YAKINDU
  • Eclipse C ++ IDE për Arduino

Hapi 1: Si funksionon Ora Dixhitale

Image
Image

Le të fillojmë duke përcaktuar se si duhet të funksionojë ora dixhitale. A i mbani mend këto … le të themi … orë dixhitale "shumë të lezetshme" që të gjithë i kishin në vitet '90? Një kronometër i integruar, alarme të ndryshme dhe sinjali i tij bezdisës çdo orë të plotë. Nëse jo, hidhini një sy: ora dixhitale e viteve '90.

Pra, në thelb është një orë e konfigurueshme me mënyra të ndryshme. Kryesisht, koha aktuale do të shfaqet, por ka disa veçori të tjera. Si hyrje, keni një çelës/ndezje, një modalitet dhe një buton të caktuar. Përveç kësaj, ju mund të ndizni dhe fikni dritën. Me butonin e modalitetit ju mund të bëni dallimin midis mënyrave dhe aktivizoni/çaktivizoni veçoritë e orës:

  • Shfaq kohën (Ora)
  • Shfaq datën (datën)
  • Vendosni alarmin (Alarm 1, Alarm 2)
  • Aktivizo/çaktivizo zilen (Vendos tingullin)
  • Përdorni kronometrin (Stop Watch)

Brenda menyve, mund të përdorni butonin e ndezjes/fikjes për të konfiguruar modalitetin. Butoni i caktuar ju lejon të vendosni kohën - p.sh. për orën ose alarmet. Kronometri mund të kontrollohet - fillohet dhe ndalet - duke përdorur butonin e ndezjes dhe fikjes. Ju gjithashtu mund të përdorni një numërues të integruar të xhiros

Për më tepër, ekziston një tingull që bie çdo orë të plotë dhe një dritë e pasme e kontrollueshme e integruar. Në hapin e parë, nuk i lidha me Arduino.

Hapi 2: Makina Shtetërore

Mburoja e tastierës LCD
Mburoja e tastierës LCD

Unë nuk dua të shkoj shumë në detaje për shpjegimin e këtij shembulli. Nuk është sepse është shumë komplekse, është vetëm pak shumë e madhe. Do të përpiqem të shpjegoj idenë themelore se si funksionon. Ekzekutimi duhet të jetë vetë-shpjegues, duke parë modelin ose shkarkuar dhe simuluar atë. Disa pjesë të makinës shtetërore përmblidhen në nënrajone, si rajoni i caktuar kohor. Me këtë, duhet të sigurohet lexueshmëria e makinës shtetërore.

Modeli është i ndarë në dy pjesë - grafike dhe tekstuale. Në pjesën tekstuale do të përcaktohen ngjarjet, ndryshoret, etj. Në pjesën grafike - diagrami i gjendjes - specifikohet ekzekutimi logjik i modelit. Për të krijuar një makinë shtetërore, që përmbush sjelljen e specifikuar, kërkohen disa ngjarje hyrëse, të cilat mund të përdoren në model: ndezja, vendosja, modaliteti, drita dhe drita_r. Brenda seksionit të përkufizimit përdoret një ngjarje e brendshme, e cila rrit vlerën e kohës çdo 100 ms:

çdo 100 ms / kohë += 1

Bazuar në hapat 100 ms koha aktuale do të llogaritet në formatin HH: MM: SS:

shfaqje.parë = (koha / 36000) % 24;

shfaqje.sekonda = (koha / 600) % 60; shfaqje.treta = (koha / 10) % 60;

Vlerat do të lidhen me ekranin LCD duke përdorur operacionin updateLCD çdo herë që makina shtetërore do të thirret:

display.updateLCD (ekran.para, ekran.sekondë, ekran.tretë, ekran.tekst)

Ekzekutimi bazë i makinës shtetërore është përcaktuar tashmë në pjesën Si funksionon Ora Dixhitale. Brenda mjetit kam përdorur disa elementë modelimi "special" si CompositeState, History, Sub-Diagrams, ExitNodes, etj. Një përshkrim i hollësishëm mund të gjendet në Udhëzuesin e Përdoruesit.

Hapi 3: Mburoja e tastierës LCD

Mburoja e tastierës LCD është mjaft e mirë për projekte të thjeshta, të cilat kërkojnë një ekran për vizualizim dhe disa butona si hyrje - një HMI tipike, e thjeshtë (Ndërfaqja e Makinerisë Njerëzore). Mburoja e tastierës LCD përmban pesë butona të përdoruesit dhe një tjetër për rivendosje. Pesë butonat të gjithë së bashku janë të lidhur me kunjin A0 të Arduino. Secila prej tyre është e lidhur me një ndarës të tensionit, i cili lejon dallimin midis butonave.

Ju mund të përdorni analogRead (0) për të gjetur vlerat specifike, të cilat, natyrisht, mund të ndryshojnë nga prodhuesi. Ky projekt i thjeshtë shfaq vlerën aktuale në LCD:

#përfshi "Arduino.h"

#përfshi "LiquidCrystal.h" LiquidCrystal LCD (8, 9, 4, 5, 6, 7); void setup () {lcd.filloj (16, 2); lcd.setCursor (0, 0); lcd.write ("Vlera e matur"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); vonesë (200); }

Këto janë rezultatet e mia të matura:

  • Asnjë: 1023
  • Zgjidhni: 640
  • Majtas: 411
  • Poshtë: 257
  • Lart: 100
  • Djathtas: 0

Me këto pragje është e mundur të lexoni butonat:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define POSHT 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; rezultati = analogRead (0); nëse (rezultati <50) {kthehu DREJT; } if (rezultati <150) {kthehu UP; } if (rezultati <300) {kthehu Poshtë; } if (rezultati <550) {kthehu Majtas; } if (rezultati <850) {kthehu SELECT; } ktheni ASNJ; }

Hapi 4: Ndërfaqja e makinës shtetërore

Ndërfaqja me Makinën Shtetërore
Ndërfaqja me Makinën Shtetërore

Kodi i gjeneruar C ++ i makinës shtetërore siguron ndërfaqe, të cilat duhet të zbatohen për të kontrolluar makinën shtetërore. Hapi i parë është lidhja e ngjarjeve me çelësat e Mburojës së tastierës. Unë tashmë kam treguar se si të lexoj butonat, por për ndërlidhjen e tyre me makinën shtetërore, kërkohet heqja e butonave - përndryshe, ngjarjet do të ngriheshin shumë herë, gjë që rezulton në sjellje të paparashikueshme. Koncepti i debunimit të softuerit nuk është i ri. Ju mund t'i hidhni një sy dokumentacionit Arduino.

Në zbatimin tim, unë zbuloj një avantazh që bie (duke lëshuar butonin). Kam lexuar vlerën e butonit, pres 80 ms (kam rezultate më të mira me 80 në vend të 50), ruaj rezultatin dhe lexoj vlerën e re. Nëse Rezultati i vjetër nuk ishte NUK (i shtypur) dhe rezultati i ri është ASNJ, e di, që butoni është shtypur më parë dhe tani është lëshuar. Pastaj, unë ngre ngjarjen sipas hyrjes së makinës shtetërore.

int oldState = ASNJE; statike void raiseEvents () {int buttonPressed = readButton (); vonesë (80); oldState = butonPresuar; if (oldState! = NUK && readButton () == ASNJE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> modaliteti_ ngritës (); pushim; } rasti LEFT: {stateMachine-> getSCI_Button ()-> raise_set (); pushim; } rasti Poshtë: {stateMachine-> getSCI_Button ()-> drita_ ngritëse (); pushim; } rast UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); pushim; } rasti DREJTA: {stateMachine-> getSCI_Button ()-> raise_onoff (); pushim; } parazgjedhje: {pushim; }}}}

Hapi 5: Instalimi i Gjërave së bashku

Programi kryesor përdor tre pjesë:

  • Makina e Shtetit
  • Një kohëmatës
  • Një mbajtës i ekranit (tipike lcd.print (…))

DigitalWatch* stateMachine = DigitalWatch e re (); CPPTimerInterface* timer_sct = CPPTimerInterface e re (); DisplayHandler* displayHandler = i ri DisplayHandler ();

Makina shtetërore përdor një mbajtës të ekranit dhe mori një kohëmatës, i cili do të përditësohet për të kontrolluar ngjarjet e kohës. Më pas, makina shtetërore inicializohet dhe futet.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Ky lak bën tre gjëra:

  • Ngrini ngjarjet e dhëna
  • Llogaritni kohën e kaluar dhe përditësoni kohëmatësin
  • Thirrni makinën shtetërore

kohë e gjatë aktuale_0 = kohë e gjatë e_ fundit e ciklit = 0; void loop () {raiseEvents (); koha e_ciklit të fundit = koha_ aktuale; koha_ aktuale = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Hapi 6: Merrni Shembullin

Kjo eshte. Ndoshta, nuk kam përmendur çdo detaj të zbatimit, por ju mund të shikoni shembullin ose të lini një koment.

Shtoni shembullin në një IDE që funksionon me: Skedar -> E Re -> Shembull -> Shembuj të Yartave të Tabelave të Shtetit -> Tjetër -> Arduino -Orë Dixhitale (C ++)

> IDE -në mund ta shkarkoni këtu <<

Mund të filloni me një provë 30 -ditore. Më pas, duhet të merrni një licencë, e cila është falas për përdorim jo-komercial!