Calcolo tempo di variazione valore analogico

Sto cercando di leggere con una fotoresistenza (con Arduino Mega) la frequenza di accensione e spegnimento di un LED che fa parte di un circuito separato da quello di Arduino.
(La fotoresistenza ed il LED sono optoisolati dall’esterno)

Il LED lampeggia con pause diverse a seconda del verificarsi di alcuni eventi ed io vorrei riuscire a calcolare le variazioni in cui lampeggia tramite la fotoresistenza.

Da test sperimentali, la fotoresistenza (molto reattiva) è a zero quando il LED non lampeggia (ovviamente) e sale subito a più 150 quando il led di accende per poi calare drasticamente a meno di 40 e poi subito a 0 quando il LED si spegne.

Per cercare di calcolare l’intervallo in cui resta acceso il LED, ho scritto questo semplice sketch:

/*
  AnalogReadSerial
 Reads an analog input on pin 0, prints the result to the serial monitor 
 
 This example code is in the public domain.
 */
unsigned long received = 0;
unsigned long inter = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A5);
  
  Serial.println(sensorValue);
  
  if(sensorValue > 150){ // LED ACCESO
  received = millis();
  
  }
  if(received > 0 && sensorValue < 50){ // IL LED SI SPEGNE
  inter = millis() - received;
  Serial.print("Interval: ");
  Serial.println(inter);
  received = 0;
  delay(400); // L'HO AGGIUNTO PER POTER LEGGERE IL VALORE
  }
}

Solo che non mi sembra dare valori molto coerenti perchè sia che il LED lampeggi a lungo o con pause brevi, l’intervallo è quasi sempre lo stesso.
In realtà non dovrebbe essere così dato che da Serial Monitor vedo che il valore analogico resta a 200 per molto tempo e quindi l’intervallo dovrebbe essere più lungo, ma non lo è (o meglio, l’intervallo è di pochissimo più lungo e quindi molto difficile da distinguere).

Secondo voi sbaglio qualcosa nell’uso di millis()?

Forse per aumentare la velocità di rilevamento dovresti usare un fotodiodo.

Detto questo, prova con un while per fermare la lettura finché il valore non torna sotto al valore di soglia.

void loop() {
  unsigned long tempo;
  if (analogRead(PIN)>valore_di_soglia) {
    tempo=millis();
    while (analogRead(PIN)>valore_di_soglia) { }
    Serial.println(millis()-tempo, DEC);
  }
}

La fotoresistenze é molto lenta. non arrivi sopra qualche Hz. Prendi un fototransistore .
Ciao Uwe

Domani mattina provo a trovare un fototransistore o un fotodiodo e vedo se la cosa migliora.

Comunque, questo è l’output che ho, in genere:

0
0
0
254
240 ← Un singolo lampeggio
40
0
0
0
251
253
240 ← più lampeggi ravvicinati
253
240
159
139
40
32
2
0
0
0

A me interessa rilevare il tempo in cui il segnale resta superiore al 100 in modo da distinguere la frequenza a cui si illumina il LED dato che quando lampeggia velocemente viene rilevato come se stesse quasi sempre acceso.

Avevo dimenticato di chiedere se il fototransistore è qualcosa come il componente TEPT5600 o meno. Dato che non li ho mai usati, non so che forma possano avere.

Sí, il TEPT5600 é un fototransistore. Sulla pagina linkata c’é anche lo schema come collegarlo.
Ciao Uwe

Ho chiamato al rivenditore più vicino e mi ha detto che sicuramente ha i fotodiodi, ma che forse i fototransistori erano finiti. Sto andando a controllare.

Comunque, anche se non ci fossero, dall'output vedo che la mia fotocella (che sarebbe questa) riesce comunque a capire quando il LED lampeggia velocemente perchè il valore resta più a lungo sui 200: non potrei riuscire a calcolare il tempo in cui il valore resta in quell'interno anche con la fotocella?

No. La "fotocellula" linkata é un fotoresistenza e quelle sono lente a variare il valore. A frequenze troppo alte ( parliamo di qualche Hz) non seguono piú la variazione della luce. Se nel negozio non hanno fototransistori prendi un optocoppler a forcella o a riflessione e smonta da lí il fototransistore che é marcato normalmete con la lettera D (detettore). Cioa Uwe

Sono appena uscito dal negozio ho preso dei tfk bpw24r (il datasheet è questo: http://www.datasheetcatalog.net/de/datasheets_pdf/B/P/W/2/BPW24.shtml) e poi ho preso un fotodiodo che però non ha nessun codice riportat. I tfk che ho preso somigliano al sensore di cui si parlava prima ma nel datasheet si parla di fotodiodo e non foto transistori: ho speso 12 euro senza motivo? :)