volatile uint64_t now = 1629881966; // current epoch time
int hour, minute, second;
void setupTimer1() {
noInterrupts();
TCCR1A = 0; // Clear registers
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624; // 1 Hz (16000000/((15624+1)*1024))
TCCR1B |= (1 << WGM12); // CTC
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
TIMSK1 |= (1 << OCIE1A); // Output Compare Match A Interrupt Enable
interrupts();
}
unsigned long currentEpochTime;
void setup() {
Serial.begin(115200);
setupTimer1();
currentEpochTime = now;
}
void loop() {
static uint32_t printTime;
if (millis() - printTime > 1000) {
printTime = millis();
hour = (now / 3600) % 24;
minute = (now / 60) % 60;
second = now % 60;
Serial.print("Actual time ");
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
Serial.println("");
uint64_t mTime = currentEpochTime + millis() / 1000;
hour = (mTime / 3600) % 24;
minute = (mTime / 60) % 60;
second = mTime % 60;
Serial.print("Millis time ");
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
Serial.println("");
}
}
// Timer1 interrupt service routine
ISR(TIMER1_COMPA_vect) {
now++;
}