Parksensor (differ. prog.)

Hallo zusammen

Ich brauche ein Hilfe

Ich habe eine Parksensor zusammen gebaut mit Arduino nano.

Funktionier als Super ,nur beim Ausschalten des Rotes LED warte ich 300ms

wenn das Wert im cm gleicht ist also zum z.b immer 8cm (Auto Parkier).

Leider Wert je nach Länge ca.1 bis 2cm ungenau und springt hin und her .

Wie kann im Programmschreiben wenn der Wert 10cm also (Auto Parkier) ein Differenz ±3cm

Rote LED ausschalten .

Danke für Antwort

int trigger=7;

int echo=6;

long dauer=0;

long entfernung=0;

int LEDrot=12;

int LEDgruen=9;

long entfernung_alt=0;

long delayCnt = 0;

void setup()

{

Serial.begin (9600);

pinMode(trigger, OUTPUT);

pinMode(echo, INPUT);

pinMode(LEDrot, OUTPUT);  

pinMode(LEDgruen, OUTPUT);

}

void loop()

{

  digitalWrite(trigger, LOW);

  delay(5);

  digitalWrite(trigger, HIGH);

  delay(10);

  digitalWrite(trigger, LOW);

  dauer = pulseIn(echo, HIGH);

  entfernung = (dauer/2)/29;

    Serial.print(entfernung);

    Serial.println(" cm");

  if (entfernung != entfernung_alt)

  {

    digitalWrite(LEDrot,LOW);

    digitalWrite(LEDgruen,LOW);

    delayCnt = 0;

    entfernung_alt = entfernung;

    if (entfernung >= 0 && entfernung <= 10)

    {

      digitalWrite(LEDrot, HIGH); 
  }

    else if (entfernung > 10 && entfernung <= 20)

    {

      digitalWrite( LEDgruen , HIGH);

    }

  }

  else

  {

    delayCnt++;
  if (entfernung >= 0 && entfernung <= 10)
  {
    if (delayCnt >= 300)
    {
      digitalWrite(LEDrot, LOW);
    }

  }

}

Welchen Sensor verwendest Du? Gib uns bitte einen Link.

Es wäre schön, wenn Du die unnötigen Leerzeilen aus Deinem Sketch entfernen würdest, dadurch wäre er besser lesbar.

Gruß Tommy

Hallo

HC SR04

https://www.electroschematics.com/8902/hc-sr04-datasheet/

Also bei 1 bis 2 cm Differenz bist Du bei dem Teil doch schon ziemlich gut.

Gruß Tommy

Hi

Schau Dir die Median-Klasse an, bringt die SharpDistSensor-Library mit.
Dort trägst Du Deine Messwerte ununterbrochen ein und liest den daraus gebildeten Median aus.
DAS ist ab jetzt Dein Messwert, mit Dem Du die LEDs ansteuerst oder Wartezeiten startest - Das riecht wieder nach einem Endlichen Automaten/State-Maschine - ein Beispiel dazu findest Du in der IDE unter ‘Blink_without_delay’.

Folgende Files werden includet, wenn Du die SharpDisSensor-Library ‘zum Sketch hinzufügst’ - Du brauchst nur die MedianFilter, die Andere kannst Du raus löschen oder ausremmen.

#include <MedianFilter.h>
#include <SharpDistSensor.h>

//global, also außerhalb der Funktionen, vor setup()
const byte maxmessung = 31;   //aus 31 Messungen wird der Median gezogen (das ist KEIN Mittelwert)
MedianFilter mittelwert(maxmessung, 100);     //(XX,YY) XX Anzahl Messwerte, möglichst ungerade, YY Vorbelegung

//in loop oder der Funktion, Die die Werte bereit stellt
mittelwert.in(messwert);  //den Messwert zur Zahlengruppe beigeben, aus Der der Median bestimmt wird (gibt auch den aktuellen Median zurück, man kann Sich also eine Abfrage sparen)

//dort, wo der Median gebraucht wird
byte medianwert=mittelwert.out();

Meine, der MedianFilter rechnet intern mit INT (also Minus 32-Tausend-Batsch bis Plus 32-Tausend-Batsch).
Wenn Du mehr brauchst, müsstest Du die Klasse umschreiben.
In meinen Beispielen komme ich mit 8 oder 16 Bit Vorzeichenlosen Zahlen (byte und uint16_t - kA, wie’s beim Arduino sich nennt, ggf. unsigned int) aus.

MfG