#include <Wire.h>
#include <RTClib.h>
#include <TM1637Display.h> // Certifique-se de que a biblioteca TM1637 está instalada
// Pinos para o display TM1637 de hora
#define CLK_HORA 2
#define DIO_HORA 3
// Pinos para o display TM1637 de data
#define CLK_DATA 4
#define DIO_DATA 5
// Pinos para o display TM1637 de ano
#define CLK_ANO 6
#define DIO_ANO 7
// Pino do potenciômetro
#define POT_PIN A0
// Inicializando o RTC DS3231
RTC_DS3231 rtc;
// Inicializando os displays
TM1637Display displayHora(CLK_HORA, DIO_HORA);
TM1637Display displayData(CLK_DATA, DIO_DATA);
TM1637Display displayAno(CLK_ANO, DIO_ANO);
// Variáveis para a suavização da luminosidade
int currentBrightness = 0; // Luminosidade atual
int targetBrightness = 0; // Luminosidade desejada
void setup() {
// Inicia a comunicação serial
Serial.begin(9600);
// Verifica se o RTC está funcionando
if (!rtc.begin()) {
Serial.println("RTC não encontrado!");
while (1);
}
// Se o RTC perdeu a hora, definimos para a hora compilada
if (rtc.lostPower()) {
Serial.println("RTC perdeu a hora, ajustando para a data/hora padrão.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
// Obtenha a data e hora atuais do RTC
DateTime now = rtc.now();
// Formata a hora como HHMM
int displayTime = (now.hour() * 100) + now.minute();
// Formata a data como DDMM (Dia e Mês)
int displayDate = (now.day() * 100) + now.month();
// Lê o valor do potenciômetro
int potValue = analogRead(POT_PIN);
// Mapeia o valor do potenciômetro (0-1023) para (0-7) (luminosidade do display)
targetBrightness = map(potValue, 0, 1023, 0, 7);
// Suaviza a transição da luminosidade
if (currentBrightness < targetBrightness) {
currentBrightness++; // Aumenta gradualmente
} else if (currentBrightness > targetBrightness) {
currentBrightness--; // Diminui gradualmente
}
// Ajusta a luminosidade dos displays
displayHora.setBrightness(currentBrightness); // Brilho do display de hora
displayData.setBrightness(currentBrightness); // Brilho do display de data
displayAno.setBrightness(currentBrightness); // Brilho do display de ano
// Mostra a hora no display de hora com pontos piscantes
displayHora.showNumberDecEx(displayTime, 0b01000000, true); // O último parâmetro 'true' ativa a exibição dos pontos
// Mostra a data no display de data (apenas Dia e Mês)
displayData.showNumberDec(displayDate);
// Mostra o ano completo no display de ano
displayAno.showNumberDec(now.year()); // Exibe o ano completo (AAAA)
// Aguardamos um breve momento antes de atualizar novamente
delay(50); // Diminua o delay para uma atualização mais suave
}