// https://wokwi.com/projects/451242494999365633
// https://forum.arduino.cc/t/help-with-tm1637-6-digit-and-button/1416196
# include <TM1637.h>
# include <Wire.h>
# include <Adafruit_NeoPixel.h>
# include <RTClib.h>
// Pinos de conexão do Display TM1637
//... mine were reversed
# define CLK 2
# define DIO 3
// TM1637Display display(CLK, DIO);
TM1637 display(CLK, DIO);
RTC_DS3231 rtc;
// Configuração da fita de LED
# define PIN_LED 5
# define NUM_LEDS 21 // 7 dias * 3 LEDs/dia
# define BRIGHTNESS 50 // Brilho (0-255)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);
// Paleta de cores para cada dia da semana (R, G, B)
// Ordem: Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado
uint32_t dayColors[7] = {
strip.Color(255, 0, 0), // Domingo (Vermelho)
strip.Color(0, 100, 0), // Segunda (Verde Escuro)
strip.Color(0, 0, 255), // Terça (Azul)
strip.Color(255, 255, 0), // Quarta (Amarelo)
strip.Color(255, 0, 255), // Quinta (Magenta)
strip.Color(0, 255, 255), // Sexta (Ciano)
strip.Color(255, 128, 0) // Sábado (Laranja)
};
// Cor para destacar o dia atual (ex: Branco Brilhante)
uint32_t highlightColor = strip.Color(255, 255, 255);
// Mapeamento dos pinos dos segmentos (A a G e DP)
// Ajuste conforme sua ligação física
int pinSegmentos[] = {8, 9, 10, 11, 12, 13, 6, 7}; // A, B, C, D, E, F, G, DP
// 8 9 10 11 12 13 6 7
// A B C D E F G DP
// Mapeamento dos pinos comuns dos dígitos (D1, D2)
// Ajuste conforme sua ligação física
int pinDigitos[] = {A0, A1}; // Dígito da Dezena, Dígito da Unidade
// Padrões de segmentos para números de 0 a 9 (para display cátodo comum)
// HIGH liga o segmento, LOW desliga.
//... there are 8 segments if we include the decimal point
byte patterns[10][8] = {
{0, 0, 0, 0, 0, 0, 1, 0}, //0
{1, 0, 0, 1, 1, 1, 1, 1}, //1
{0, 0, 1, 0, 0, 1, 0, 0}, //2
{0, 0, 0, 0, 1, 1, 0, 1}, //3
{1, 0, 0, 1, 1, 0, 0, 0}, //4
{0, 1, 0, 0, 1, 0, 0, 1}, //5
{0, 1, 0, 0, 0, 0, 0, 0}, //6
{0, 0, 0, 1, 1, 1, 1, 1}, //7
{0, 0, 0, 0, 0, 0, 0, 0}, //8
{0, 0, 0, 0, 1, 0, 0, 1} //9
};
void setup() {
Serial.begin(9600);
strip.begin();
rtc.begin();
//... not when we simulate! strip.setBrightness(BRIGHTNESS);
//... display.setBrightness(5); // Ajusta o brilho (0 a 7)
Wire.begin();
//... for my display...
display.init();
display.set(BRIGHT_TYPICAL);
// --- Descomente a linha abaixo APENAS UMA VEZ para acertar a hora ---
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Configura pinos dos segmentos como saída
for (int i = 0; i < 8; i++) {
pinMode(pinSegmentos[i], OUTPUT);
// Configura pinos dos dígitos como saída
for (int i = 0; i < 2; i++) {
pinMode(pinDigitos[i], OUTPUT);
digitalWrite(pinDigitos[i], LOW); // Desliga os dígitos inicialmente (lógica LOW para ligar)
}
}
}
void loop() {
unsigned long now = millis();
// do something like the clock in the original
static int counter;
display.display(0, (counter / 1000) % 10);
display.display(1, (counter / 100) % 10);
display.display(2, (counter / 10) % 10);
display.display(3, counter % 10);
static long lastIncrement;
if (now - lastIncrement > 123) {
lastIncrement = now;
counter++;
}
// this early return was for testing the TM1637 code
//delay(100);
//return;
//... int dezena = diaDoMes / 10; // Extrai o dígito da dezena (ex: 2)
//... int unidade = diaDoMes % 10; // Extrai o dígito da unidade (ex: 5)
//
//... just grab two digitrs that are already being displayed on the TM1637
int dezena = (counter / 100) % 10;
int unidade =(counter / 10) % 10;
// Multiplexação: alterna rapidamente entre os dígitos para criar a ilusão de ambos acesos
displayDigit(0, dezena);
delay(10); // Pequena pausa para persistência da visão
displayDigit(1, unidade);
delay(10);
//... try this! Just shows the 2nd digit for much longer than the first.
//... delay(1000);
// ensure each of the two digits gets the same exposure
digitalWrite(pinDigitos[0], LOW);
digitalWrite(pinDigitos[1], LOW);
// Define as cores de fundo para todos os dias
for (int day = 0; day < 7; day++) {
int startLed = day * 3;
//... uint32_t colorToUse = dayColors[day];
//... just turn all of the pixels mostly off
uint32_t colorToUse = 0x200040;
// Se for o dia atual, usa a cor de destaque em vez da cor de fundo padrão
//... we have no RTC yet, so fake it
if (day == ((counter / 10) % 7)) {
colorToUse = highlightColor;
}
// Aplica a cor aos 3 LEDs do dia
for (int i = 0; i < 3; i++) {
strip.setPixelColor(startLed + i, colorToUse);
}
}
strip.show(); // Atualiza a fita de LED
}
void writeNumber(int number) {
for (int i = 0; i < 8; i++) {
digitalWrite(pinSegmentos[i], patterns[number][i]);
}
}
void displayDigit(int digit, int number) {
// Desliga todos os dígitos
digitalWrite(pinDigitos[0], LOW);
digitalWrite(pinDigitos[1], LOW);
// Escreve o número no barramento de segmentos
writeNumber(number);
// Liga apenas o dígito desejado (lógica LOW para cátodo comum)
digitalWrite(pinDigitos[digit], HIGH);
}