Taula de continguts:

Rellotge digital a Arduino amb una màquina d'estats finits: 6 passos
Rellotge digital a Arduino amb una màquina d'estats finits: 6 passos

Vídeo: Rellotge digital a Arduino amb una màquina d'estats finits: 6 passos

Vídeo: Rellotge digital a Arduino amb una màquina d'estats finits: 6 passos
Vídeo: Octopus Max EZ v1.0 - Klipper MainSail Quick Install 2024, De novembre
Anonim
Rellotge digital a Arduino amb una màquina d’estats finits
Rellotge digital a Arduino amb una màquina d’estats finits

Hola, us mostraré com es pot crear un rellotge digital amb YAKINDU Statechart Tools i funcionar en un Arduino, que utilitza un teclat LCD.

El model original del rellotge digital va ser pres de David Harel. Ha publicat un article sobre el

"[…] àmplia extensió del formalisme convencional de màquines d'estats i diagrames d'estats".

En aquest article, va utilitzar l’exemple del rellotge digital per a la seva investigació. L’he utilitzat com a inspiració i he reconstruït el rellotge amb YAKINDU Statechart Tools (una eina per crear models gràfics de màquines d’estats i generar codi C / C ++ amb ell) i el vaig tornar a donar vida a un Arduino.

Subministraments

Maquinari:

  • Arduino Uno o Mega
  • Escut del teclat LCD

Programari:

  • Eines de gràfics d'estat de YAKINDU
  • IDE Eclipse C ++ per a Arduino

Pas 1: Com funciona el rellotge digital

Image
Image

Comencem per definir com ha de funcionar el rellotge digital. Recordeu aquests … diguem que … rellotges digitals "ultra genials" que tothom tenia als anys 90? Un cronòmetre integrat, diferents alarmes i el seu molest pit cada hora completa. Si no, feu un cop d'ull: el rellotge digital dels anys 90.

Per tant, bàsicament és un rellotge configurable amb diferents modes. Principalment es mostrarà l’hora actual, però hi ha algunes altres funcions. Com a entrada, teniu activat / desactivat, un mode i un botó de configuració. A més, podeu encendre i apagar el llum. Amb el botó de mode es pot distingir entre els modes i activar / desactivar les funcions del rellotge:

  • Mostra l'hora (rellotge)
  • Mostra la data (Data)
  • Estableix l'alarma (alarma 1, alarma 2)
  • Activa / desactiva el timbre (Set Chime)
  • Utilitzeu el cronòmetre (cronòmetre)

Dins dels menús, podeu utilitzar el botó d’encesa / apagada per configurar el mode. El botó de configuració us permet configurar l’hora, p. Ex. per al rellotge o les alarmes. Es pot controlar el cronòmetre (engegat i aturat) mitjançant el botó d’encesa i apagada. També podeu utilitzar un comptador de voltes integrat

A més, hi ha un campanar, que toca cada hora completa, i una llum de fons controlable integrada. Al primer pas, no els vaig connectar a l'Arduino.

Pas 2: la màquina d’estat

Escut del teclat LCD
Escut del teclat LCD

No vull aprofundir en l'explicació d'aquest exemple. No és perquè sigui massa complex, sinó una mica massa gran. Intentaré explicar la idea bàsica de com funciona. L’execució s’ha d’explicar per si mateix, mirant el model o descarregant-lo i simulant-lo. Algunes parts de la màquina d'estats es resumeixen en subregions, com la regió horària establerta. Amb això, s'hauria d'assegurar la llegibilitat de la màquina estatal.

El model es divideix en dues parts: una gràfica i una textual. A la part textual es definiran els esdeveniments, variables, etc. A la part gràfica, el diagrama d'estats, s'especifica l'execució lògica del model. Per crear una màquina d'estats que compleixi el comportament especificat, calen alguns esdeveniments d'entrada, que es poden utilitzar al model: onoff, set, mode, light i light_r. Dins de la secció de definició s’utilitza un esdeveniment intern que incrementa el valor de temps cada 100 ms:

cada 100 ms / temps + = 1

Basant-se en els passos de 100 ms, l'hora actual es calcularà en el format HH: MM: SS:

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

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

Els valors es connectaran a la pantalla LCD mitjançant l'operació updateLCD cada vegada que es cridi a la màquina d'estats:

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

L'execució bàsica de la màquina d'estats ja està definida a la secció Com funciona el rellotge digital. Dins de l'eina he utilitzat alguns elements de modelatge "especials" com CompositeState, History, Sub-Diagrams, ExitNodes, etc. Es pot trobar una descripció detallada a la Guia de l'usuari.

Pas 3: Escut del teclat LCD

L'escut del teclat LCD és bastant interessant per a projectes senzills, que requereixen una pantalla per a la visualització i alguns botons com a entrada: una HMI (interfície màquina-màquina) típica i senzilla. L'escut del teclat LCD conté cinc botons d'usuari i un altre per restablir-los. Els cinc botons junts estan connectats al pin A0 de l'Arduino. Cadascun d’ells està connectat a un divisor de tensió, que permet distingir entre els botons.

Podeu utilitzar analogRead (0) per trobar els valors específics, que, per descomptat, poden diferir pel fabricant. Aquest senzill projecte mostra el valor actual a la pantalla LCD:

#include "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 ("Valor mesurat"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); retard (200); }

Aquests són els meus resultats mesurats:

  • Cap: 1023
  • Seleccioneu: 640
  • Esquerra: 411
  • Baix: 257
  • Pujar: 100
  • Dreta: 0

Amb aquests llindars és possible llegir els botons:

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

Pas 4: Interfície de la màquina d'estats

Interfície de la màquina estatal
Interfície de la màquina estatal

El codi C ++ generat de la màquina d’estats proporciona interfícies, que s’han d’implementar per controlar la màquina d’estats. El primer pas és connectar els esdeveniments amb les tecles de l’escut del teclat. Ja he mostrat com es llegeixen els botons, però per a la seva interfície amb la màquina d’estats és necessari rebutjar els botons; en cas contrari, els esdeveniments es generarien diverses vegades, cosa que comporta un comportament imprevisible. El concepte de denúncia de programari no és nou. Podeu fer un cop d'ull a la documentació d'Arduino.

A la meva implementació, detecto una caiguda (deixant anar el botó). He llegit el valor del botó, espero 80 ms (he obtingut millors resultats amb 80 en lloc de 50), deso el resultat i llegeixo el valor nou. Si el resultat anterior no era NINGUNA (sense prémer) i el nou resultat és NINGÚ, ho sé, que el botó s'ha premut abans i ara s'ha alliberat. Després, plantejo l'esdeveniment d'entrada segons la màquina d'estats.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); retard (80); oldState = botóPrimit; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button () -> raise_mode (); trencar; } cas ESQUERRA: {stateMachine-> getSCI_Button () -> raise_set (); trencar; } cas avall: {stateMachine-> getSCI_Button () -> raise_light (); trencar; } majúscules i minúscules: {stateMachine-> getSCI_Button () -> raise_light_r (); trencar; } cas DRET: {stateMachine-> getSCI_Button () -> raise_onoff (); trencar; } per defecte: {break; }}}}

Pas 5: connectar les coses juntes

El programa principal utilitza tres parts:

  • La màquina estatal
  • Un temporitzador
  • Un controlador de pantalla (típic lcd.print (…))

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

La màquina d’estats utilitza un controlador de pantalla i té un temporitzador que s’actualitzarà per controlar els esdeveniments temporitzats. Després, la màquina d'estats s'inicialitza i s'introdueix.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }El bucle fa tres coses:

  • Augmenteu els esdeveniments d’entrada
  • Calculeu el temps transcorregut i actualitzeu el temporitzador
  • Truqueu a la màquina estatal

long_temps_current = 0; long_time_cycle_time = 0; bucle buit () {raiseEvents (); last_cycle_time = hora_actual; hora_actual = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Pas 6: obteniu l'exemple

Això és. Probablement no he esmentat tots els detalls de la implementació, però podeu fer una ullada a l’exemple o deixar un comentari.

Afegiu l'exemple a un IDE en execució amb: Fitxer -> Nou -> Exemple -> Exemples de gràfics d'estat de YAKINDU -> Següent -> Arduino - Rellotge digital (C ++)

> Podeu descarregar l'IDE aquí <<

Podeu començar amb una prova de 30 dies. Després, heu d'obtenir una llicència, que és gratuïta per a usos no comercials.

Recomanat: