const int GPS_PPS_PIN = 2; // PPS-Signal vom GPS für Sekundentakt const int LICHTSCHRANKE_PIN = 3; // Signal von der Lichtschranke // Volatile Variablen für die Interrupts volatile unsigned long ppsMicrosRef = 0; // Systemzeit der letzten GPS-Sekunde volatile unsigned long eventMicros = 0; // Systemzeit des 1800. Impulses volatile unsigned long eventPpsRef = 0; // PPS-Referenzwert beim 1800. Impuls volatile bool eventTriggered = false; unsigned long gesamtImpulsZaehler = 0; // Interrupt-Service-Routine für den präzisen GPS-Sekundentakt (Pulse Per Second) void ppsISR() { ppsMicrosRef = micros(); } // Interrupt-Service-Routine für die Lichtschranke void lichtschrankeISR() { gesamtImpulsZaehler++; eventMicros = micros(); eventPpsRef = ppsMicrosRef; eventTriggered = true; } void setup() { Serial.begin(9600); Serial.println("Ready"); pinMode(GPS_PPS_PIN, INPUT); pinMode(LICHTSCHRANKE_PIN, INPUT_PULLUP); // Interrupts aktivieren attachInterrupt(digitalPinToInterrupt(GPS_PPS_PIN), ppsISR, RISING); attachInterrupt(digitalPinToInterrupt(LICHTSCHRANKE_PIN), lichtschrankeISR, FALLING); } void loop() { if (eventTriggered) { eventTriggered = false; // Sub-Sekunden-Offset in Mikrosekunden berechnen unsigned long logSubSekundeMicros = eventMicros - eventPpsRef; Serial.print(gesamtImpulsZaehler); Serial.print(" "); Serial.println(logSubSekundeMicros); } }