Allora, sempre nello spirito di darti le giuste "dritte" di programmazione, prima di passare al codice che ti suggerirò, iniziamo da qualche altra nota generale e specifica, per spiegarti le modifiche che ho apportato al tuo codice. Quando QUESTO funziona come atteso, allora passiamo all'array.
Infine si potrà estendere all'LCD ma se necessario, perché comunque sul PC potresti accumulare tutte le letture leggendole dalla seriale con un programmino seriale tipo putty, e salvarle su file e poi analizzarle con Excel. Ma vedremo in seguito.
if (digitalRead(Sensore) == 0)
Se il sensore dà un segnale normalmente alto (HIGH) e quando passa il pendolo diventa basso (LOW), per evidenziare meglio la cosa ti consiglio di usare proprio le costanti HIGH e LOW, per cui
if (digitalRead(Sensore) == LOW)
int Led = 13; // voglio che al passaggio dell'ostacolo si acccenda il pin di arduino
int Sensore = 3;
Per ottimizzazione, i numeri dei pin impostali sempre byteo, meglio, come #define (e per convenzione i simboli costanti si indicano con tutte maiuscole). Dato che parli del led integrato, sappi che esiste un simbolo LED_BUILTIN già definito (e vale 13 su UNO), quindi non c'è neanche bisogno di quello:
#define SENSORE 3
...
pinMode(LED_BUILTIN, OUTPUT);
pinMode(SENSORE, INPUT);
...
Inoltre dici che vuoi accendere il LED al passaggio del pendolo, ma nel codice sembra che tu faccia il contrario, nel setup() mettilo LOW e poi HIGH quando rilevi il passaggio.
boolean val = true;
Questa variabile di fatto dovrebbe indicare quando iniziare a contare il tempo (primo passaggio), non dal setup() perché altrimenti la prima lettura partirebbe non da quando passa il pendolo ma da quando accendi Arduino (visto che leggi il tempo anche nel setup). Poi evita le variabili con un nome non significativo, se indica un primo passaggio chiamalo "primo" ad esempio, e che va inizializzato a true (attendo il primo passaggio)...
currtime = micros();
Tu leggi l'intervallo di tempo in microsecondi, ma dato che fai dei delay(100) nel loop() non avrai mai una precisione maggiore di un decimo di secondo!
Credo che tu abbia messo il delay() per evitare doppie letture dello stesso passaggio del sensore, quindi ti converrebbe invece attendere che il sensore torni HIGH. Tra l'altro con quei delay(100) non hai risoluzione utile per fare caalcoli un poco più precisi perché saranno sempre sul decimo di secondo, una risoluzione in millisecondi è più che sufficiente, quindi usare millis() e non micros().
Ok, ecco il codice modificato, analizza le modifiche che ti ho fatto (ovviamente se hai dubbi, chiedi) poi provalo (non provarlo senza prima averlo analizzato e capito!), e se ti soddisfa proseguiamo:
#define SENSORE 3
unsigned long pretime;
unsigned long currtime;
unsigned long timePeriod;
boolean primo = false;
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(SENSORE, INPUT);
digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
int sensore = digitalRead(SENSORE);
if (sensore == LOW)
{ // Rilevata la presenza del pendolo
// Accendo il LED
digitalWrite(LED_BUILTIN, HIGH);
if (primo)
{ // Se è il primo passaggio memorizzo l'istante iniziale
pretime = millis();
}
else
{ // Passaggio successivo
currtime = millis();
timePeriod = currtime - pretime;
pretime = currtime;
Serial.println((float)timePeriod / 1000.0, 3);
}
// Attendo che il pendolo esca dalla portata del sensore
while (digitalRead(SENSORE) == LOW)
{
delay(10);
}
}
digitalWrite(LED_BUILTIN, LOW);
delay(10); // Risoluzione 1/100 di secondo
}