#include "RTClib.h"
RTC_DS1307 rtc;
const byte ledPin = 7;
const byte matchPin = 6;
void setup () {
Serial.begin(115200);
Serial.println("\nmillis rollover NP\n");
rtc.begin();
pinMode(ledPin, OUTPUT);
pinMode(matchPin, OUTPUT);
setMillis(-9000L); // set for milliseconds to rollover, here 9 seconds until
}
# define triggerAt 0 // true for the entire 7th second since reset
int secondsIn = -7;
bool hasRolled;
bool hasTriggered;
bool hasFinished;
unsigned long startPulse;
unsigned long startTime;
void loop () {
if (secondsIn == triggerAt) {
digitalWrite(matchPin, HIGH);
startTime = millis();
digitalWrite(ledPin, 1);
if (!hasTriggered) {
Serial.println("period begins");
hasTriggered = true;
startPulse = millis();
}
}
else digitalWrite(matchPin, LOW);
if (millis() - startTime > 5000) {
if (!hasFinished && digitalRead(ledPin) == HIGH) {
Serial.print("period over. LED on for ");
Serial.println(millis() - startPulse);
hasFinished = true;
}
digitalWrite(ledPin, 0);
}
DateTime now = rtc.now();
static int lastSecond;
if (!hasRolled) {
if (millis() < 1000) {
Serial.println("***End of the World! millis() rollover!");
hasRolled = true;
}
}
if (now.second() != lastSecond) {
lastSecond = now.second();
secondsIn++;
Serial.print(" ");
Serial.print(secondsIn);
Serial.print(" ");
Serial.print(millis());
Serial.println("");
}
}
// never mind this, it set millis wherever you want it
extern volatile unsigned long timer0_millis;
extern volatile unsigned long timer0_overflow_count;
void setMillis(unsigned long new_millis) {
uint8_t oldSREG = SREG;
cli();
timer0_millis = new_millis; // new_millis;
timer0_overflow_count = 0;
TCNT0 = 0;
SREG = oldSREG;
}