#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;
}

GND5VSDASCLSQWRTCDS1307+