Taula de continguts:
- Subministraments
- Pas 1: Com funciona el rellotge digital
- Pas 2: la màquina d’estat
- Pas 3: Escut del teclat LCD
- Pas 4: Interfície de la màquina d'estats
- Pas 5: connectar les coses juntes
- Pas 6: obteniu l'exemple
Vídeo: Rellotge digital a Arduino amb una màquina d'estats finits: 6 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:13
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
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
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
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:
Regions dels Estats Units Makey Makey Joc: 5 passos
Regions dels Estats Units Makey Makey Joc: en aquest instructiu els estudiants construiran un joc per reforçar el seu coneixement de les 5 regions dels Estats Units i el seu coneixement de circuits, mitjançant estratègies de col·laboració grupal. Els estudiants de 5è de primària de Virginia Occidental estudien la regió
Com fer un rellotge analògic i un rellotge digital amb tira LED mitjançant Arduino: 3 passos
Com es fabrica un rellotge analògic i un rellotge digital amb tira LED mitjançant Arduino: avui fabricarem un rellotge analògic i un amp; Rellotge digital amb Led Strip i mòdul MAX7219 Dot amb Arduino. Corregirà l’hora amb la zona horària local. El rellotge analògic pot utilitzar una tira LED més llarga, de manera que es pot penjar a la paret per convertir-se en un artista
Màquina d'estats finits en un MSP430: 6 passos
Finite State Machine en un MSP430: us mostraré com programar un Launchpad MSP430G2 amb màquines d’estats finits (FSM) mitjançant les eines YAKINDU Statechart Tools directament a Texas Instruments Code Composer Studio. Aquest tutorial conté sis passos: Instal·lació de YAKINDU Statechart Tools com a
Fer un rellotge amb M5stick C mitjançant Arduino IDE - Rellotge RTC en temps real amb M5stack M5stick-C: 4 passos
Fer un rellotge amb M5stick C mitjançant Arduino IDE | Rellotge en temps real RTC amb M5stack M5stick-C: Hola, nois en aquest instructable, aprendrem a fer un rellotge amb la placa de desenvolupament m5stick-C de m5stack mitjançant Arduino IDE. Així, m5stick mostrarà data, hora i amp; setmana del mes a la pantalla
Projecte de registre d’estats de la porta i la temperatura: 21 passos
Projecte de registre d’estats de la porta i la temperatura: aquest manual d’instruccions us mostrarà com fer un registre de l’estat de la porta i la temperatura per menys de 10,00 $ usant un ESP8266 NodeMCU, un sensor de temperatura i humitat DHT11, un interruptor reed de porta / finestra, una resistència de 10K ohm filferro de connexió. El gen