⏰ Relógio Digital com Ajuste Manual usando Arduino e LCD I2C
Hoje o projeto é simples, mas muito útil — um relógio digital que, além de marcar as horas com precisão, permite ajuste manual via botões.
O coração do sistema é o Arduino Uno e um display LCD 16x2 com interface I2C, que reduz o número de fios e deixa a montagem mais limpa.
🔹 Recursos do projeto:
-
Mostra horas, minutos e segundos em tempo real
-
Botão 1 (pino 2): incrementa as horas
-
Botão 2 (pino 3): incrementa os minutos
-
Botão 3 (pino 4): reseta o relógio para 00:00:00
-
Pisca o LED do pino 13 como marcador de segundos
🛠 Componentes necessários:
-
Arduino Uno (ou similar)
-
LCD 16x2 com módulo I2C (endereço padrão 0x27)
-
3 botões de pressão
-
Jumpers e protoboard
código abaixo completo- #include <Wire.h>#include <LiquidCrystal_I2C.h>const int LED_PIN = 13;// Botões#define BTN_HORA 2#define BTN_MINUTO 3#define BTN_RESET 4volatile unsigned long lastMillis = 0;LiquidCrystal_I2C lcd(0x27, 16, 2); // endereço do display I2Cint segundos = 0;int minutos = 0;int horas = 0;unsigned long lastDebounceHora = 0;unsigned long lastDebounceMin = 0;unsigned long lastDebounceReset = 0;const unsigned long debounceDelay = 200;void setup() {pinMode(LED_PIN, OUTPUT);pinMode(BTN_HORA, INPUT_PULLUP);pinMode(BTN_MINUTO, INPUT_PULLUP);pinMode(BTN_RESET, INPUT_PULLUP);lcd.init();lcd.backlight();lcd.clear();}void loop() {digitalWrite(LED_PIN, segundos % 2 == 0 ? HIGH : LOW);unsigned long currentMillis = millis();// Incrementa o relógioif (currentMillis - lastMillis >= 1000) {lastMillis = currentMillis;segundos++;if (segundos >= 60) {segundos = 0;minutos++;}if (minutos >= 60) {minutos = 0;horas++;}if (horas >= 24) {horas = 0;}mostrarRelogio();}// Ajuste de horasif (digitalRead(BTN_HORA) == LOW && (millis() - lastDebounceHora) > debounceDelay) {lastDebounceHora = millis();horas = (horas + 1) % 24;mostrarRelogio();}// Ajuste de minutosif (digitalRead(BTN_MINUTO) == LOW && (millis() - lastDebounceMin) > debounceDelay) {lastDebounceMin = millis();minutos = (minutos + 1) % 60;mostrarRelogio();}// Reset para 00:00:00if (digitalRead(BTN_RESET) == LOW && (millis() - lastDebounceReset) > debounceDelay) {lastDebounceReset = millis();horas = 0;minutos = 0;segundos = 0;mostrarRelogio();}}void mostrarRelogio() {lcd.setCursor( 5, 0);lcd.print("HORAS:");lcd.setCursor( 5, 1);if (horas < 10) lcd.print("0");lcd.print(horas);lcd.print(":");if (minutos < 10) lcd.print("0");lcd.print(minutos);lcd.print(":");if (segundos < 10) lcd.print("0");lcd.print(segundos);}
💡 Possíveis melhorias:
-
Usar um módulo RTC DS3231 para manter a hora mesmo desligado
-
Adicionar alarme programável
-
Criar animações no display durante a troca de hora
Comentários
Postar um comentário
Faça seu comentário referente a este assunto