Schranke mit Ultraschallsensor + Zeitverzögerung con 20 Sekunden

Moin

Ich möchte mit meinem Arduino Uno R3 und einem Ultraschallsenso HC SR 4 eine Schranke bauen.
Diese Schranke soll zweckentfremdet werden für einen Simulierten Boxenstop ( Kyosho Mini Z RC-Auto´s) von ca. 20 Sekunden.

Soll heiß. Ein Auto fährt am Ultrschall Sensor vorbei und eine Schranke schließt. Diese soll dann für ca. 20 Sekunden geschlossen bleiben und dann wieder automatisch öffnen.
Schranke und Sensor sind ca. 1Meter auseinander.

Wer kann mir für mein Problem einen Sketch aufzeigen?

Gruß Max


Hallo MadMax2017

Herzlich Willkommen im weltbesten Arduino Forum.

Nimm eine Suchmaschine deiner Wahl und befrage das WWW nach 'Tutorial HC SR4 und Servo'.

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Moin und Danke für die schnelle Antwort.
Genau das habe ich versucht aber ohne Erfolg. Einen Sketch habe ich vielleicht aber was mir fehlt, ist wie ich den Abstand bestimmen kann und wo ich den Eintrag für die Zeitverzögerung vornehme.

Gruß Max

Poste den aktuellen Sketch , gut formuliert, mit wohltemperierten Kommentaren und in so genannten Code-Tags "< code >", und einen Schaltplan um zu sehen, wie wir helfen können.

hast du Abstand nicht gerade genannt? 1m ?

dein sketch tut nix anderes so kann man dann überall.

loop(){
  AbstandMessSchleife();
  delay(20000);
}

oder

loop(){
  if( 110 > AbstandMessen() ) delay(20000);
}

Ich könnte das.

@my_xy_projekt würde es vermutlich sogar machen, wenn es ein klein wenig mehr Info gäbe.
Allerdings sind die Andeutungen in #1 viel zu vage.

1 Like

Vollkommen uninteressant.
Szenario:

  • Sensor wird durchfahren,
    • Zeitpunkt merken
    • Schranke schliessen
  • Zeitpunkt liegt 20 Sekunden zurück? -> Schranke öffnen

Eine einfache Schrittkette.

  • messen, bis Fahrzeug erkannt
  • Schranke schliessen, messen einstellen, Zeit merken
  • Zeit abgelaufen Schranke öffnen und fange an von vorn.

Noch nicht.
Spätestens wenn das rote Ampellicht oder das blaue für die Ausfahrt kommt, ist hier

alles Makulatur :wink:

genau. und dann erscheint hier "Ich möchte mein Sketch um ein LED erweitern. bin Anfänger. DRINGEND" und wir sind wieder im Geschäft. oder dir ist lieber ein Monster-Skecht für alle Fälle, für alle mögliche Ausbauvarianten, so dass Läute nie wieder kommen?

Genau dann, wenn der Anfänger ganz schnell sein delay weg haben muss, weil das sonst nicht funktioniefrt, dann schreibt irgendwer das Ding komplett neu und der Anfänger fragt sich: Warum???

Man kann alles und jedes in Einzelvariablen packen, Du kannst auch Variablen numerieren und auf array's verzichten.
Du kannst im Code sogar magische Zahlen für Pins verwenden.
All das funktioniert auch wenn der Code erweitert wird.
Aber delay() eben nicht - abgesehen von vereinzelten Ausnahmen.

Und ja: Ich schreibe auch mal längeren Code, der anfangs unverständlich ist. Möchte mir damit die Möglichkeit offen lassen, das später weiterführen zu können.

Ich schreibe öfters Unsinn, aber sowas schon lange nicht gelesen, dafür solltest du sogar Härzhien bekommen :wink:

das ist schon mal guter Anfang. darauf hebe ich ein.... Prost!

du hast deine Vorlieben und Prinzipien, schön. aber ich habe meine auch und die sind nicht zufällig meine geworden. Es erfordert mehr Aufwand sie zu ändern als damals sie ein zu eignen. Genau so wie Deutsch(oder andere Sprache) jede Person hat eigene Ausdrucksweise, in Programmiersprache ist es nicht anders. Darum solltest du dich nicht ärgern wenn jemand Sketch vorschlägt nach eigenem Ermäßen.

ich schreibe überhaupt nicht wenn es mir unsinnig vorkommt. So verschieden sind manche Menschen. Ich frag mal Moderator ob es möglich ist alles Offtopic zu beseitigen.

Da wird noch dran gebaut werden müssen, da ich die Aufgabe nur nach meiner Ansicht versucht habe in ein paar Zeilen zu setzen.
Aber ich wollte die Erwartungen von @michael_x nicht enttäuschen :wink:

Von daher: mach was draus. Ich habs - hoffentlich ausreichend - kommentiert.

// Forensketch Schranke mit Pause
// https://forum.arduino.cc/t/schranke-mit-ultraschallsensor-zeitverzogerung-con-20-sekunden/1126143

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming
const byte triggerPin = 3;
const byte echoPin = 4;
const unsigned int inDist = 20;                            // Distance in cm für Einfahrterkennung
const unsigned int outDist = 120;                          // Ab wann wieder frei ist...
const unsigned long waitTime = 1000UL * 20;                // Wartezeit -> in ms!
const unsigned long checkIntervall = 20;                   // Zeit in ms
const byte ctlPin = LED_BUILTIN;

const bool toOpen = true;                                  // Hilfskonstanten 
const bool toClose = !toOpen;

enum {einfahrt, waitclose, ausfahrt};                      // Zustände für StateMachine
byte status = einfahrt;

unsigned int lastTime = 0;                                 // Zeitmerker
void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial << (F("\r\nStart...\r\n")) << endl;
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  pinMode(ctlPin, OUTPUT);
  digitalWrite(ctlPin, LOW);
}

void  loop()
{
  schranke();
}

void schranke()
{
  switch (status)
  {
    case einfahrt:
      if (distance() < inDist)               // Wenn unterschritten, einfahrt belegt
      {
        lastTime = millis();                 // Auslösezeit merken
        gate(toClose);                       // Funktionsaufruf
        status = waitclose;                  // Nächsten Schritt
      }
      break;
    case waitclose:    
      if (millis() - lastTime > waitTime)    // Wartezeit abgelaufen
      {
        gate(toOpen);                        // Funktionsaufruf
        status = ausfahrt;                   // Nächster
      }
      break;
    case ausfahrt:
      if (distance() > outDist)              // Wenn überschritten ist Ausfahrt frei
      {
        status = einfahrt;                   // Einfahrt kann wieder auslösen...
      }
      break;
  }
}

unsigned int distance()                      // Funktion gibt die Distanz in cm zurück
{
  static unsigned long lastCheck = 0;        // Merker wann das letzte Mal gemessen
  static unsigned int dist = 0;              // Rückgabewert
  if (millis() - lastCheck > checkIntervall) // Zeit abgelaufen
  {
    lastCheck = millis();                    // neu merken
    // SR04 zum arbeiten bewegen ;)
    digitalWrite(triggerPin, LOW);
    delayMicroseconds(5);
    digitalWrite(triggerPin, HIGH);
    delayMicroseconds(15);
    digitalWrite(triggerPin, LOW);
    word distanz = pulseIn(echoPin, HIGH, 26000);
    distanz = distanz / 0.58;                // Umrechnen
    // Ausgeben.... Ob das so stimmt muss überprüft werden
    Serial << distanz / 100 << ',' << distanz % 100 << F(" cm") << endl;
    dist = distanz / 100;                    // Rückgabewert der Funktion
  }
  return dist;                               //
}
//
void gate(const bool schranke)               // Je nach Eingangswert
{
  digitalWrite(ctlPin, schranke);            // passiert was
  Serial << F("Gate: ") << (schranke == toClose ? "closed" : "open") << endl;
}

Moin

Viele Dank für die vielen Antworten.

Hier mal mein Sketch den ich von Cults3D bekommen habe.


/* ArduinoBlocks.com /
/
Project: Proyecto Barrera /
/
Author: Carlos P */

#include <Servo.h>

Servo servo_8;

double fnc_ultrasonic_distance(int _t, int _e){
unsigned long dur=0;
digitalWrite(_t, LOW);
delayMicroseconds(5);
digitalWrite(_t, HIGH);
delayMicroseconds(10);
digitalWrite(_t, LOW);
dur = pulseIn(_e, HIGH, 18000);
if(dur==0)return 999.0;
return (dur/57);
}

void setup()
{
pinMode(2, OUTPUT);
pinMode(3, INPUT);
servo_8.attach(8);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);

Serial.begin(9600);
Serial.flush();
while(Serial.available()>0)Serial.read();

}

void loop()
{

if ((fnc_ultrasonic_distance(2,3) <= 30)) {
	servo_8.write(140);
	digitalWrite(4, LOW);
	digitalWrite(5, HIGH);
	digitalWrite(6, HIGH);
	delay(300);
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(6, HIGH);
	delay(3000);
}
else {
	servo_8.write(35);
	digitalWrite(4, HIGH);
	digitalWrite(5, LOW);
	digitalWrite(6, LOW);
}

Serial.println(fnc_ultrasonic_distance(2,3));

}


Meine Bauteile sind:
Aduino R3 Uno
HC-SR04 Ultraschall Sensor
Einen einfachen Servo
3 LED´s

So sieht meine Verkabelung aus. Einen Fehler hatte ich schon ausgemacht.
Servo attach 8 war nicht korrekt.

Nochmals zu meinem Problem. Ich möchte eine Breite messen bzw. ein Ansprechverhalten vom Sensor erzeugen von ca.20 cm. ( Fahrbreite der Einfahrt) .

Der Sensor bildet die Einfahrt bzw. die Startprozedur. Sobald ein Auto durch den Sensor fährt soll ca. 1 Meter weiter die Schranke schließen.
Das RC Auto fährt ca. 1 Meter bis zur Schranke.
Jetzt möchte ich eine Zeitverzögerung von 20-25 Sekunden haben bis die Schranke wieder automatisch öffnet.

Wo finde ich diese beiden Angaben in " MEINEM " Sketch.

Gruß und einen schönen Abend noch

Überhaupt nicht.
Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

In dem Konstrukt dort oben fehlt eine Menge.
Daher ist es unwahrscheinlich, das das so funktioniert.
Du hast da noch eine Ampel drin?
Was soll die wann machen?

Hi

Es funktioniert ja soweit.
Die LED‘s leuchten bei Aktivierung.
Wenn die Schranke herunter geht leuchtest eine LED rot. Geht die Schranke hoch leuchtest die grüne LED.
Und dazwischen also währen der Pause eine blaue LED.

Das ist aber nicht so wichtig mit den LED‘s.

Mein Problem ist, dass der Sensor sehr empfindlich ist. Deshalb möchte ich den Wirkkreis auf 15-20 cm begrenzen.

Am wichtigsten ist für mich die Zeitverzögerung von 20-25 Sekunden.

Ich hoffe ich konnte es einigermaßen erklären was ich mochte mit der Schaltung ?

Gruß