Arduino sotto "sforzo"

Buonasera, oggi mi sono arrivati i sensori ad ultrasuoni per Arduino, sono precisi ma non quanto speravo quindi invece di farmi mandare su seriale a crudo i valori in cm che ricevevo dal sensore avevo pensato di fargli fare la media fra otto valori diversi, il sistema funziona bene il problema è che penso arduino non sia abbastanza veloce a fare i calcoli (che comunque non sono "2+2") che deve fare per ottenere i vari valori. Il problema riscontrato è che senza alcun tipo di delay o robe varie è leeeeeentissimo, roba che per ricevere il primo valore ci mette 4 secondi o giù di lì. Terrei a precisare che la parte iniziale del codice (ossia quella che legge i valori dei sensori) non è scritta da me, il codice non era così inizialmente, ho tolto alcune stringhe inutili per aggiungere quelle per farsi la media. Come potrei fare per ottenere un valore altrettanto preciso senza però farlo sforzare troppo? (ho bisogno di valori non precisissimi però visto che il tutto va collegato ad un piccolo impianto di domotica vorrei che almeno la cosa fosse funzionale) il code è :

//HC RS04 Sensore ultrasuoni
int triggerPort = 13;
int echoPort = 12;

void setup() {

pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");

}

void loop() {
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );

//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );

long duration = pulseIn( echoPort, HIGH );

long r = 0.034 * duration / 2;
 long v1 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v2 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v3 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v4 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v5 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v6 = r;
 duration = pulseIn( echoPort, HIGH );

r = 0.034 * duration / 2;
 long v7 = r;
 duration = pulseIn( echoPort, HIGH );

 r = 0.034 * duration / 2;
 long v8 = r;
  long ValMed = (v1+v2+v3+v4+v5+v6+v7+v8 / 8);
  Serial.print("distanza");
  Serial.print( ValMed );
   Serial.print( "cm"  );

XSparter, Arduino quei calcoli se li mangia prima che tu abbia fatto a tempo a "battere le ciglia" ... il problema è ... che non hai letto il reference per le istruzioni che usi e sei convinto di non avere delay() ... mentre ne hai ... eccome se ne hai ...

Prova a leggere come funziona la pulseIn() ... e scoprirai che ...

Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn() waits for the pin to go HIGH, starts timing, then waits for the pin to go LOW and stops timing.

... la pulseIn() si comporta come la delay() ... si ferma in attesa di ricevere quello che gli hai detto di leggere e quindi ferma tutto il programma per il tempo della lettura.

Quindi ... tutta la tempistica, NON è data da quanto ci mette Arduino a fare una manciata di operazioni, ma da quanto dura l'attesa introdotta dalle varie pulseIn() ...

Guglielmo

Per diminuire i tempi in caso di letture "Out of Range" puoi aggiungere al pulseIn() un Timeout. Come é descritto nella descrizione del pulseIn(). Ciao Uwe

AHHHHHH Dicevo io che un minicomputer non poteva realmente essere così lento, no effettivamente tutto quello che so su arduino l'ho imparato dal libro e non parlava di queste cose. Sapreste modificarmi il codice in modo da renderlo più "veloce"? Guglielmo, un grazie speciale a te che sei sempre presente! EDIT: proverò col timeout, vi faccio sapere!

@ XSparter : Figurati, di nulla XD

Piuttosto, perché usare la pulesIn() e non invece scriversi da soli il codice ottimizzandolo ? Non è molto difficile legge un pin e misurare quanto tempo sta in una condizione (HIGH o LOW) ... e saresti tu a decidere tutte le tempistiche ... ;)

Guglielmo

Ciao! Stai utilizzando l'SRF05 (o 04)? Perchè in quel caso devi inviare il trigger per ogni lettura che vuoi fare =) Ci potrebbe mettere tanto tempo perchè pulseIn aspetta un fronte di salita per partire, fronte che non si verifica mai!

Esatto se non gli ritorna indietro l’echo o perchè non effettua un rimbalzo o perchè l’ impulso non è mai partito il micro attende fino a quando non è andato in overflow la variabile float (se non sbaglio)

PulseIn() ha come terzo parametro il timeout. Puoi dirgli quanto tempo pulseIn deve aspettare prima che ritorna senza risultato.
http://arduino.cc/en/Reference/PulseIn
Ciao Uwe