Satura rādītājs:

Digitālais pulkstenis Arduino, izmantojot ierobežota stāvokļa mašīnu: 6 soļi
Digitālais pulkstenis Arduino, izmantojot ierobežota stāvokļa mašīnu: 6 soļi

Video: Digitālais pulkstenis Arduino, izmantojot ierobežota stāvokļa mašīnu: 6 soļi

Video: Digitālais pulkstenis Arduino, izmantojot ierobežota stāvokļa mašīnu: 6 soļi
Video: Простые цифровые часы с использованием Arduino, код часов Arduino, часть 1 2024, Novembris
Anonim
Digitālais pulkstenis Arduino, izmantojot ierobežotu stāvokli
Digitālais pulkstenis Arduino, izmantojot ierobežotu stāvokli

Sveiki, es jums parādīšu, kā digitālo pulksteni var izveidot, izmantojot YAKINDU Statechart Tools un darboties ar Arduino, kas izmanto LCD tastatūras vairogu.

Digitālā pulksteņa oriģinālais modelis tika ņemts no Deivida Harela. Viņš ir publicējis rakstu par

"[…] Valsts iekārtu un stāvokļa diagrammu tradicionālā formālisma plašs paplašinājums."

Šajā rakstā viņš pētījumiem izmantoja digitālā pulksteņa piemēru. Esmu to izmantojis kā iedvesmu un pārbūvējis pulksteni, izmantojot YAKINDU Statechart Tools (rīku valsts iekārtu grafisko modeļu izveidei un C/C ++ koda ģenerēšanai), un atdzīvinājis to Arduino.

Piegādes

Aparatūra:

  • Arduino Uno vai Mega
  • LCD tastatūras vairogs

Programmatūra:

  • YAKINDU stāvokļa diagrammas rīki
  • Eclipse C ++ IDE Arduino

1. darbība. Kā darbojas digitālais pulkstenis

Image
Image

Sāksim, nosakot, kā digitālajam pulkstenim vajadzētu darboties. Vai atceraties šos … pieņemsim … "īpaši foršos" digitālos pulksteņus, kas visiem bija 90. gados? Integrēts hronometrs, dažādi trauksmes signāli un tā kaitinošais pīkstiens katru pilnu stundu. Ja nē, ieskatieties: 90. gadu digitālais pulkstenis.

Tātad būtībā tas ir konfigurējams pulkstenis ar dažādiem režīmiem. Galvenokārt tiks parādīts pašreizējais laiks, taču ir dažas citas funkcijas. Kā ievade jums ir ieslēgšana/izslēgšana, režīms un iestatīšanas poga. Turklāt jūs varat ieslēgt un izslēgt gaismu. Ar režīma pogu jūs varat atšķirt režīmus un aktivizēt/atspējot pulksteņa funkcijas:

  • Rādīt laiku (pulkstenis)
  • Parādīt datumu (datums)
  • Modinātāja iestatīšana (1. modinātājs, 2. modinātājs)
  • Iespējot/atspējot signālu (iestatīt zvanu)
  • Hronometra izmantošana (hronometrs)

Izvēlnēs varat izmantot ieslēgšanas/izslēgšanas pogu, lai konfigurētu režīmu. Iestatīšanas poga ļauj iestatīt laiku - piem. pulkstenim vai modinātājiem. Hronometru var kontrolēt - iedarbināt un apturēt -, izmantojot gaismas ieslēgšanas un izslēgšanas pogu. Varat arī izmantot integrētu klēpja skaitītāju

Turklāt ir zvana signāls, kas zvana katru pilnu stundu, un integrēts kontrolējams apgaismojums. Pirmajā solī es tos nepārvadāju ar Arduino.

2. solis: valsts mašīna

LCD tastatūras vairogs
LCD tastatūras vairogs

Es nevēlos sīkāk iedziļināties šī piemēra skaidrojumā. Tas nav tāpēc, ka tas ir pārāk sarežģīts, tas ir tikai nedaudz par lielu. Es mēģināšu izskaidrot pamatideju, kā tā darbojas. Izpildei vajadzētu būt pašsaprotamai, apskatot modeli vai lejupielādējot un simulējot to. Dažas valsts iekārtas daļas ir apkopotas apakšreģionos, piemēram, iestatītais laika reģions. Tādējādi būtu jānodrošina valsts iekārtas lasāmība.

Modelis ir sadalīts divās daļās - grafiskā un teksta. Tekstuālajā daļā tiks definēti notikumi, mainīgie utt. Grafiskajā daļā - stāvokļa diagrammā - ir norādīta modeļa loģiskā izpilde. Lai izveidotu stāvokļa mašīnu, kas atbilst norādītajai uzvedībai, ir nepieciešami daži ievades notikumi, kurus var izmantot modelī: ieslēgts, iestatīts, režīms, gaisma un gaisma_r. Definīcijas sadaļā tiek izmantots iekšējs notikums, kas palielina laika vērtību ik pēc 100 ms:

ik pēc 100 ms / reizi += 1

Pamatojoties uz 100 ms soļiem, pašreizējais laiks tiks aprēķināts formātā HH: MM: SS:

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

display.second = (laiks / 600) % 60; displejs.trešais = (laiks / 10) % 60;

Vērtības tiks pieslēgtas LCD displejam, izmantojot darbību updateLCD katru reizi, kad tiks izsaukta valsts iekārta:

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

Stāvokļa pamata izpilde jau ir definēta sadaļā Kā darbojas digitālais pulkstenis. Rīka ietvaros esmu izmantojis dažus "īpašus" modelēšanas elementus, piemēram, CompositeState, Vēsture, Apakšdiagrammas, ExitNodes utt. Detalizētu aprakstu var atrast Lietotāja rokasgrāmatā.

3. darbība: LCD tastatūras vairogs

LCD tastatūras vairogs ir diezgan foršs vienkāršiem projektiem, kuru vizualizācijai ir nepieciešams ekrāns un dažas pogas kā ieeja - tipisks, vienkāršs HMI (cilvēka un mašīnas saskarne). LCD tastatūras ekrānā ir piecas lietotāja pogas un vēl viena atiestatīšanas poga. Visas piecas pogas ir savienotas ar Arduino A0 tapu. Katrs no tiem ir savienots ar sprieguma dalītāju, kas ļauj atšķirt pogas.

Varat izmantot analogRead (0), lai atrastu konkrētās vērtības, kuras, protams, var atšķirties atkarībā no ražotāja. Šis vienkāršais projekts LCD parāda pašreizējo vērtību:

#ietver "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 ("Izmērītā vērtība"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); kavēšanās (200); }

Šie ir mani izmērītie rezultāti:

  • Nav: 1023
  • Izvēlieties: 640
  • Pa kreisi: 411
  • Uz leju: 257
  • Uz augšu: 100
  • Pareizi: 0

Izmantojot šos sliekšņus, ir iespējams izlasīt pogas:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; rezultāts = analogRead (0); ja (rezultāts <50) {return RIGHT; } ja (rezultāts <150) {return UP; } ja (rezultāts <300) {return DOWN; } ja (rezultāts <550) {return LEFT; } ja (rezultāts <850) {return SELECT; } atgriezt NAV; }

4. darbība: saskarne ar valsts iekārtu

Saskarne ar valsts mašīnu
Saskarne ar valsts mašīnu

Ģenerētais valsts mašīnas C ++ kods nodrošina saskarnes, kas jāievieš, lai kontrolētu stāvokļa mašīnu. Pirmais solis ir savienot notikumus ar tastatūras vairoga taustiņiem. Es jau esmu parādījis, kā lasīt pogas, taču, lai tās savienotu ar valsts iekārtu, ir jāatvieno pogas - pretējā gadījumā notikumi tiks pacelti vairākas reizes, kā rezultātā rodas neparedzama uzvedība. Programmatūras atcelšanas jēdziens nav jauns. Jūs varat apskatīt Arduino dokumentāciju.

Īstenojot, es atklāju krītošu malu (atlaižot pogu). Es izlasīju pogas vērtību, gaidu 80 ms (ieguvu labākus rezultātus ar 80, nevis 50), saglabāju rezultātu un izlasīju jauno vērtību. Ja oldResult nebija NONE (nenospiests) un jaunais rezultāts NONE, es zinu, ka poga ir bijusi nospiesta iepriekš un tagad ir atbrīvota. Tad es paaugstinu atbilstošo valsts iekārtas ievades notikumu.

int oldState = NAV; static void raiseEvents () {int buttonPressed = readButton (); kavēšanās (80); oldState = pogaNospiests; if (oldState! = NONE && read read Button () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); pārtraukums; } gadījums LEFT: {stateMachine-> getSCI_Button ()-> raise_set (); pārtraukums; } gadījums LEJU: {stateMachine-> getSCI_Button ()-> raise_light (); pārtraukums; } gadījums uz augšu: {stateMachine-> getSCI_Button ()-> raise_light_r (); pārtraukums; } gadījums PAREIZI: {stateMachine-> getSCI_Button ()-> raise_onoff (); pārtraukums; } noklusējums: {break; }}}}

5. solis: lietu savienošana kopā

Galvenā programma sastāv no trim daļām:

  • Valsts mašīna
  • Taimeris
  • Displeja apstrādātājs (tipisks lcd.print (…))

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

Stāvokļa mašīna izmanto displeja apstrādātāju un ieguva taimeri, kas tiks atjaunināts, lai kontrolētu notikumus ar laiku. Pēc tam valsts iekārta tiek inicializēta un ievadīta.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Cilpa veic trīs lietas:

  • Palieliniet ievades notikumus
  • Aprēķiniet pagājušo laiku un atjauniniet taimeri
  • Zvaniet valsts mašīnai

garš pašreizējais_laiks = 0; ilgs pēdējais_cikla_laiks = 0; void loop () {raiseEvents (); last_cycle_time = pašreizējais_laiks; pašreizējais_laiks = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

6. darbība: iegūstiet piemēru

Tieši tā. Iespējams, es neesmu pieminējis katru ieviešanas detaļu, bet jūs varat apskatīt piemēru vai atstāt komentāru.

Pievienojiet piemēru darbojošam IDE, izmantojot: Fails -> Jauns -> Piemērs -> YAKINDU valsts diagrammas piemēri -> Tālāk -> Arduino -digitālais pulkstenis (C ++)

> IDE varat lejupielādēt šeit <<

Jūs varat sākt ar 30 dienu izmēģinājumu. Pēc tam jums ir jāsaņem licence, kas ir bezmaksas nekomerciālai lietošanai!

Ieteicams: