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.