Vier HC-sr 04 Ultraschallsensoren an nur 5 Pins geht das?

guten tah pins sind meist mangelware

mit 4 sensoren sind schonmal 8 pins weg

frage geht es auch wenn ich die 4 snesoren mit nur einem pin triggere und dann die einzelnen auslese

NICHT gleichzeitig

<code>

const int trigPin = 4;
const int echoPinVL = 5;
const int echoPinVR = 14;
const int echoPinHL = 13;
const int echoPinHR = 12;

float durationVL, distanceVL;
float durationVR, distanceVR;
float durationHL, distanceHL;
float durationHR, distanceHR;

void setup() {
  pinMode(trigPin, OUTPUT); // TRIGGER
  pinMode(echoPinVL, INPUT); // vorne Links
  pinMode(echoPinVR, INPUT);
  pinMode(echoPinHL, INPUT); // hinten Links 
  pinMode(echoPinHR, INPUT);
 
  pinMode(echoPinHR, INPUT);

  Serial.begin(9600);
}
void tick(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

}

void loop() {
 tick();  //  init sensors
 
  durationVL = pulseIn(echoPinVL, HIGH);
  distanceVL = (durationVL*.0343)/2;
  Serial.print("Distance_VL: ");
  Serial.println(distanceVL);
  delay(20);

 tick();  //  init sensors
 
  durationVR = pulseIn(echoPinVR, HIGH);
  distanceVR = (durationVR*.0343)/2;
  Serial.print("Distance_VR: ");
  Serial.println(distanceVR);
  delay(20);

 tick();  //  init sensors
 
  durationHL = pulseIn(echoPinHL, HIGH);
  distanceHL = (durationHL*.0343)/2;
  Serial.print("Distance_HL: ");
  Serial.println(distanceHL);
  delay(20);

 tick();  //  init sensors
 
  durationHR = pulseIn(echoPinHR, HIGH);
  distanceHR = (durationHR*.0343)/2;
  Serial.print("Distance_HR: ");
  Serial.println(distanceHR);
  delay(20);

  delay(150);
}

</code>

danke

Das kann funktionieren, wenn Ihre Ultraschallsensoren in klar getrennten Bereichen senden, andernfalls könnten Sie eine Wellenfront von einem anderen Sender empfangen als dem, den Sie auslesen.

Ich kann mir nicht vorstellen, das es dann funktioniert, da das Timing nicht mehr stimmt. Du brauchst schon für jeden Sensor die zugehörigen Pins.
Nimm einen Controller mit mehr Pins oder für andere Funktionen einen I2C-Portexpander.

Ja.
Das delay mit 20ms ist evtl. etwas zu kurz um Echos zu vermeiden, aber das musst ausprobieren.
Und drauf achten, was der TriggerPin an Strom braucht, damit Du nicht den Chip grillst.

Moin @bmbbsr ,

mit Multiplexern/Demultiplexern geht’s auf jeden Fall besser.

Hier ein Beispiel: Nicht schön, aber selten

siehe Wokwi: https://wokwi.com/projects/438736643634636801

Sketch:

/*
  Forum: https://forum.arduino.cc/t/vier-hc-sr-04-ultraschallsensoren-an-nur-5-pins-geht-das/1401048
  Wokwi: https://wokwi.com/projects/438736643634636801

  2025/08/08
  ec2021

*/

constexpr byte S0 {2};
constexpr byte S1 {3};
constexpr byte S2 {6};
constexpr byte COMOut {4};
constexpr byte COMIn {5};
constexpr byte numSensors {6};

void setup() {
  Serial.begin(115200);
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);

  pinMode(COMOut, OUTPUT);
  pinMode(COMIn, INPUT);
}

void loop() {
  for (int i = 0; i < numSensors; i++) {
    trigger(i);
    // Read the result:
    int duration = pulseIn(COMIn, HIGH);
    Serial.print("Sensor No. ");
    Serial.print(i + 1);
    Serial.print("\tDistance [cm]: ");
    Serial.println(duration / 58);
    delay(500);
  }

}

void trigger(int no) {
  digitalWrite(S0, no & 0x01);
  digitalWrite(S1, no & 0x02);
  digitalWrite(S2, no & 0x04);
  digitalWrite(COMOut, HIGH);
  delayMicroseconds(10);
  digitalWrite(COMOut, LOW);
}

Fünf Pins für bis zu acht Sensoren …

Ist nur als sehr schnell geschriebenes Beispiel gedacht und müsste für eine Anwendung noch überarbeitet werden.

Die ICs kosten nicht viel ….

Gruß
ec2021

Das Problem bei gleichzeitiger Ansteuerung mehrere Ultraschallsensoren ist das gegenseitige Empfangen des Echos. Ist das geometrisch unmöglich kann es funktionieren daß Du alle 4 mit dem gleichen Triggersignal ansteuerst und nur ein Echosignal auswertest.
Alternativ könntest Du am Echo-Pin jedes Sensors einen NPN Transistor anschließen und somit einen Open Collektor Ausgang bekommen, die Du zusammenschalten kannst. So hast Du 4 Triggerausgänge und einen gemeinsamen Echo Eingang. So kannst Du jeden Sensor einzeln ansteuern und es gibt keine Interferenz gegeneinander.
Im unenstehenden Schaltbeispiel schaltest Du alle Vout zusammen und benutzt nur einen RL.


Grüße Uwe

ja, aber zwischen dein einzelnen Lesungen genug Zeitabstand lassen (um echos von der Messung davor auszuschließen).

DANKE

es Funktioniert toll mit 25ms ableseabstand die sensoren sind 45 grad nach ausen

somit keinerlei gegenseitige beeinflussung nur die ZEIT

KLASSE Beispiele für die antworten hier

Prima, dass es so einfach funktioniert! Das hängt sicher auch mit den äußeren Gegebenheiten Deiner Anwendung zusammen.

Ich habe das Ansteuern und Auslesen der Ultraschallsensoren in eine kleine Klasse umgesetzt, so dass die E-Messung mit einem einfachen Aufruf in der loop() abgehandelt werden kann.

/*
  Forum: https://forum.arduino.cc/t/vier-hc-sr-04-ultraschallsensoren-an-nur-5-pins-geht-das/1401048
  Wokwi: https://wokwi.com/projects/438987677757600769

  2025/08/11
  ec2021

*/

constexpr uint8_t trigPin {4};
constexpr uint8_t echoPin[] = {5, 14, 13, 12};
constexpr size_t numSensors = sizeof(echoPin) / sizeof(echoPin[0]);
constexpr int nameLen {4};
constexpr char Name[numSensors][nameLen] = {"VL", "VR", "HL", "HR"};

class usSensorClass {
  private:
    uint8_t echoPin;
    uint8_t triggerPin;
    float distance = 0;
    void trigger() {
      digitalWrite(triggerPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(triggerPin, LOW);
    }
  public:
    void init(uint8_t ePin, uint8_t tPin) {
      echoPin = ePin;
      triggerPin = tPin;
      pinMode(echoPin, INPUT);
      pinMode(triggerPin, OUTPUT);
      digitalWrite(triggerPin, LOW);
    };
    float getDistance() {
      trigger();
      float duration = pulseIn(echoPin, HIGH);
      distance = (duration * .0343) / 2;
      return distance;
    };
};

usSensorClass usSensor[numSensors];

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < numSensors; i++) {
    usSensor[i].init(echoPin[i], trigPin);
  }
}

void loop() {
  for (int i = 0; i < numSensors; i++) {
    Serial.print("Distance "); Serial.print(Name[i]); Serial.print(":\t");
    Serial.println(usSensor[i].getDistance());
    delay(25);
  }
  delay(150);
}


Zum Testen: https://wokwi.com/projects/438987677757600769

Ist natürlich nicht zwingend, aber es macht die Sache übersichtlicher ..

Weiterhin viel Spaß mit Arduino und umzu ...
ec2021

Warum über Zwischenarrays gehen? Und der Name ist doch auch ein Attribut der Klasse, oder?

So etwas in der Art vielleicht?

class usSensorClass {
  private:
    const char* name;
    uint8_t echoPin;
    uint8_t triggerPin;
    float distance = 0;

    void trigger() {
      digitalWrite(triggerPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(triggerPin, LOW);
    }

  public:
    usSensorClass(const char* n, uint8_t ePin, uint8_t tPin)
      : name(n), echoPin(ePin), triggerPin(tPin) {}

    void init() {
      pinMode(echoPin, INPUT);
      pinMode(triggerPin, OUTPUT);
      digitalWrite(triggerPin, LOW);
    }

    float getDistance() {
      trigger();
      float duration = pulseIn(echoPin, HIGH);
      distance = (duration * .0343) / 2;
      return distance;
    }

    const char* getName() const { return name; }
};

usSensorClass usSensor[] = {
  {"VL",  5, 4},
  {"VR", 14, 4},
  {"HL", 13, 4},
  {"HR", 12, 4}
};

void setup() {
  Serial.begin(115200);
  for (auto &sensor : usSensor) sensor.init();
}

void loop() {
  for (auto &sensor : usSensor) {
    Serial.print("Distance "); Serial.print(sensor.getName()); 
    Serial.print(":\t");
    Serial.println(sensor.getDistance());
    delay(25);
  }
  delay(150);
}

1 Like

Warum aber auch nicht? Viele Wege führen nach Rom... :wink:

Aber Danke für die Erinnerung an diese Möglichkeit!

Gruß
ec2021