Ultrasonic HC-SR04

Salve a tutti , sto tentando di costruire ( simulare) un assistente parcheggio con arduino uno e il sensore HC-SR04.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

const int TrigPin = 8;
const int EchoPin = 7;
int buzzer = 13;
int led = 9;
float cm;
void setup()
{
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
}
void loop()
{
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);

  cm = pulseIn(EchoPin, !(LOW)) / 58.0; 
  cm = (int(cm * 100.0)) / 100.0; 
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(100);

  if (cm > 20)

  { lcd.setCursor(0, 0);
    lcd.print("Dist : ");
    lcd.print(cm);
    lcd.print("cm");
    delay(100);
    //   digitalWrite(buzzer, LOW);
    //    lcd.clear();
  }

  else if (cm < 20 )
  {
    lcd.setCursor(0, 0);
    lcd.print("Dist : ");
    lcd.print(cm);
    lcd.print("cm");
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 1500);
    delay(50);
    digitalWrite(buzzer, LOW);
    noTone(buzzer);
  }
  
  else
  {
    lcd.setCursor(0, 0);
    lcd.print("Dist : " );
    lcd.print(cm);
    lcd.print("cm");
    delay(100);
    //lcd.clear();
  }
  if (cm < 10)
  {

    digitalWrite(buzzer, LOW);
    noTone(buzzer);
    delay(30);
    digitalWrite(buzzer, HIGH);
    tone(buzzer, 2500);
  }
  if (cm < 20)
  {
    lcd.setCursor(0, 0);
    lcd.print("Dist : ");
    lcd.print(cm);
    lcd.print("cm");
    digitalWrite(led, HIGH);
    delay(100);
    digitalWrite(led, LOW);
  }
  else
  {
    lcd.setCursor(0, 0);
    lcd.print("Dist : ");
    lcd.print(cm);
    lcd.print("cm");
    delay(100);
    lcd.clear();
  }
  if (cm < 20)
  {
    lcd.setCursor(0, 1);
    lcd.print("Stop!Stop!Stop! ");
  }





}

Il mio problema è che che se accendo arduino e davanti al sensore vi è qualche cosa ( fino a 200 cm) tutto va bene , nel momento in cui sposto il sensore dove non vi sono ostacoli , impazzisce e inizia a segnare 0. fin qui potrebbe andarmi bene visto che oltre i 2 mt non avrebbe senso, il problema è che ricreando di nuovo un ostacolo rimane continuamente a 0 cm. per far si che si ripigli devo scollegare la tensione e ricollegarla.

Mi sapete dare una spiegazione ??? oppure c’è un errore nella programmazione ??

Grazie.

Il trigger lo poni LOW per 2μs, poi lo riporti HIGH per 10μs quindi di nuovo LOW.

Iimmagino che il primo ritardo serva ad impedire un continuo invio del burst, ma mi sembra troppo piccolo: ti suggerisco di portarlo a 50μs.

A parte questo, esiste la nuova libreria NewPing più efficiente che risolve alcuni problemi:

http://playground.arduino.cc/Code/NewPing