Greetings to everyone on this forum.
I have an Arduino code for a clock using a TM1637 6-digit display and 2 buttons to adjust the time. I have two questions:
- Add the decimal point between hours and minutes and between minutes and seconds.
- The function of the 2 buttons, which is to adjust hours and minutes, is not responding.
I would greatly appreciate any help.
#include <Arduino.h>
#include <TM1637TinyDisplay6.h>
// TM1637 pins
#define CLK 2
#define 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(CLK, DIO);
// Relógio de software simples (24 horas)
uint8_t hours = 12;
uint8_t minutes = 0;
uint8_t seconds = 0;
// Cronometragem com milissegundos()
unsigned long lastTickMs = 0;
// Estado do botão para eliminação de simples debouncing
const unsigned long DEBOUNCE_MS = 50;
bool lastHourBtnState = HIGH;
bool lastMinBtnState = HIGH;
unsigned long lastHourChangeMs = 0;
unsigned long lastMinChangeMs = 0;
void setup() {
// 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 - lastTickMs >= 1000) {
lastTickMs += 1000;
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 reading = digitalRead(BTN_HOUR);
// Detecção de bordas com debounce
if (reading != lastHourBtnState) {
// Estado do botão alterado; timer de debounce reiniciado.
lastHourChangeMs = now;
}
if ((now - lastHourChangeMs) > DEBOUNCE_MS) {
// Se o botão estiver pressionado (LOW) e anteriormente estivesse em HIGH, trata-se de um novo pressionamento.
if (reading == LOW && lastHourBtnState == HIGH) {
incrementHour();
updateDisplay();
}
}
lastHourBtnState = reading;
}
void handleMinuteButton(unsigned long now) {
bool reading = digitalRead(BTN_MIN);
if (reading != lastMinBtnState) {
lastMinChangeMs = now;
}
if ((now - lastMinChangeMs) > DEBOUNCE_MS) {
if (reading == LOW && lastMinBtnState == HIGH) {
incrementMinute();
updateDisplay();
}
}
lastMinBtnState = reading;
}
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[7]; // 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);
}