Dubbi su HC-SR04

Salve,
ho collegato un sensore HC-SR04 ad Arduino per calcolare le distanze, ma quando lo metto in maniera da avere "fuori portata", mi alterna questo valore a "4 cm".
Allego uno screenshot del "problema".
Lo sketch è questo:

//sketch scaricato da Internet!!
//HC RS04 Sensore ultrasuoni
int triggerPort = 7;
int echoPort = 8;
 
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;
 
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
 
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
 
//aspetta 1.5 secondi
delay( 1500 );
}

durata.PNG

Prova di fare una pausa piú lunga tra le misure.
Ciao Uwe

Per duration devi usare unsigned long:

unsigned long duration = pulseIn( echoPort, HIGH );

Funziona anche con long, non è necessario unsigned visto che parliamo di valori al massimo di 38000.

Semmai gli farei impostare anche il timeout esplicitamente, l'SR04 è una ciofeca di sensore (io ne ho buttati 3, ora uso solo HY-SRF05 che costano un pochino di più ma funzionano):

long duration = pulseIn( echoPort, HIGH, 30000UL);

Prova e facci sapere.
E da ora lascia perdere gli HC-SR04 dammi retta :wink: Ciao!

docdoc:
Funziona anche con long, non è necessario unsigned ......

NON sono affatto d'accordo, questa tua affermazione è altamente diseducativa ed il fatto che "nel caso particolare" funzioni, non giustifica l'usare un long al posto di un unsigned long, anche perché ... poi l'utente impara sbagliato e magari, in futuro, si trova ad avere problemi (... stai sicuro che se uno prende l'abitudine ad usare long, non si ricorderà di usare poi unsigned long) !

Quindi, se la funzione PulseIn() è definita nel reference come tipo unsigned long si usa unsigned long (... che, per altro, occupa esattamente lo stesso numero di bytes, quindi ... manco si risparmia memoria :grin: )

Guglielmo

Si Guglielmo, hai ragione, ma io intendevo dire che non era sicuramente quello il problema :slight_smile:

docdoc:
... non era sicuramente quello il problema :slight_smile:

... su quello non c'è dubbio :smiley: :smiley: :smiley: :smiley:

Guglielmo