In If Befehl mit Ultraschallsensor HC-SRC04 distanzmessen

Hallo Zusammen

Ich habe das Problem, dass in einem “if” Befehl der Ultraschallsensor nicht funktioniert, bzw. er misst in einer “if” Schleife(und auch anderen Befehlen) keine Distanz mehr. ich habe vor dem void Setup eine Funktion erstellt, um die Distanz zu messen. Im void loop funktioniert die Funktion auch so wie sie sollte, sobald ich jedoch in einer anderen Funktion oder in einer Schleife die Distanz messen will, misst der Ultraschallsensor nicht, auf dem Serial Monitor wird immer 0 angezeigt. Ich denke das Problem ist, das die Funktion nicht global ist, darum habe ich eine plumpe Methode versucht und immer den Ganzen Teil der Distanzmessfunktion im loop geschrieben, aber auch dann misst der Sensor in Schleifen und Funktionen nicht. Nun habe ich keine Ahnung mehr, warum nicht gemessen wird, bin noch ein Anfänger mit dem Arduino und dem Programmieren.

Ich bin euch dankbar für eure Antworten.

Lieber Gruss aus der Schweiz
Rino

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <Servo.h>


Servo myservo;

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

Adafruit_DCMotor *frontright = AFMS.getMotor(1);
Adafruit_DCMotor *backright = AFMS.getMotor(2);
Adafruit_DCMotor *frontleft = AFMS.getMotor(3);
Adafruit_DCMotor *backleft = AFMS.getMotor(4);


const int trigpin=11;
const int echopin=10;

const int stopppin=3;

long duration;
int distance;

int d1;         // Variablen um Distanzen beim Servodrehen unterscheiden zu können
int d2;
int d3;
int d4;
int d5;
int d6;
int d7;
int d8;
int d9;

int groessterabstand;



int Zeit;

int pos = 0;

int Richtung;      //irgendein wert ausser 0 oder 1

int drehzeitl;
int drehzeitr;

int distanzrechts;    //wird verwendet um abbiege Richtung zu ermitteln
int distanzlinks; 

long distanzmessen(){                   // einfache funktion um distanz zu messen
    duration = pulseIn(echopin, HIGH);
    distance = duration*0.03432/2;

    return distance;
}

long servoposition(int grad){
  myservo.write(grad);
}

long servodrehen(){

    myservo.write(0);
    duration = pulseIn(echopin, HIGH);
    d1 = duration*0.03432/2;
    Serial.print(d1);              
    

    myservo.write(22);
    duration = pulseIn(echopin, HIGH);
    d2 = duration*0.03432/2;
    Serial.print(d2);              
    
    groessterabstand = max(d1, d2);
  
    myservo.write(45);
    duration = pulseIn(echopin, HIGH);
    d3 = duration*0.03432/2;
    Serial.print(d3);              
    
    groessterabstand = max(groessterabstand, d3);

    myservo.write(67);
    duration = pulseIn(echopin, HIGH);
    d4 = duration*0.03432/2;
    Serial.print(d4);              

    groessterabstand = max(groessterabstand, d4);

    myservo.write(90);
    duration = pulseIn(echopin, HIGH);
    d5 = duration*0.03432/2;
    Serial.print(duration);              

    groessterabstand = max(groessterabstand, d5);

    myservo.write(112);
    duration = pulseIn(echopin, HIGH);
    d6 = duration*0.03432/2;
    Serial.print(d6);              

    groessterabstand = max(groessterabstand, d6);

    myservo.write(134);
    duration = pulseIn(echopin, HIGH);
    d7 = duration*0.03432/2;
    Serial.print(d7);              

    groessterabstand = max(groessterabstand, d7);
  
    myservo.write(156);
    duration = pulseIn(echopin, HIGH);
    d8 = duration*0.03432/2;
    Serial.print(d8);              

    groessterabstand = max(groessterabstand, d8);

    myservo.write(180);
    duration = pulseIn(echopin, HIGH);
    d9 = duration*0.03432/2;
    Serial.print(d9);              

    groessterabstand = max(groessterabstand, d9);

    Serial.print(groessterabstand);
  
    myservo.write(90);

    return (groessterabstand);
  }

void geradefahren(){
      frontright->run(FORWARD);
      frontleft->run(FORWARD);
      backright->run(FORWARD);
      backleft->run(FORWARD);
}
void rueckwaertsfahren(){
      frontright->run(BACKWARD);
      frontleft->run(BACKWARD);
      backright->run(BACKWARD);
      backleft->run(BACKWARD);
}
void anhalten(){
      frontright->run(RELEASE);
      frontleft->run(RELEASE);
      backright->run(RELEASE);
      backleft->run(RELEASE);
}
void linksdrehen(){
      frontright->run(FORWARD);
      frontleft->run(BACKWARD);
      backright->run(FORWARD);
      backleft->run(BACKWARD);
      
}
void rechtsdrehen(){
      frontright->run(BACKWARD);
      frontleft->run(FORWARD);
      backright->run(BACKWARD);
      backleft->run(FORWARD);
       
}

void setup() {
  // put your setup code here, to run once:
  AFMS.begin();

  pinMode(trigpin, OUTPUT);
  pinMode(echopin, INPUT);

  pinMode(stopppin, INPUT);

  Serial.begin(9600);

  Zeit=0;

  AFMS.begin();
  frontright->setSpeed(100); // Speed von 0 bis 255 (max)
  backright->setSpeed(100);
  frontleft->setSpeed(100);
  backleft->setSpeed(100);

  myservo.attach(9);
  myservo.write(90);
}

void loop() {
  
    digitalWrite(trigpin, LOW);
    delay(5);

    digitalWrite(trigpin, HIGH);
    delay(10);
    digitalWrite(trigpin, LOW);

    distanzmessen();
    
        
    if(distance > 10){
      
      geradefahren();
    }
    if(distance < 10){
      
      anhalten();

      distanzmessen();
       
      //servodrehen();

      servoposition(180);             //linke seite
      distanzlinks = distanzmessen();
      
      
      servoposition(0);
      distanzrechts = distanzmessen();
      

      servoposition(90);
      ;
      
      if (distanzlinks > distanzrechts){

        linksdrehen();
        delay(900);
      }

      if (distanzrechts){

        rechtsdrehen();
        delay(900);
      }
        
              
      }      
    }

Es gibt keine “if-Schleife”.
Also wo ist dein Problem.

Ohne deinen Sketch zu sehen, können wir dir deine Fehler nicht zeigen.

Also poste den hier in Code-Tags, Schaltfläche </> oben links im Editorfenster verwenden.

Hi

Du wirfst einige, in der Arduino-Welt vorhandene, Begriffe lustig durcheinander.
Funktion(); passt
Methode ist 'nur' eine Funktion einer Klasse (heißt nur anders).
void ist nur der Rückgabetyp einer Funktion/Methode - void=gibbet nicht (also Funktion gibt Nichts zurück - z.B. loop() und setup() haben keinen Rückgabewert).

Da wird irgend etwas Anderes faul sein - wenn Deine Funktion 1x funktioniert, sollte Diese auch ein weiteres Mal, von 'wo Anders' aufgerufen, funktionieren - da die Funktion eigenständig ist.

IF ist keine Schleife - wurde ja schon gesagt (in der IF wird Nichts wiederholt, daher ist's keine Schleife).

Ob Du Anfänger bist, oder nicht - lässt sich ganz grob von Deiner Frage ableiten - wäre uns wohl aufgefallen :wink:

MfG

So wie ich es sehe, ist dieser Thread wiedermal nur SPAM.
Der TO hat hier schon 3 Fragen eingestellt und war sich bisher immer zu fein auf unsere Antworten zu reagieren.

Hi

Nuja - zumindest hängt Er immer noch am ersten Problem fest - vll. doch nicht die beste Methode, Seine Probleme lösen zu wollen :wink:

MfG

PS: Muß ich mir jetzt angewöhnen, für jeden Thread erst zu recherchieren, Wer der Fragesteller nun ist und wie oft ich von Diesem schon genatzt wurde?
Perfiede Welt …
In einem Nachbar-Thread kam gerade das Wort Helfer-Syndrom auf :slight_smile:

Dann sollte man sich diesen User merken und auf seine Problemstellungen nicht mehr antworten.

Gruß Tommy

Tommy56:
Dann sollte man sich diesen User merken und auf seine Problemstellungen nicht mehr antworten.

Gruß Tommy

Da wäre eine weitere Merker-Position ähnlich wie Karma, nur in die andere Richtung doch hilfreich.
Ok, ist sehr OT....

Hallo Zusammen

Tut mir leid, dass ich so schlecht rüber komme, habe euch allen persönlich über "report to moderator" geantwortet. Hoffe wir können das klären und ich bin euch allen für eure Hilfe sehr dankbar. Ich sehe euer Problem leider nicht ganz, ich hoffe jedoch, dass ihr mir doch weiterhin helfen werdet.

Freundlicher Gruss

Was hat deine Antwort mit dem Moderator zu tun ?

Und wir habe kein Problem, wollen nur denen helfen, die hier Problem melden.
Dazu gehört einfach (lt. Forum-Etikette) auch dass man auf Antworten eine Reaktion des Fragenden erhält.
Das ist bisher von dir nicht erfolgt. Da werden wir dann natürlich auch hellhörig.

Das heißt, er hat sich erst mal vorsorglich beim Moderator über uns beschwert.
Ich finde, das ist eine komische Art, um Hilfe zu bekommen. Aber das ist ja sein Problem, wir müssen ja nicht.

Gruß Tommy

Tommy56:
Das heißt, er hat sich erst mal vorsorglich beim Moderator über uns beschwert.
Ich finde, das ist eine komische Art, um Hilfe zu bekommen. Aber das ist ja sein Problem, wir müssen ja nicht.

Gruß Tommy

Ach....das habe ich ja so nicht verstanden.

Dann wirds ja demnächst ne dicke Rüge geben. :wink:

Ich habe angenommen, die Antwort wird an euch gesendet, mein Fehler, wollte euch nicht melden oder so was. Dachte nur ich kann euch so direkt antworten.

Wer lesen kann, ist klar im Vorteil.

Gruß Tommy

Ja das habe ich verstanden. Habt ihr euch jetzt genug ausgetobt mich zu roasten??

Ich habs wahrscheinlich deutlich vermasselt hier auf dem Forum, seit ihr trotzdem so nett und schaut euch ihr mein Sketch an? Ich wäre wirklich sehr froh, wenn ihr mir bei meinem Problem helfen könnt, ich kann es wirklich nicht selbst lösen.

Gruss

Dein Sketch im Ursprungsposting sah vorhin auch noch anders aus.
Es ist auch kein gutes Vorgehen, still und heimlich den Code auszutauschen.

Auf was sollen wir uns denn nun beziehen? Dein Text passt ja wohl nicht mehr zu dem Sketch von hier.

Gruß Tommy

Ansonsten sehe ich folgenden grundlegenden Fehler:

  • Du triggerst nur am Anfang vom Loop den US-Impuls und willst dann mehrfach messen (ich würde das Triggern in die Distanzmessung mit hinein nehmen)

In wieweit servo.write blockiert, weiß ich jetzt nicht. Wenn nicht, ist der Servo sofort nach dem Befehl aber garantiert noch nicht in der Position, in der Du die Distanz messen willst.

Gruß Tommy

Hi

Deine Funktion distanzmessen() mach nicht, was der Name anpreist.
DAS hättest Du auch als Einzeiler mit pulseIn im Sketch selber stehen lassen können.

Die Messung wird ausgelöst, indem an TRIGGER eine HIGH-LOW-Flange gesendet wird.
WARUM setzt Du nicht den Trigger-Pin auf HIGH und dann auf LOW INNERHALB der Funktion, Die Dir die Entfernung zurück geben soll?

Ohne Trigger macht der Sensor Nix - in Deinem Sketch triggerst Du den Sensor genau 1x, danach versuchst Du nur per pulseIn die Länge des nicht vorhandenen Signal zu messen.

Denke, die Beispiele zum HC-SR04 sehen hier 'etwas' anders aus.
Auch das Datenblatt könne Einem erzählen, wie der Sensor funktioniert.

MfG

ich kanns dir kurz erklären. Der sketch bringt ein Fahrzeug solange zum fahren, bis der US an der Front einen abstand kleiner als 10cm erkennt. Wenn es soweit ist, soll ein Servo den US jeweils auf die Rechte und die linke Seite drehen und an beiden stellen den Abstand bis zum nächsten Objekt messen. Wenn der Servo jedoch gegen links7rechts zeigt, misst der Sensor immer 0, dies wird jedenfalls auf dem seriellen monitor angezeigt. Eine 0 bedeutet ja, dass eine Fehlmessung vorliegt oder? Ich verstehe nun nicht ganz warum ser Sensor nicht misst, sobald der Servo dreht, ich sehe nämlich keine Verbindung im Programm zwischen dem Servo und dem Sensor. Ist es so verständlich??

Freundlicher Gruss

PS ich habe einfach den ganzen Sketch hochgeladen, ist noch merh drin, was aber nicht wichtig für diese frage hier ist

Wenn man solche Sachen ändert, dann teilt man das mit.

Ansonsten hast Du bereits von 2 Leuten mitgeteilt bekommen, was falsch ist und ignorierst es völlig.

Gruß Tommy

Hi Tommy, hi postmaster-ino

Das stimmt, ich triggere nur einmal, werde dies anpassen und schauen ob es dann funktioniert. vielen herzlichen dank.

Gruss und schöner Sonntag Abend