Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Reloj digital en Arduino usando una máquina de estados finitos

Componentes y suministros

Arduino UNO
Puedes usar todos los Arduino, que son compatibles con LCD Shield. He usado Arduino Mega.
× 1
Pantalla de teclado LCD
× 1

Aplicaciones y servicios en línea

YAKINDU Statechart Tools
Gratis para uso no comercial.
Eclipse C ++ IDE para Arduino

Acerca de este proyecto

Hola,

Les mostraré cómo se puede crear un reloj digital con YAKINDU Statechart Tools y ejecutarlo en un Arduino, que usa un protector de teclado LCD.

El modelo original del reloj digital fue tomado de David Harel. Ha publicado un artículo sobre la "amplia extensión del formalismo convencional de máquinas de estados y diagramas de estados".

En este artículo utilizó el ejemplo del reloj digital para su investigación. Lo usé como inspiración y reconstruí el reloj con YAKINDU Statechart Tools (una herramienta para crear modelos gráficos de máquinas de estado y generar código C / C ++ con él) y lo devolví a la vida en un Arduino.

Cómo funciona el reloj digital

Comencemos por definir cómo debería funcionar el reloj digital. ¿Recuerdas estos ... digamos ... relojes digitales "ultra geniales" que todos tenían en los años 90? Un cronómetro integrado, diferentes alarmas y su molesto pitido cada hora. Si no es así, eche un vistazo:reloj digital de los 90.

Entonces, básicamente, es un reloj configurable con diferentes modos. Principalmente, se mostrará la hora actual, pero hay algunas otras características. Como entrada tiene un encendido / apagado , un modo y un conjunto botón. Además, puede encender y apagar la luz.

Con el modo botón puede distinguir entre los modos y activar / desactivar las funciones del reloj:

  • Mostrar la hora (reloj)
  • Mostrar la fecha (fecha)
  • Configure la alarma (Alarma 1, Alarma 2)
  • Habilitar / deshabilitar el timbre (Establecer timbre)
  • Utilice el cronómetro (cronómetro)

Dentro de los menús puede utilizar el activar / desactivar para configurar el modo. El conjunto El botón le permite configurar la hora, p. ej. para el reloj o las alarmas. El cronómetro se puede controlar, iniciar y detener, utilizando el botón de encendido y apagado de la luz. También puede utilizar un contador de vueltas integrado.

Además, hay un timbre, que suena cada vez más completo, y una retroiluminación controlable integrada. En el primer paso, no los conecté al Arduino.

La máquina de estados

No quiero profundizar mucho en la explicación de este ejemplo. No es porque sea demasiado complejo, es un poco demasiado grande. Intentaré explicar la idea básica de cómo funciona. La ejecución debe ser autoexplicativa, echando un vistazo al modelo o descargándolo y simulándolo. Algunas partes de la máquina de estado se resumen en subregiones, como el tiempo establecido región. Con esto se debe garantizar la legibilidad de la máquina de estados.

El modelo se divide en dos partes:una gráfica y otra textual. En la parte textual se definirán los eventos, variables, etc. En la parte gráfica - diagrama de estados - se especifica la ejecución lógica del modelo. Para crear una máquina de estado, que cumpla con el comportamiento especificado, se requieren algunos eventos de entrada, que se pueden usar en el modelo: onoff , establecer , modo , ligero y light_r. Dentro de la sección de definición se usa un evento interno, que incrementa el valor de tiempo cada 100 ms:

  cada 100 ms / tiempo + =1  

Según los pasos de 100 ms, la hora actual se calculará en HH:MM:SS formato:

  display.first =(time / 36000)% 24; 
display.second =(time / 600)% 60;
display.third =(time / 10)% 60;

Los valores se conectarán a la pantalla LCD mediante la operación updateLCD cada vez que se llame a la máquina de estado:

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

La ejecución básica de la máquina de estado ya está definida en el apartado Cómo funciona el reloj digital . Dentro de la herramienta he usado algunos elementos de modelado "especiales" como CompositeState , Historial , Subdiagramas , ExitNodes, etc. Se puede encontrar una descripción detallada en la Guía del usuario.

Protector de teclado LCD

El protector de teclado LCD es bastante bueno para proyectos simples, que requieren una pantalla para visualización y algunos botones como entrada, una HMI (interfaz hombre-máquina) típica y simple. El protector del teclado LCD contiene cinco botones de usuario y otro para reiniciar. Todos los cinco botones juntos están conectados al pin A0 del Arduino. Cada uno de ellos está conectado a un divisor de voltaje, lo que permite distinguir entre los botones.

Puede usar analogRead (0) para encontrar los valores específicos, que por supuesto pueden diferir según el fabricante. Este proyecto simple muestra el valor actual en la pantalla LCD:

  #include  
#include

LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

void setup () {
lcd.begin (16, 2);
lcd.setCursor (0,0);
lcd.write ("Valor medido");
}

bucle vacío () {
lcd.setCursor (0,1);
lcd.print ("");
lcd. setCursor (0,1);
lcd.print (analogRead (0));
delay (200);
}

Estos son mis resultados medidos:

  • Ninguno:1023
  • Seleccione:640
  • Izquierda:411
  • Abajo:257
  • Hasta:100
  • Derecha:0

Con estos umbrales es posible leer los botones:

  #define NONE 0 
#define SELECT 1
#define IZQUIERDA 2
#define DOWN 3
#define UP 4
#define RIGHT 5

static int readButton () {
int result =0;
result =analogRead (0);
if (result <50) {
return DERECHA;
}
if (result <150) {
return UP;
}
if (result <300) {
return DOWN;
}
if (result <550) {
return LEFT;
}
if (result <850) {
return SELECT;
}
return NONE;
}

Interfaz de la máquina de estados

El código C ++ generado de la máquina de estado proporciona interfaces, que deben implementarse para controlar la máquina de estado. El primer paso es conectar los eventos in con las teclas del Keypad Shield. Ya he mostrado cómo leer los botones, pero para conectarlos a la máquina de estado, es necesario eliminar los rebotes de los botones; de lo contrario, los eventos se generarían varias veces, lo que da como resultado un comportamiento impredecible. El concepto de eliminación de rebotes de software no es nuevo. Puedes echar un vistazo a la documentación de Arduino.

En mi implementación detecto un borde descendente (soltando el botón). Leo el valor del botón, espero 80 ms (obtuve mejores resultados con 80 en lugar de 50), guardo el resultado y leo el nuevo valor. Si el oldResult no era NINGUNO (sin presionar) y el nuevo resultado es NINGUNO Sé que el botón se presionó antes y ahora se soltó. Luego, levanto el evento de entrada correspondiente de la máquina de estado.

  int oldState =NONE; 
static void raiseEvents () {
int buttonPressed =readButton ();
delay (80);
oldState =buttonPressed;
if (oldState! =NONE &&readButton () ==NONE) {
switch (oldState) {
case SELECT:{
stateMachine-> getSCI_Button () -> raise_mode ();
romper;
}
caso IZQUIERDO:{
stateMachine-> getSCI_Button () -> raise_set ();
romper;
}
caso ABAJO:{
stateMachine-> getSCI_Button () -> raise_light ();
romper;
}
caso ARRIBA:{
stateMachine-> getSCI_Button () -> raise_light_r ();
break;
}
caso DERECHA:{
stateMachine-> getSCI_Button () -> raise_onoff ();
break;
}
predeterminado:{
break;
}
}
}
}

Conectando cosas juntas

El programa principal utiliza tres partes:

  • La máquina de estado
  • Un temporizador
  • Un controlador de pantalla (típico lcd.print (...))
  DigitalWatch * stateMachine =new DigitalWatch (); 
CPPTimerInterface * timer_sct =new CPPTimerInterface ();
DisplayHandler * displayHandler =new DisplayHandler ();

La máquina de estado usa un controlador de pantalla y tiene un temporizador, que se actualizará para controlar los eventos cronometrados. Posteriormente, la máquina de estado se inicializa y se ingresa.

  void setup () {
stateMachine-> setSCI_Display_OCB (displayHandler);
stateMachine-> setTimer (timer_sct);
stateMachine-> init ();
stateMachine-> enter ();
}

El ciclo hace tres cosas:

  • Generar eventos de entrada
  • Calcule el tiempo transcurrido y actualice el temporizador
  • Llame a la máquina de estado
  long current_time =0; 
long last_cycle_time =0;
void loop () {
raiseEvents ();
last_cycle_time =current_time;
current_time =millis ();
timer_sct-> updateActiveTimer (stateMachine,
current_time - last_cycle_time);
stateMachine-> runCycle ();
}

Obtenga el ejemplo

Eso es. Probablemente, no he mencionado todos los detalles de la implementación, pero puedes echar un vistazo al ejemplo o dejar un comentario.

Agregue el ejemplo a un IDE en ejecución con:

Archivo -> Nuevo -> Ejemplo -> Ejemplos de gráficos de estado de YAKINDU -> Siguiente -> Arduino - Reloj digital (C ++)

>> Puede descargar el IDE aquí <<

Puede comenzar con una prueba de 30 días. Posteriormente, debe obtener una licencia, que es gratuita para uso no comercial !


Proceso de manufactura

  1. Máquinas de estados finitos
  2. Hacer Monitor Ambilight usando Arduino
  3. Dados digitales Arduino
  4. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  5. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  6. Monitor de frecuencia cardíaca con IoT
  7. WebServerBlink usando Arduino Uno WiFi
  8. Clon Arduino Tamagotchi - Mascota digital
  9. Arduino Apple Watch
  10. Juego automatizado de Dino usando arduino
  11. Radio FM usando Arduino y RDA8057M