⏰ 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  4

    volatile unsigned long lastMillis = 0;

    LiquidCrystal_I2C lcd(0x27, 16, 2);  // endereço do display I2C

    int 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ógio
      if (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 horas
      if (digitalRead(BTN_HORA) == LOW && (millis() - lastDebounceHora) > debounceDelay) {
        lastDebounceHora = millis();
        horas = (horas + 1) % 24;
        mostrarRelogio();
      }

      // Ajuste de minutos
      if (digitalRead(BTN_MINUTO) == LOW && (millis() - lastDebounceMin) > debounceDelay) {
        lastDebounceMin = millis();
        minutos = (minutos + 1) % 60;
        mostrarRelogio();
      }

      // Reset para 00:00:00
      if (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

Postagens mais visitadas deste blog

contador 9999 com pic 16f628

CNC fotos cordenadas x y z dicas

codigo assembler braço mecanico para 5 motores