Relógio Flip Arduino com Matriz LED 8×8 – Projeto DIY de Relógio em Tempo Real
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino Nano R3 | 1 |
| Maxim Integrated DS3231M – RTC I2C (±5ppm) | 1 |
| Matriz LED 8×8 com driver MAX7219 | 1 |
| LED RGB Difuso Cátodo Comum | 1 |
| Resistor 220 Ω | 2 |
| Encoder Rotativo com Botão | 1 |
Ferramentas Necessárias
- Ferro de solda (genérico)
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Este relógio com matriz LED 8×8 foi desenvolvido por Adrian Jones. O horário é exibido por rolagem da esquerda para a direita ou, sob controle de software, de cima para baixo. Cada dígito desliza da direita, para momentaneamente quando centralizado e brilha levemente, depois rola para a esquerda enquanto o próximo dígito entra. O ciclo repete com um breve atraso.
Para inverter a rolagem (topo para base), altere no código:
static boolean top2bottom = false;
para:
static boolean top2bottom = true;
Conforme comentários no código, diversos parâmetros podem ser ajustados: velocidade de rolagem, linhas em branco entre caracteres, exibição 12/24 horas, intervalo entre caracteres, brilho, etc.
O ajuste de hora é feito facilmente via encoder rotativo. Um LED de duas cores indica o modo de ajuste (minutos, horas ou normal). O relógio foi acomodado em uma caixa de duas peças, facilitando o acesso interno.

Código
Código Principal (Arduino)
//*****************************************************************************************//
// MATRIX CLOCK
// Adrian Jones, March 2014
// - permite rolagem esquerda-direita e topo-base
//*****************************************************************************************//
#include <Wire.h>
#include <RTClib.h>
// Registros e pinos do MAX7219
#define max7219_reg_noop 0x00
#define max7219_reg_digit0 0x01
... // (demais defines)
#define dataIn 12 // DIN
#define load 10 // CS
#define clock 11 // CLK
char alphanum[][8] = { ... }; // tabela de caracteres 8x8
// RTC
RTC_DS1307 RTC;
// Encoder, botão e LEDs
#define enc_PinA 2
#define enc_PinB 4
#define enc_Switch 3
#define mode_Pin 8
#define min_Pin 9
// Variáveis de controle
unsigned char enc_A, enc_B, enc_A_prev=0;
static boolean rotating = false;
static boolean clockwise = false;
static boolean updateFlag= false;
static int mode = 0; // 0=nada, 1=ajuste hora, 2=ajuste min
// Strings de exibição
#define max_array_size 100
char ac[max_array_size] = {};
byte rc[8] = {};
String display_message = "";
int arraylen;
// Parâmetros operacionais
#define delay_line 75
#define delay_char 400
#define delay_mess 500
#define cblanks 1
#define eblanks 0
// Recursos de exibição
static boolean top2bottom = false;
static boolean hour24 = false;
static boolean charHI = true;
static boolean doSerial = true;
//*****************************************************************************************//
// Setup Inicial
//*****************************************************************************************//
void setup () {
Wire.begin();
Serial.begin(57600);
if(doSerial) Serial.print("MATRIX Clock - Adrian Jones, Mar. 2014");
pinMode(dataIn, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(load, OUTPUT);
initMatrix();
pinMode(mode_Pin, OUTPUT); digitalWrite(mode_Pin, 1);
pinMode(min_Pin, OUTPUT); digitalWrite(min_Pin, 1);
pinMode(enc_PinA, INPUT_PULLUP); digitalWrite(enc_PinA, HIGH);
pinMode(enc_PinB, INPUT_PULLUP); digitalWrite(enc_PinB, HIGH);
pinMode(enc_Switch, INPUT_PULLUP); digitalWrite(enc_Switch, HIGH);
attachInterrupt(0, rotEncoder, CHANGE);
attachInterrupt(1, swEncoder, CHANGE);
RTC.begin();
if (! RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
if(doSerial) Serial.println(" (RTC reset)");
} else {
if(doSerial) Serial.println(" (RTC running)");
}
}
//*****************************************************************************************//
// Loop Principal
//*****************************************************************************************//
void loop () {
DateTime now = RTC.now();
display_message = createMessage(now);
arraylen = initDisplayString(display_message);
if(updateFlag) { show_time_and_date(now); updateFlag = false; }
while(rotating) {
delay(1);
adjTime(now, clockwise);
show_time_and_date(RTC.now());
display_message = createMessage(now);
arraylen = initDisplayString(display_message);
delay(1);
rotating = false;
}
delay(5);
for (int i = 0; i < (arraylen-7); i++) {
for (int j = 1; j < 9; j++) {
maxSingle(j, ac[i+8-j]);
}
if(i%(8+cblanks) == 0) {
if(charHI) maxSingle(max7219_reg_intensity, 0x01);
newDelay(delay_char);
} else {
maxSingle(max7219_reg_intensity, 0x00);
newDelay(delay_line);
}
}
if(mode == 0) newDelay(delay_mess);
}
// Rotinas de interrupção, operações, funções auxiliares...
// (Código completo disponível na fonte original)
Esquemático

Processo de manufatura
- Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
- Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Construa um Jogo Tetris com Arduino Nano em Matriz LED 16×8 DIY
- MotionSense: Detecção Inteligente de Intrusão com Arduino e ESP8266
- Display Interativo de Matriz LED na Porta com Sensor PIR – Saudação de Férias Arduino
- Construa um Robô Quadrúpede Inteligente com Arduino: Guia Passo a Passo
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Crie um Medidor IoT Web com Arduino, Yaler e IFTTT
- Levitação Magnética Repulsiva com Arduino: Circuito Simples e Guia DIY