Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.

Aber kann ich mehrere Zustände gleichzeitig mit millis überwachen?
Ich nutze millis bereits in meinem Programm.

Die Frage sagt mir, dass Uwe's Vorschlag mit dem DS1307 RAM , der eigentlich richtig ist, und sogar erlaubt, zwischendurch den Reset-Knopf zu drücken,
erstmal zu weit geht.

also, ganz einfach:

unsigned long Pin1Start=0;  // 0 heisst: läuft grade nicht, sonst die letzte Startzeit
unsigned long Pin2Start=0;
unsigned long Pin3Start=0;

unsigned int Dauer1 = 0;    // hier zählen wir die Sekunden der letzten Einschalt-Perioden, z.B. bis sie auf die SD geschrieben werden.

void loop() 
{
    if ( digitalRead(Pin1) == HIGH && Pin1Start == 0) Pin1Start = millis();
    if ( digitalRead(Pin2) == HIGH && Pin2Start == 0) Pin2Start = millis();
    if ( digitalRead(Pin3) == HIGH && Pin3Start == 0) Pin3Start = millis();

    if ( digitalRead(Pin1) == LOW && Pin1Start != 0)
    { 
          Dauer1  +=  (millis()-Pin1Start) / 1000 ; // in sek.  auf den bisherigen Wert aufaddieren
          Pin1Start = 0;
    }
     // ... genauso für Pin2 und 3

}

Das war, wie gesagt erstmal ganz einfach zum Zeigen, wie mehrere Zeiten parallel gleichzeitig gezählt werden können.
Es geht auch anders und hat sicher Besonderheiten, aber darüber reden wir erst wenn du fragst.

edit: Danke für den Hinweis auf den, jetzt hoffentlich verschwundenen, Tippfehler.