rilevare e misurare tempo fra due eventi eventi

mikiti:
il flash dura poco ma usando un certo delay, per quanto piccolo, rischio comunque di perdere il segnale (ma 1 ms è davvero piccolo). Comunque darò un'occhiata agli interrupt e farò qualche prova.

Per avere la precisione migliore DEVI usare gli interrupt.

Poi credo che a te basti anche un solo evento (es. LOW->HIGH, ossia "RISING" negli interrupt), non ti interessa sapere quanto tempo è rimasto acceso il led immagino, per cui è tutto molto semplice, nella routine dell'interrupt (chiamata "ISR") semplicemente registri il momento dell'evento e alzi un flag, e nel loop() quindi appena vedi che il flag è alto fai quello che devi fare.

Una cosa del genere (l'ho scritto al volo, non prenderlo per intero e non necessariamente per buono):

#define LEDPIN 3
volatile byte state = LOW;
volatile unsigned long curBlinkTime = 0;
static unsigned long lastBlinkTime = 0;

void setup() {
   ...
  attachInterrupt(digitalPinToInterrupt(LEDPIN), ledBlink, RISING);
   ...
}

void ledBlink() {
  curBlinkTime = millis();
  state = HIGH;
}

void loop() {
  if ( state == HIGH ) {
    unsigned long intervallo = curBlinkTime - lastBlinkTime;
    lastBlinkTime = curBlinkTime;
    state = LOW;
    ... faccio qualcosa...
  }
   ...
}

PS: se Arduino deve restare acceso per svariati giorni, occhio che millis() misura il tempo dall'accensione e ad un certo punto ricomincia da zero. Per gestire questa cosa puoi vedere QUI.