Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Relógio Digital com Arduino usando Máquina de Estados Finitos (YAKINDU)

Componentes e Materiais

ComponenteQtdNota
Arduino UNO (ou Mega)1Compatível com LCD Keypad Shield
LCD Keypad Shield15 botões + reset

Aplicativos e Serviços

Sobre o Projeto

Mostro como criar um relógio digital com YAKINDU Statechart Tools (modelagem gráfica de máquinas de estados + geração de código C/C++) e rodar em Arduino com LCD Keypad Shield.

Modelo original de David Harel (artigo sobre extensão de máquinas de estados). Reimplementei com YAKINDU e trouxe à vida no Arduino.

Funcionamento do Relógio

Lembra dos relógios digitais dos anos 90? Cronômetro, alarmes, beep hora cheia. Entradas: on/off, mode, set, light on/off.

Botão mode alterna modos:

Dentro dos menus: on/off configura, set ajusta hora. Cronômetro controlado por light on/off (iniciar/parar) com volta (lap). Backlight e chime (beep hora cheia) integrados (não ligados fisicamente no protótipo).

A Máquina de Estados

Modelo gráfico (imagens no original) dividido em regiões: principal, stopwatch, set_time, chime, light. Uso de CompositeState, History, Sub-Diagrams, Exit Nodes.

Definição textual: eventos (onoff, set, mode, light, light_r), variáveis, evento interno a cada 100 ms:

every 100 ms / time += 1

Cálculo do tempo (HH:MM:SS):

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

Atualização do LCD via operação updateLCD(first, second, third, text) a cada ciclo.

LCD Keypad Shield

5 botões no pino A0 via divisor de tensão. Valores lidos (podem variar):

Leitura com debounce (detecção de falling edge após 80 ms):


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

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;
    }
  }
}

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;
}

Interface com a Máquina de Estados

Código principal usa 3 partes: State Machine, Timer, Display Handler.


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();
}

Obtenha o Exemplo

Na IDE YAKINDU: File → New → Example → YAKINDU Statechart Examples → Next → Arduino - Digital Watch (C++).

Download da IDE: trial 30 dias, depois licença gratuita para não comercial.

Processo de manufatura

  1. Projetando Máquinas de Estados Finitos: Do Conceito à Implementação
  2. Crie um Sistema Ambilight Impressionante para Monitor com Arduino
  3. Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
  4. Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
  5. Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
  6. Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
  7. Servidor Web Arduino Uno WiFi: Controle LED via Navegador
  8. Construa Seu Próprio Tamagotchi com Arduino: Projeto DIY de Pet Digital
  9. Smartwatch Arduino DIY: Construa Seu Próprio Relógio Estilo Apple Watch
  10. Automatize o Jogo do Dinossauro do Chrome com Arduino e LDR