Hoch/Runterzähler

Hallo, es geht um einen Parkplatzzähler mit Ultraschallsensoren. Mit einem counter soll die Anzahl der freien Parkplätze angezeigt werden. Wenn ein Auto reinfährt soll 0 angezeigt werden und 1 wenn das Auto rausfährt.
Das Problem ist das nach jedem Durchgang die ein Parkplatz addiert wird. Wie könnte ich das lösen?
sketch:

int trigger1 = 10;
int echo1 = 9;

long dauer = 0;
long entfernung = 0;
int State = 0;
int Puls = 0;

int currentState = 0;
int previousState = 0;

bool counter = 0;

void setup()
{
  Serial.begin (9600);
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);


}
void loop()
{


  digitalWrite(trigger1, LOW);
  delay(5);
  digitalWrite(trigger1, HIGH);
  delay(10);
  digitalWrite(trigger1, LOW);
  dauer = pulseIn(echo1, HIGH);
  entfernung = (dauer / 2) * 0.03432;

  Serial.print("Anzahl freie P: ");
  Serial.println(counter);
  if (entfernung >= 7 || entfernung <= 0)
  {
    Serial.println("Parkplatz 1 frei");
    if (currentState != previousState) {
      if (currentState == 1) {
        counter = counter + 1;
        Serial.println(counter);
      }
    }
  }
      else
      {

        Serial.println("Parkplatz 1 besetzt");

      }
    
  
  delay(1000);




}

So? (ungetestet, aber kompiliert)

int trigger1 = 10;
int echo1 = 9;

long dauer = 0;
long entfernung = 0;
int State = 0;
int Puls = 0;

int currentState = 0;
int previousState = 0;

bool counter = 0;

void setup()
{
  Serial.begin (9600);
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
}
void loop()
{
  digitalWrite(trigger1, LOW);
  delay(5);
  digitalWrite(trigger1, HIGH);
  delay(10);
  digitalWrite(trigger1, LOW);
  dauer = pulseIn(echo1, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  Serial.print("Anzahl freie P: ");
  Serial.println(counter);
  if (entfernung >= 7 || entfernung <= 0)
  {
    if (currentState != previousState)
    {
      Serial.println("Parkplatz 1 frei");
      currentState = previousState;
      counter = 0;
    }
  }
  else
  {
    if (currentState != previousState)
    {
      Serial.println("Parkplatz 1 besetzt");
      currentState = previousState;
      counter = 1;
    }
  }
  delay(1000);
}

Um die Richtung eines Gegenstands zu erfassen braucht es 2 Sensoren. Der zeitliche Ablauf der Erfassung ergibt die Richtung.

In deinem Fall da Du einen Sensor verwendest, der den Abstand erfaßt könntest Du in einer Parkbucht erfassen ob das Fahrzeug einfährt (Distanz wird kleiner) oder ausfährt( Distanz wird größer) Dementsprechend weißt Du ob der Parkplatz frei oder besetzt ist. Andererseits kannst Du den sensor auch als Präsenzsensor verwenden. Ist etwas im vernünftigen bereich da dann ist der Platz besetzt ansonsten nicht.

Grüße Uwe

du schreibst

nur erläuterst du nicht, mit welcher Hardware du hoch zählst und mit welcher Hardware du runterzählst.

Wie Uwe schon angeregt hast, brauchst du entweder zwei Sensoren um eine Fahrtichtung zu erkennen, oder eine ausgeklügelte Programmlogik um ein Ein-/Ausfahren zu erkennen, oder drittens: zwei Separate sensoren - der eine bei der Einfahrt, der andere Bei der Ausfahrt.

Zeitnah beantworten kann man das nur wenn du eine schematische Zeichnung der Umgebungsbedingungen erstellst.

Ich wollte das nicht so kompliziert machen. Es soll raufzählen wenn der parkplatz frei ist. Also muss einfach die Bedingung (entfernung >= 7) erfüllt werden. Also gibt es einen Parkplatz und sobald der besetzt ist wird auf 0 runtergezählt.

Was willst Du da zählen?
Du kannst nur erkennen, ist belegt ? ist frei.
Das ist eigentlich ein bool.
So habe ich das doch oben angesetzt.

Dann brauchst Du aber für jeden Stellplatz einen Sensor.

Grüße Uwe

Nicht zwingend. Wenn die Gesamtanzahl Plätze bekannt ist und klar Einfahrt und Ausfahrt von Fahrzeugen erfasst werden können, dann ist das reines Zählen. Das eigentliche Problem dürfte die Erfassung von Fahrzeugen und nicht Personen und deren Richtung sein.
Evtl. sollte man sich noch Gedanken um Speicherung bei Stromausfall (z.B. FRAM) machen.

Gruß Tommy

Ja sowieso, ich habe vor 7 Sensoren anzuschließen. Ich brauche nur die if Funktion für den counter...

Count = 0;
for ( byte i=0; i<7; i++)
{
if (sensor[i] == 1)
 Count++;
}

oder kürzer

Count = 0;
for ( byte i=0; i<7; i++)
{
 Count += sensor[i] ;
}

Grüße Uwe

Wie schnell soll es zählen? Selbst wenn "es" nur jede Sekunde zählt, hast du in einer Stunde 3600 freie Plätze. Was ich eigentlich meine: Mit deiner Aufgabenbeschreibung ist es schwierig. Wohl auch für dich, die Tipps zu verstehen.

also wenn ich ein ein Parkplatz fahre ( z.b. Parkhaus ) geht eine Schranke hoch .

Fahre ich raus geht wieder eine Hoch .

wären 2 Sensoren . Punkt

baue ich mir jetzt auf ein normalen park platz mit nur einer einfahrt eine Lichtschranke ein, ebenso bei der ausfahrt . habe ich wieder 2 Sensoren .

ohne alle dem müsste ich jeden park platz der besetzt ist mit einer Art induktiv schleife überwachen und diese zählen.

( wie beim fest Blitzer eben )

Ein großer park platz hat 2-3 ein/ Ausfahrten und das müsste man auch bedenken .

Nö.

Der TO will nicht reinfahren.
Er will wissen, wieviele seiner (7) Parkplätze noch frei sind.
Dazu gibt es die Variante mit den US-Sensoren.
Stelle ich ein Auto auf einen der (7) Stellplätze, ist die gemessene Entfernung recht kurz und der Platz belegt.
Ist das Auto weg ist der Platz frei, weil eben ganz weit weg gemessen wird...

Jetzt:
Summe aller Sensoren.
Und darüber alle Messwerte.

Alles ganz einfach - aber der TO hat mich ignoriert. Las ich andere machen :wink:

ah ok ich dachte echt es geht um einen großen Parkplatz . mit so 50-200 autos . na da kannst das echt mit US- sensoren machen sind ja nur 7 :wink: . meine frage wäre was ist wenn jemand dort steht und eine raucht .... mhh

Ganz einfach. Rauchverbot. :smiley:

1 Like

Habs in der Zwischenzeit geschafft. Meine Benachrichtigungen waren ausgeschalten deshalb keine Antwort. Trotzdem danke :smiley:

Wie würde es mit 2 Sensoren funktionieren? Geht das mit einer for Schleife?
LG

#include <HCSR04.h>
HCSR04 hc1(10, 9);


int trigger1 = 10;
int echo1 = 9;

int dauer;
float entfernung;
unsigned long myMs;

bool P = false;
unsigned int counter = 0;

void setup() {

  Serial.begin (9600);
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
  
  pinMode(trigger2, OUTPUT);
  pinMode(echo2, INPUT);

  Serial.print("Anzahl freie P: ");
  Serial.println(counter);
}
void loop() {

  if (millis() - myMs > 100) {
    entfernung = hc1.dist();
    myMs = millis();
  }


  if (entfernung >= 7.0  && !P) {
    Serial.println(entfernung);
    counter += 1;
    P = true;
    Serial.print("Anzahl freie P: ");
    Serial.println(counter);
  }
  else if (entfernung < 5.0  && P) {
    Serial.println(entfernung);
    counter -= 1;
    P = false;
    Serial.print("Anzahl freie P: ");
    Serial.println(counter);
    delay(1000);
  }
}

Jeden Sensor abfragen. Aber sage mal...

Ist das Deine lib: GitHub - Martinsos/arduino-lib-hc-sr04: Arduino library for HC-SR04 ultrasonic distance sensor.

Glaube nicht, die sieht so aus:

#include <HCSR04.h>

HCSR04 hc(2, new int[6]{5, 6, 7, 8, 9, 10}, 6); //initialisation class HCSR04 (trig pin , echo pin, number of sensor)

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    for (int i = 0; i < 6; i++)
        Serial.println(hc.dist(i)); //return curent distance in serial for sensor 1 to 6
    delay(60);                      // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.
}

Dann ist es die: GitHub - gamegine/HCSR04-ultrasonic-sensor-lib: Arduino lib for HCSR04 ultrasonic sensor
Und das multi ist ja da schon bei.

Ich würde das nicht mit for() machen, sondern bei jedem Umlauf durch loop() einen Sensor weiter.

Vorschlag: - bereits mit 7 Sensoren

#include <HCSR04.h>

const uint8_t maxPlaces = 7;
uint8_t freePlaces = 7;
uint8_t lastFreePlaces = 0;
const uint8_t minDistance = 7; // Distance die unterschritten werden muss, um "belegt" zu erkennen
HCSR04 hc(2, new int[maxPlaces] {4, 5, 6, 7, 8, 9, 10}, maxPlaces);



void setup()
{
  Serial.begin (9600);
  Serial.print("Anzahl gesamte P: ");
  Serial.println(maxPlaces);
}
void loop()
{
  getFreePark();
  if (lastFreePlaces != freePlaces)
  {
    Serial.print(F("Freie Plätze: "));
    Serial.println(freePlaces);
    lastFreePlaces = freePlaces;
  }
}

void getFreePark()
{
  static uint32_t lastmillis = 0;
  static uint8_t measurePlace = 0;
  static uint8_t isPlaces = 0;
  if (millis() - lastmillis > 100)
  {
    if (hc.dist(measurePlace) < minDistance)
    {
      isPlaces++;
    }
    measurePlace++;
    lastmillis = millis();
  }
  if (measurePlace > maxPlaces)
  {
    freePlaces = isPlaces;
    isPlaces = 0;
    measurePlace = 0;
  }
}