Zweibefehle gleichzeitig abfragen

Wir haben in der Schule ein Projekt wo wir ein auto programmieren müssen das einen Ultraschallsensor vorne und einen an der rechen seite hat. Wenn beim vorderen Abstand der die Entfernung <10 ist soll er anhalten. beim Sensor an der rechten seite soll es wenn die entfernung >25 ist eine 90 grad drehung machen und sozusagen einparken. Das Problem liegt jetzt darin, dass es nicht beide Bedingungen gleichztitig abfragt sondern immer nur eine Bedingung erfüllt. kann uns dabei jemand helfen!!!

int SENDEN = 4;
int SENDEN2= 2;

// Pin für das vom Objekt reflektierte Signal
int ECHO = 3;
int ECHO2 = 1;

// Variable für die Speicherung der Entfernung
long Entfernung = 0;
long Entfernung2= 0;

//Gleichsterommotor 1
int GSM1 = 10;
int vor  = 9;
int ruck = 8;

//Gleichstrommotor 2
int GSM2 = 5;
int vor2  = 7;
int ruck2 = 6;

void setup() 
{
  pinMode(SENDEN, OUTPUT);
  pinMode(ECHO,   INPUT);
  pinMode(SENDEN2,OUTPUT);
  pinMode(ECHO2,  INPUT);
  pinMode(GSM1,   OUTPUT);
  pinMode(GSM2,   OUTPUT);
  pinMode(vor,    OUTPUT);
  pinMode(ruck,   OUTPUT);
  pinMode(vor2,   OUTPUT);
  pinMode(ruck2,  OUTPUT);

  // Seriellen Monitor starten
  Serial.begin(9600);


}

void loop() 
{

  // Sender kurz ausschalten um Störungen des Signal zu vermeiden
  digitalWrite(SENDEN, LOW);
  delay(5);
  digitalWrite(SENDEN2, LOW);
  delay(5);

  // Signal für 10 Micrsekunden senden, danach wieder ausschalten
  digitalWrite(SENDEN, HIGH);
  delayMicroseconds(10);
  digitalWrite(SENDEN, LOW);

  digitalWrite(SENDEN2, HIGH);
  delayMicroseconds(10);
  digitalWrite(SENDEN2, LOW);

  // pulseIn -> Zeit messen, bis das Signal zurückkommt
  long Zeit = pulseIn(ECHO, HIGH);
  long Zeit2= pulseIn(ECHO2,HIGH);


  // Entfernung in cm berechnen
  // Zeit/2 -> nur eine Strecke
  Entfernung = (Zeit / 2) * 0.03432;
  Entfernung2= (Zeit2 / 2) *0.03432; 

  digitalWrite(vor,HIGH);
    digitalWrite(vor2,HIGH);
    digitalWrite(ruck,LOW);
    digitalWrite(ruck2,LOW);
    analogWrite(GSM1, 200);
    analogWrite(GSM2, 200);



    if(Entfernung2 >25){

      
  digitalWrite(vor,LOW);        //wenn Parklücke erkannt dann stoppen
  digitalWrite(vor2,LOW);  
  digitalWrite(ruck,LOW);
  digitalWrite(ruck2,LOW);
  delay(500);

  digitalWrite(vor,HIGH);       //90° Drehung 
  analogWrite(GSM1,200);
  delay(950);
  digitalWrite(vor2,HIGH);      //in die Parklücke fahren
  analogWrite(GSM2,200);
  delay(1000);
  digitalWrite(vor,LOW);
  digitalWrite(vor2,LOW);

   

    }
    else if (Entfernung<10){
   digitalWrite(vor,LOW);
    digitalWrite(vor2,LOW);
    digitalWrite(ruck,LOW);
    digitalWrite(ruck2,LOW);
}
else{
   digitalWrite(vor,HIGH);
    digitalWrite(vor2,HIGH);
    digitalWrite(ruck,LOW);
    digitalWrite(ruck2,LOW);
    analogWrite(GSM1, 200);
    analogWrite(GSM2, 200);


}


 
}
  


das ist unser programm

Viele grüße Cybermorg

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Willkommen im Forum :wink:
Mit delay()wird das nicht funktionieren, dafür sind millis() da
Mall das lesen und anwenden.

Naja, was ist gleichzeitig? Im Abstand von ein paar Millisekunden ist ja gleichzeitig genug. Nur die riesen Delays (500, 950, 1000) müßen weg, denn in der Zeit kann er er keine erneute Messung machen. Die Delays werden mit millis() ersetzt.

Die delays sind aber für die drehung des autos zuständig. D.h sie sind ja dafür da, dass das auto weiß wie lange es drehen soll und wie lange es fahren soll wenn die bedingung erfüllt ist. Unser Problem ist es wie gesagt dass die if schleifen eigentlich überschneidend sein sollte. D.h wenn das auto zuerst ein hindernis erkennt soll es anhalten aber wenn es zuerst die parklücke erkennt soll es dort reinfahren. Und das Problem isr, dass es entweder einparkt aber auf keine hindernisse reagiert oder es auf hindernissr reagiert aber dann nicht einparkt wenn eine parklücke vorhanden ist.

LG Cybermorg

Wen die MCU im dellay hängt passiert Garnichts die wartet bis die Zeit abläuft.
Also wird nichts nix mit gleichzeitiger Abfrage, das muss! Blockadefrei gemacht werden.
Suche mall im Forum, ähnliche Sachen wurden hier schon beantwortet, schein so aus das die Schulen die gleiche Aufgaben haben :wink:

Hast Du dir die in Post #3 verlinkte Beschreibung durchgelesen und verstanden? Es geht ja nicht darum, notwendige Verzögerungen für deine Abläufe zu eliminieren. Aber sie müssen so realisert werden, dass der Sketch an der Stelle nicht stehenbleibt und Däumchen dreht. Denn dann kann er sich um nichts anderes kümmern.

www.if-schleife.de

Angenommen, du schaust nach vorne und siehst der Weg ist frei. Dann kannst du fahren. Du schaust wieder nach vorne. Jetzt ist ein Kind auf die Straße gelaufen --> Bremsen

Du musst also während des Fahrens so oft wie möglich nachschauen, ob etwas passiert. Genau das macht man in einer Statemaschine. Keine Delays verwenden. Da bist du im Blindflug.

Das geht so nicht. Das muss nacheinander passieren, da sich die US Signale überlappen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.