Relógio Digital com Arduino usando Máquina de Estados Finitos (YAKINDU)
Componentes e Materiais
| Componente | Qtd | Nota |
|---|---|---|
| Arduino UNO (ou Mega) | 1 | Compatível com LCD Keypad Shield |
| LCD Keypad Shield | 1 | 5 botões + reset |
Aplicativos e Serviços
- YAKINDU Statechart Tools (gratuito para uso não comercial)
- Eclipse C++ IDE for Arduino
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:
- Hora (Clock)
- Data (Date)
- Alarme 1 / Alarme 2
- Ativar/desativar sinal sonoro (Chime)
- Cronômetro (Stop Watch)
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):
- Nenhum: 1023
- Select: 640
- Left: 411
- Down: 257
- Up: 100
- Right: 0
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
- Projetando Máquinas de Estados Finitos: Do Conceito à Implementação
- Crie um Sistema Ambilight Impressionante para Monitor com Arduino
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
- Servidor Web Arduino Uno WiFi: Controle LED via Navegador
- Construa Seu Próprio Tamagotchi com Arduino: Projeto DIY de Pet Digital
- Smartwatch Arduino DIY: Construa Seu Próprio Relógio Estilo Apple Watch
- Automatize o Jogo do Dinossauro do Chrome com Arduino e LDR