Problema con Ultrasuoni HC-SR04 [risolto]

Il problema è il seguente, ho un sensore di distanza a ultrasuoni che dovrebbe rilevarmi oggetti che si trovano tra i 2 e i 500cm.
Ora non fidandomi molto delle librerie che ho trovato in giro mi sono scritto da solo lo sketch per verificarne il funzionamento.

#define trig 12
#define echo 13

long duration;

void setup()
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);
}

void loop()
{
Serial.print(distance());
Serial.println("cm");
delay(100);
}

long distance()
{
digitalWrite(trig, HIGH);
digitalWrite(trig, LOW);

duration = pulseIn(echo, HIGH);
return duration / 58;
}

Adesso però, anche se non c'è nessun oggetto davanti al sensore per oltre 340cm, sul serial monitor visualizzo "cm 5".
Errore nel codice oppure sensore rotto ?
Grazie.
Valerio.

Non capisco il Tuo rifiuto di usare una libreria.
Se guardi la libreria l' impulso per far partire la misura é

digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin,HIGH);
  return duration;

Ciao Uwe

ma alla fine devo scrivere

return duration

o

return duration / 58

Guarda ho aggiunto questo codice

long distance()
{
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
return duration / 58;
}

e mi trovo delle misure sballate, cioè inizialmente mi mostra "30cm" che sono corretti, poi subito dopo "449" per 20 loop , e ritorna normale a 30cm, poi riprende con "449".
Non capisco dove sia l'errore.

La soluzione migliore "dovrebbe" essere fai un tot di letture li metti in un array e fai la media :smiley:

in caso di problema di alimentazione instabile o picchi di assorbimento basta mettere un condensatore elettrolitico da 47uF sull'alimentazione del sensore.
in caso di rumorosità intrinseca del sensore , come ti hanno gia detto, puoi fare una media su una ventina di acquisizioni ed avrai dei risultati più stabili.

La cosa migliore sarebbe fare entrambe le cose :slight_smile:

Ho praticamente risolto il problema ho controllato meglio il datasheet del sensore ed ho modificato anche se di poco

long distance()
{
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
delayMicroseconds(2);
duration = pulseIn(echo, HIGH);
return duration / 29/2;
}

Comunque alcuni svarioni ogni tanto ci sono perchè l'angolo di copertura del sensore ,man mano che la distanza aumenta, aumenta anche la sua area quindi ogni tanto mi intercetta degli oggetti che si trovano in quest'area a una distanza maggiore o minore dell'oggetto a cui sto puntando.
Più è lungo l'array più ottengo misure precise giusto ? in modo tale da disperdere l'errore.
Grazie.
Valerio.

si, però non ti allargare più di tanto con l'array altrimenti inizi a a vedere un certo ritardo nella lettura mostrata.

Si infatti, pensavo di non andare oltre i 25 valori.

poi posta il codice, potrebbe tornare utile agli altri (me compreso -.-") :smiley:

Solo la media dei valori dell'array oppure tutto il codice dell' HC-SR04 ?

tutto :smiley: