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

Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos

Componentes y suministros

Arduino UNO (o compatible con LCD Shield, ej. Mega) 1
LCD Keypad Shield 1

Aplicaciones y servicios online

Acerca del proyecto

Hola, voy a mostrar cómo crear un reloj digital con YAKINDU Statechart Tools y ejecutarlo en Arduino con un LCD Keypad Shield.

El modelo original del reloj digital fue tomado de David Harel, quien publicó un artículo sobre la "ampliación del formalismo convencional de máquinas de estados y diagramas de estados". Usó el reloj digital como ejemplo. Lo he reconstruido con YAKINDU (herramienta para modelos gráficos de máquinas de estados y generación de código C/C++) y lo he llevado a Arduino.

Cómo funciona el reloj digital

¿Recuerdas esos relojes digitales "ultra guays" de los 90? Cronómetro, alarmas, pitido cada hora. Si no, busca "90's digital watch".

Básicamente es un reloj configurable con varios modos. Entradas: botones on/off, mode, set, más encendido/apagado de luz.

Con mode cambias entre modos y activas/desactivas funciones:

Dentro de los menús, on/off configura el modo. set ajusta la hora (reloj o alarmas). El cronómetro se controla con los botones de luz (inicio/parada) y tiene vuelta (lap). También hay chime (pitido cada hora) y luz de fondo controlable (no cableados en la primera versión).

La máquina de estados

Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos

El modelo es grande; resumo la idea básica. La ejecución se entiende viendo el modelo o simulándolo. Partes se resumen en subregiones (ej. set time) para legibilidad.

El modelo tiene parte textual (eventos, variables) y gráfica (diagrama de estados). Se definen eventos de entrada: onoff, set, mode, light, light_r. Un evento interno incrementa el tiempo cada 100 ms:

every 100 ms / time += 1

Con pasos de 100 ms se calcula hora en formato HH:MM:SS:

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

Los valores se envían a la LCD con la operación updateLCD cada ciclo.

LCD Keypad Shield

El shield tiene 5 botones de usuario + reset. Los 5 botones comparten pin A0 mediante divisor de tensión. analogRead(0) da valores distintos por botón (varían según fabricante). Ejemplo para leer valores:

#include 
#include 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() { lcd.begin(16,2); lcd.setCursor(0,0); lcd.write("Measured Value"); }
void loop() { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(analogRead(0)); delay(200); }

Mis valores medidos:

Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos

Con esos umbrales se leen los botones:


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

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

Interfaz con la máquina de estados

El código C++ generado provee interfaces a implementar. Primero, conectar eventos de entrada con botones del shield. Es necesario antirrebote (debounce) para evitar eventos múltiples. Uso flanco descendente (soltar botón): leo valor, espero 80 ms, guardo, leo de nuevo. Si oldResult no era NONE y el nuevo es NONE, el botón se pulsó y soltó; lanzo el evento correspondiente.


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(); break;
      case LEFT: stateMachine->getSCI_Button()->raise_set(); break;
      case DOWN: stateMachine->getSCI_Button()->raise_light(); break;
      case UP: stateMachine->getSCI_Button()->raise_light_r(); break;
      case RIGHT: stateMachine->getSCI_Button()->raise_onoff(); break;
    }
  }
}

Uniendo todo

El programa principal usa tres partes: Máquina de Estados, Temporizador, Manejador de Pantalla.


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

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

long current_time = 0, 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();
}

Obtén el ejemplo

Probablemente no he mencionado todos los detalles, pero puedes ver el ejemplo completo o dejar comentario.

Añade el ejemplo a un IDE en marcha: File → New → Example → YAKINDU Statechart Examples → Next → Arduino - Digital Watch (C++)

> Descarga el IDE aquí <
Prueba 30 días. Después necesitas licencia, gratis para uso no comercial.

Proceso de manufactura

  1. Crea un Impresionante Sistema Ambilight para Monitor con Arduino
  2. Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
  3. Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
  4. Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
  5. Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
  6. Servidor Web Arduino Uno WiFi: Controla un LED desde el Navegador
  7. Construye tu Propio Tamagotchi con Arduino: Mascota Digital DIY
  8. Smartwatch Arduino DIY: Construye tu Propio Reloj Estilo Apple Watch
  9. Automatiza el Juego del Dinosaurio de Chrome con Arduino y Python
  10. Construye una Radio FM Compacta con Arduino Nano y RDA5807M
  11. Diseñando Máquinas de Estados Finitos: De Concepto a Implementación