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 seconda del verificarsi di alcuni eventi ed io vorrei riuscire calcolare le variazioni in cui lampeggia tramite la fotoresistenza.

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

per cercare di calcolare l'intervallo in cui resta acceso il led, ho scritto questo semplice sketch:

code: [select]
/*
 analogreadserial
reads analog input on pin 0, prints result serial monitor

example code in 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 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 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.
code: [select]
void loop() {
  unsigned long tempo;
  if (analogread(pin)>valore_di_soglia) {
    tempo=millis();
    while (analogread(pin)>valore_di_soglia) { }
    serial.println(millis()-tempo, dec);
  }
}

 


Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Calcolo tempo di variazione valore analogico


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial