Sensore ultrasuoni hc-sr04 rileva molto spesso 0 cm di distanza

Ho usato il mio sensore hc-sr04 per far girare in un verso o nell’altro due motori DC, da un pò ho riscosso un problema. Da poco tempo ho notato che il mio sensore rileva molte volte 0 cm dove ovviamente io per 0 cm ho scritto che i miei motori devono girare in senso opposto per “cambiare direzione” quindi molte volte quando metto in funzione tutto mi rimane per bloccarsi e girare all’infinito come se si trova un’ostacolo a 0 cm. (tutti i collegamenti Hardware sono funzionali e verificati)
Questo è il codice:

#include <NewPing.h>

//#include <LiquidCrystal.h>
//#define PIN_TRIGP 4
//#define PIN_ECHOP 6
#define PIN_TRIG 7
#define PIN_ECHO 2
#define MAX_DIST 3000
NewPing datoregistrato(PIN_TRIG,PIN_ECHO,MAX_DIST);
//LiquidCrystal lcd(15, 14, 13, 6, 5, 4);

//NewPing datoregistrato2(PIN_TRIGP,PIN_ECHOP,MAX_DIST);
int ENA=8; 
int IN1=9; 
int IN2=4; 
int IN3=12; 
int IN4=11; 
int ENB=13;
unsigned int uS;
float cm;
void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
 Serial.begin(115200);

/*pinMode(14, OUTPUT);
pinMode(15, OUTPUT);

lcd.begin(16, 2);

  lcd.print("Tempo passato:");*/
}

void loop() {
 Serial.print("");
  
 Serial.print(cm);
 Serial.println("");

  delay(100);
   uS = datoregistrato.ping();
   cm = datoregistrato.convert_cm(uS);

  /* uS = datoregistrato2.ping();
   cm = datoregistrato2.convert_cm(uS);*/
if(cm>20 || cm==0.00)
 { 

analogWrite(ENA, 255);
analogWrite(ENB, 255);
digitalWrite(IN1,LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
 }

if (cm>=10 && cm<=20)
 {
analogWrite(ENA, 160); //(int)(200*(cm-15)/35+50));
analogWrite(ENB, 160);  //(int)(200*(cm-15)/35+50));
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
  }                                                                                                             



if (cm>=2 && cm <10) 
   {
analogWrite(ENA, 150);
analogWrite(ENB, 150);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);

} 

  }

Un grazie in anticipo a chi mi aiuterà.

Non ho capito: if(cm>20 || cm==0.00)
Se maggiore di 20 cm oppure 0 ? che senso ha ?

Comunque, secondo quel sensore NON ha senso dia 0, quando da 0 vuol dire che ha avuto problemi a rilevare, quindi 0 è da scartare.

siccome quando il sensore rilevava 0 cm i motori cominciavano a girare uno nel senso opposto dell'altro allora io volevo farli girare nello stesso senso quando rilevava 0... ma io non voglio proprio che rilevi 0.

Prova a convincerlo :o

A parte gli scherzi, può essere che il sensore non sempre riesca a rilevare qualcosa, scarta quella lettura.

ahahah

se rimuovo || cm==0 i miei due motori staranno fermi senza girare, io ho pensato che il sensore abbia qualche difetto

oppure i due gireranno nel senso opposto, dipende da cosa avevo scelto che facessero quando rilevava 0