//
// https://forum.arduino.cc/t/funktion-millis-to-uhrzeit/1350414/35
//
#include <TM1637Display.h>
#include <Streaming.h> // https://github.com/janelia-arduino/Streaming
Print& cout {Serial};
// Global constants
namespace gc {
constexpr uint8_t pin_clk {2};
constexpr uint8_t pin_dio {3};
} // namespace gc
// Anleihe von @Combie
using Millis = decltype(millis()); // mostly 32Bit, sometimes 64Bit
constexpr Millis operator"" _ms(unsigned long long int t) { return t; }
constexpr Millis operator"" _seconds(unsigned long long int t) { return t * 1000_ms; }
constexpr Millis operator"" _minutes(unsigned long long int t) { return t * 60_seconds; }
constexpr Millis operator"" _hours(unsigned long long int t) { return t * 60_minutes; }
constexpr Millis operator"" _days(unsigned long long int t) { return t * 24_hours; }
constexpr Millis operator"" _second(unsigned long long int t) { return t * 1000_ms; }
constexpr Millis operator"" _minute(unsigned long long int t) { return t * 60_seconds; }
constexpr Millis operator"" _hour(unsigned long long int t) { return t * 60_minutes; }
constexpr Millis operator"" _day(unsigned long long int t) { return t * 24_hours; }
class Timer
{
public:
void start() {timeStamp = millis();}
bool operator() (const unsigned long duration) const {
return (millis() - timeStamp >= duration) ? true : false;
}
private:
unsigned long timeStamp {0};
};
class MillisToTime {
public:
void time(Millis tMillis) {
vDays = tMillis / 1_day;
tMillis %= 1_days;
vHours = tMillis / 1_hour;
tMillis %= 1_hours;
vMinutes = tMillis / 1_minute;
tMillis %= 1_minutes;
vSeconds = tMillis / 1_second;
}
uint8_t seconds() const { return vSeconds; }
uint8_t minutes() const { return vMinutes; }
uint8_t hours() const { return vHours; }
uint8_t days() const { return vDays; }
private:
uint8_t vSeconds {0};
uint8_t vMinutes {0};
uint8_t vHours {0};
uint8_t vDays {0};
};
Timer interval;
MillisToTime mtt;
TM1637Display display(gc::pin_clk, gc::pin_dio);
void setup() {
Serial.begin(115200);
display.setBrightness(0x0f);
}
void loop() {
static char tBuffer[12] {"00:00:00:00"};
static uint8_t dot_flag {0x40};
if (interval(1_second)) {
interval.start();
mtt.time(millis());
snprintf(tBuffer, sizeof(tBuffer), "%02d:%02d:%02d:%02d", mtt.days(), mtt.hours(), mtt.minutes(), mtt.seconds());
cout << tBuffer << endl;
// cout << _FMT("%:%:%:%", _WIDTHZ(mtt.days(), 2), _WIDTHZ(mtt.hours(), 2), _WIDTHZ(mtt.minutes(), 2),
// _WIDTHZ(mtt.seconds(), 2))
// << endl;
unsigned int tmp_time = mtt.minutes() * 100 + mtt.seconds();
display.showNumberDecEx(tmp_time, dot_flag, true, 4); // 0x64 : dots on, leading zeros, four digits
dot_flag ^= 0x40;
}
}