// Help with TM1637 6-digit And Button
// https://forum.arduino.cc/t/help-with-tm1637-6-digit-and-button/1416196
#include <Arduino.h>
#include <TM1637TinyDisplay6.h>
// TM1637 pins
#define DISP_CLK 2
#define DISP_DIO 3
// Button pins
#define BTN_HOUR 4
#define BTN_MIN 5
// Cria uma instância de display para módulo de 6 dígitos
TM1637TinyDisplay6 display(DISP_CLK, DISP_DIO);
// Relógio de software simples (24 horas)
uint8_t hours = 12;
uint8_t minutes = 0;
uint8_t seconds = 0;
// Cronometragem com milissegundos()
#define UPDATE_DISPLAY_MS 1000 // Update Display every second
unsigned long nextTickMs = UPDATE_DISPLAY_MS;
// Estado do botão para eliminação de simples debouncing
const unsigned long DEBOUNCE_MS = 50;
bool lastHourBtnState = HIGH;
bool lastMinBtnState = HIGH;
unsigned long nextHourChangeMs = 0;
unsigned long lastMinChangeMs = 0;
void setup() {
Serial.begin(115200);
while (!Serial) {}
Serial.println("System Ready");
// Initialize display
display.begin();
display.setBrightness(7); // 0–7 (7 = mais brilhante)
// Inicializa os botões com resistores pull-up internos.
pinMode(BTN_HOUR, INPUT_PULLUP);
pinMode(BTN_MIN, INPUT_PULLUP);
// Exibição inicial
updateDisplay();
}
void loop() {
unsigned long now = millis();
// --- 1) Timekeeping: tick every 1000 ms ---
if (now >= nextTickMs) {
nextTickMs += UPDATE_DISPLAY_MS;
tickClock();
updateDisplay();
}
// --- 2) Botão de ajuste de horas (incrementa horas) ---
handleHourButton(now);
// --- 3) Botão de ajuste de minutos (incrementa minutos) ---
handleMinuteButton(now);
}
// Avança o tempo em 1 segundo.
void tickClock() {
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
if (hours >= 24) {
hours = 0;
}
}
}
}
// Auxiliares para manuseio de botões
void handleHourButton(unsigned long now) {
bool BtnState = digitalRead(BTN_HOUR);
if (now > nextHourChangeMs) {
// Se o botão estiver pressionado (LOW) e anteriormente estivesse em HIGH, trata-se de um novo pressionamento.
if (BtnState == LOW && lastHourBtnState == HIGH) {
incrementHour();
updateDisplay();
Serial.println("Hours");
}
}
// Detecção de bordas com debounce
if (BtnState != lastHourBtnState) {
// Estado do botão alterado; timer de debounce reiniciado.
nextHourChangeMs = now + DEBOUNCE_MS;
}
lastHourBtnState = BtnState;
}
void handleMinuteButton(unsigned long now) {
bool BtnState = digitalRead(BTN_MIN);
if ((now - lastMinChangeMs) > DEBOUNCE_MS) {
if (BtnState == LOW && lastMinBtnState == HIGH) {
incrementMinute();
updateDisplay();
Serial.println("Minutes");
}
}
if (BtnState != lastMinBtnState) {
lastMinChangeMs = now;
}
lastMinBtnState = BtnState;
}
void incrementHour() {
hours = (hours + 1) % 24;
// Opcional: faz o reset dos segundos ao configurar a hora
// seconds = 0;
}
void incrementMinute() {
minutes = (minutes + 1) % 60;
// Opcional: faz o reset dos segundos ao configurar a hora
// seconds = 0;
}
// Atualiza o display de 6 dígitos para HHMMSS.
void updateDisplay() {
// char buffer[9]; // 6 dígitos + terminador nulo
// snprintf(buffer, sizeof(buffer), "%02u.%02u.%02u", hours, minutes, seconds);
// // Para um display de 6 dígitos, 'showString' exibirá exatamente esses 6 caracteres.
// display.showString(buffer);
// Serial.write(buffer, sizeof(buffer));
// ----- Display Format: HHMMSS -----
uint8_t data[6];
data[0] = display.encodeDigit(hours / 10);
data[1] = display.encodeDigit(hours % 10);
data[2] = display.encodeDigit(minutes / 10);
data[3] = display.encodeDigit(minutes % 10);
data[4] = display.encodeDigit(seconds / 10);
data[5] = display.encodeDigit(seconds % 10);
display.setSegments(data);
}