INHOUDSOPGAWE:

Digitale horlosie op Arduino met 'n eindige staatsmasjien: 6 stappe
Digitale horlosie op Arduino met 'n eindige staatsmasjien: 6 stappe

Video: Digitale horlosie op Arduino met 'n eindige staatsmasjien: 6 stappe

Video: Digitale horlosie op Arduino met 'n eindige staatsmasjien: 6 stappe
Video: Joscha Bach: tijd, simulatiehypothese, bestaan 2024, Julie
Anonim
Digitale horlosie op Arduino met 'n eindige staatsmasjien
Digitale horlosie op Arduino met 'n eindige staatsmasjien

Hallo, ek gaan jou wys hoe 'n digitale horlosie met YAKINDU Statechart Tools geskep kan word en op 'n Arduino gebruik kan word, wat 'n LCD -sleutelbordskerm gebruik.

Die oorspronklike model van die digitale horlosie is geneem van David Harel. Hy het 'n referaat gepubliseer oor die

"[…] 'n breë uitbreiding van die konvensionele formalisme van staatsmasjiene en staatsdiagramme."

In hierdie artikel gebruik hy die voorbeeld van die digitale horlosie vir sy navorsing. Ek het dit as 'n inspirasie gebruik en die horlosie herbou met YAKINDU Statechart Tools ('n hulpmiddel om grafiese modelle van staatsmasjiene te skep en C/C ++ kode daarmee te genereer) en dit weer lewendig te maak op 'n Arduino.

Voorrade

Hardeware:

  • Arduino Uno of Mega
  • LCD -sleutelbordskerm

Sagteware:

  • YAKINDU Statechart Tools
  • Eclipse C ++ IDE vir Arduino

Stap 1: Hoe werk die digitale horlosie

Image
Image

Kom ons begin deur te definieer hoe die digitale horlosie moet werk. Onthou jy hierdie … kom ons sê … 'ultra -cool' digitale horlosies wat almal in die 90's gehad het? 'N Geïntegreerde stophorlosie, verskillende alarms en die irriterende piep elke uur. As dit nie die geval is nie, kyk dan na die digitale horlosie van die 90's.

So basies is dit 'n konfigureerbare horlosie met verskillende maniere. Die huidige tyd sal hoofsaaklik vertoon word, maar daar is 'n paar ander funksies. As invoer het u 'n aan/af, 'n modus en 'n vaste knoppie. Boonop kan u die lig aan en af skakel. Met die modusknoppie kan u tussen die modi onderskei en die klokfunksies aktiveer/deaktiveer:

  • Wys die tyd (klok)
  • Gee die datum (datum)
  • Stel die alarm in (alarm 1, alarm 2)
  • Aktiveer/deaktiveer klokkie (stel klokkie)
  • Gebruik die stophorlosie (Stop Watch)

In die spyskaarte kan u die aan/uit -knoppie gebruik om die modus op te stel. Met die stelknoppie kan u die tyd instel - bv. vir die klok of die alarms. Die stophorlosie kan beheer word - begin en gestop word - deur die knoppie aan en af te skakel. U kan ook 'n geïntegreerde rondeteller gebruik

Verder is daar 'n klokkie wat elke volle uur lui en 'n beheerbare agtergrond geïntegreer. By die eerste stap het ek hulle nie na die Arduino gestuur nie.

Stap 2: Die staatsmasjien

LCD -sleutelbordskerm
LCD -sleutelbordskerm

Ek wil nie veel in detail gaan vir die verduideliking van hierdie voorbeeld nie. Dit is nie omdat dit te kompleks is nie, dit is net 'n bietjie te groot. Ek sal probeer om die basiese idee van hoe dit werk te verduidelik. Die uitvoering moet selfverduidelikend wees deur na die model te kyk of dit af te laai en na te boots. Sommige dele van die staatsmasjien word in substreke opgesom, soos die vasgestelde tydsgebied. Hiermee moet die leesbaarheid van die staatsmasjien verseker word.

Die model word in twee dele verdeel - 'n grafiese en 'n tekstuele. In die tekstuele gedeelte sal die gebeurtenisse, veranderlikes, ens. Gedefinieer word. In die grafiese deel - die toestanddiagram - word die logiese uitvoering van die model gespesifiseer. Om 'n staatsmasjien te skep wat aan die gespesifiseerde gedrag voldoen, is 'n paar invoergebeurtenisse nodig wat in die model gebruik kan word: aan, stel, modus, lig en lig_r. Binne die definisie -afdeling word 'n interne gebeurtenis gebruik, wat die tydwaarde elke 100 ms verhoog:

elke 100 ms / tyd += 1

Op grond van die stappe van 100 ms word die huidige tyd bereken in die formaat HH: MM: SS:

display.first = (tyd / 36000) % 24;

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

Die waardes word aan die LCD -skerm gekoppel deur die operasie updateLCD te gebruik elke keer as die staatsmasjien gebel word:

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

Die basiese uitvoering van die staatsmasjien is reeds omskryf in die afdeling Hoe die digitale horlosie werk. In die instrument het ek 'n paar 'spesiale' modelelemente gebruik, soos CompositeState, History, Sub-Diagrams, ExitNodes, ens. 'N Gedetailleerde beskrywing kan gevind word in die gebruikershandleiding.

Stap 3: LCD -sleutelbordskerm

Die LCD -sleutelbordskerm is baie goed vir eenvoudige projekte, wat 'n skerm benodig vir visualisering en 'n paar knoppies as invoer - 'n tipiese, eenvoudige HMI (Human Machine Interface). Die LCD -sleutelbordskerm bevat vyf gebruikersknoppies en nog een om terug te stel. Die vyf knoppies is saam gekoppel aan die A0 -pen van die Arduino. Elkeen is gekoppel aan 'n spanningsverdeler, wat die onderskeid tussen die knoppies moontlik maak.

U kan analogRead (0) gebruik om die spesifieke waardes te vind, wat natuurlik deur die vervaardiger kan verskil. Hierdie eenvoudige projek vertoon die huidige waarde op die LCD:

#sluit "Arduino.h" in

#sluit "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7) in; ongeldige opstelling () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("Meetwaarde"); } leemte lus () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); vertraging (200); }

Dit is my gemete resultate:

  • Geen: 1023
  • Kies: 640
  • Links: 411
  • Af: 257
  • Op: 100
  • Regs: 0

Met hierdie drempels is dit moontlik om die knoppies te lees:

#define NONE 0 #definieer SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define REGS 5 static int readButton () {int result = 0; resultaat = analogRead (0); if (resultaat <50) {retoer REGS; } if (resultaat <150) {return UP; } if (resultaat <300) {return DOWN; } if (resultaat <550) {return LEFT; } if (resultaat <850) {return SELECT; } gee GEEN terug nie; }

Stap 4: Koppel aan die staatsmasjien

Koppel aan die staatsmasjien
Koppel aan die staatsmasjien

Die gegenereerde C ++ - kode van die staatsmasjien bied koppelvlakke wat geïmplementeer moet word om die staatsmasjien te beheer. Die eerste stap is om die in -events te verbind met die sleutels van die Keypad Shield. Ek het al getoon hoe ek die knoppies moet lees, maar om die knoppies met die staatsmasjien te koppel, is dit nodig om die knoppies uit te skakel - anders word die gebeurtenisse verskeie kere verhoog, wat lei tot onvoorspelbare gedrag. Die konsep van sagteware -ontbinding is nie nuut nie. U kan na die Arduino -dokumentasie kyk.

In my implementering bespeur ek 'n afname (die knoppie los). Ek lees die waarde van die knoppie, wag vir 80 ms (kry beter resultate met 80 in plaas van 50), stoor die resultaat en lees die nuwe waarde. As die oldResult NONE (ongedruk) was nie en die nuwe resultaat NONE is, weet ek dat die knoppie al voorheen ingedruk is en nou vrygestel is. Dan verhoog ek die ooreenstemmende insetgebeurtenis van die staatsmasjien.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); vertraging (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); breek; } geval LINKS: {stateMachine-> getSCI_Button ()-> raise_set (); breek; } geval DOWN: {stateMachine-> getSCI_Button ()-> raise_light (); breek; } geval UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); breek; } saak REGS: {stateMachine-> getSCI_Button ()-> raise_onoff (); breek; } verstek: {break; }}}}

Stap 5: Verbind dinge saam

Die hoofprogram bevat drie dele:

  • Die staatsmasjien
  • 'N Timer
  • 'N Vertoonhanteerder (tipiese lcd.print (…))

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

Die staatsmasjien gebruik 'n vertoonhanteerder en kry 'n timer, wat bygewerk sal word om die tydgebeurtenisse te beheer. Daarna word die staatsmasjien geïnitialiseer en ingevoer.

ongeldige opstelling () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Die lus doen drie dinge:

  • Stel insetgebeurtenisse op
  • Bereken die verloopte tyd en werk die tydopnemer by
  • Bel die staatsmasjien

lang huidige tyd = 0; lang laaste_fiets tyd = 0; leemte -lus () {raiseEvents (); last_cycle_time = huidige_tyd; huidige tyd = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Stap 6: Kry die voorbeeld

Dis dit. Ek het waarskynlik nie elke detail van die implementering genoem nie, maar u kan na die voorbeeld kyk of 'n opmerking lewer.

Voeg die voorbeeld by 'n lopende IDE met: File -> New -> Voorbeeld -> YAKINDU Statechart Voorbeelde -> Volgende -> Arduino -Digital Watch (C ++)

> U kan die IDE hier aflaai <<

U kan begin met 'n proeftydperk van 30 dae. Daarna moet u 'n lisensie kry, wat gratis is vir nie-kommersiële gebruik!

Aanbeveel: