mehrere Ultraschallsensoren gleichzeitig auslesen

Mein versuch war mehrere Ultraschallsensoren gleichzeitig auszulesen. Für zwei Sensoren war das relativ einfach. Da die Sachen sehr Zeitkritisch sind wollte ich die Sensoren gleichzeitig auslesen. Ich benutze die HC-SR04 Sensoren. Die Sensoren geben nicht gleichzeitig das Signal aus, weswegen ich versucht habe dafür zu sorgen, dass sie trotzdem alle ausgewertet werden. Ich wollte nun Alle Ultraschallsensoren gleichzeitig auslesen. Geht das auch einfacher zu programmieren oder muss ich alle Möglichkeiten einzeln programmieren?

const int pingPin1 = 22;      // pins fuer Ultraschall
const int echoPin1 = 23;
const int pingPin2 = 24;      // pins fuer Ultraschall
const int echoPin2 = 25;
const int pingPin3 = 30;      // pins fuer Ultraschall
const int echoPin3 = 31;
const int pingPin4 = 32;      // pins fuer Ultraschall
const int echoPin4 = 33;

int relais1 = 51;
int relais2 = 53;

unsigned long time;
unsigned long time1;
unsigned long time2;
unsigned long time3;
unsigned long time4;
long cm;

int a;      //Zeile 20

void setup()
{
  pinMode(pingPin1,OUTPUT);
  pinMode(echoPin1,INPUT);
  pinMode(pingPin2,OUTPUT);
  pinMode(echoPin2,INPUT);
  pinMode(pingPin3,OUTPUT);
  pinMode(echoPin3,INPUT);
  pinMode(pingPin4,OUTPUT);
  pinMode(echoPin4,INPUT);
  digitalWrite(pingPin1, LOW);
  digitalWrite(pingPin2, LOW);
  digitalWrite(pingPin3, LOW);
  digitalWrite(pingPin4, LOW);
  pinMode(relais1,OUTPUT);
  pinMode(relais2,OUTPUT);
  Serial.begin(9600);
}
                                      //Zeile 40
void loop()
{
  a=2;
  digitalWrite(pingPin1, HIGH);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(10);                    //Ultraschallsensor Signal zum messen geben
  digitalWrite(pingPin1, LOW);
  digitalWrite(pingPin2, LOW);
  
  while(a==2) //Anfang des Auslesen der 1.beiden Ultraschallsensoren
  {
    if (digitalRead(echoPin1)==1)
    {
      time1=micros();
      while(a==2)
      {
        if(digitalRead(echoPin1)==0)
        {
          time1=micros()-time1;
          while(a==2)
          {
            if(digitalRead(echoPin2)==1)
            {
              time2=micros();
              while(a==2)
              {
                if(digitalRead(echoPin2)==0)
                {
                  time2=micros()-time2;
                  a=1;
                }
              } 
            }
          }
        }
        if(digitalRead(echoPin2)==1)
        {
          time2=micros();
          while(a==2)
          {
            if(digitalRead(echoPin2)==0)
            {
              time2=micros()-time2;
              while(a==2)
              {
                if(digitalRead(echoPin1)==0)
                {
                  time1=micros()-time1;
                  a=1;
                  }
                }
              }
              if(digitalRead(echoPin1)==0)
              {
                if(digitalRead(echoPin1)==0)
                {
                  time1=micros()-time1;
                  while(a==2)
                  {
                     if(digitalRead(echoPin2)==0)
                     {
                       time2=micros()-time2;
                       a=1;
                     }
                  }
                }
              }
            }
          }
      
      }
    }
    if (digitalRead(echoPin2)==2)
    {
      time2=micros();
      while(a==2)
      {
        if(digitalRead(echoPin2)==0)
        {
          time1=micros()-time2;
          while(a==2)
          {
            if(digitalRead(echoPin2)==1)
            {
              time1=micros();
              while(a==2)
              {
                if(digitalRead(echoPin1)==0)
                {
                  time2=micros()-time1;
                  a=1;
                }
              } 
            }
          }
        }
        if(digitalRead(echoPin1)==1)
        {
          time1=micros();
          while(a==2)
          {
            if(digitalRead(echoPin1)==0)
            {
              time2=micros()-time1;
              while(a==2)
              {
                if(digitalRead(echoPin2)==0)
                {
                  time1=micros()-time2;
                  a=1;
                  }
                }
              }
              if(digitalRead(echoPin1)==0)
              {
                if(digitalRead(echoPin1)==0)
                {
                  time1=micros()-time1;
                  while(a==2)
                  {
                     if(digitalRead(echoPin2)==0)
                     {
                       time2=micros()-time2;
                       a=1;
                     }
                  }
                }
              }
            }
          }
      }
    } 
  }                  //Ende des Auswerten der 1.Beiden Ultraschallsensoren
  if(time1<time2)
  {
    time=time1;
  }
  else
  {
    time=time2;
  }
  
  cm = (time * 340) / 20000;
  Serial.println(time);
  Serial.println(cm); 

}

Ehrlich gesagt, verstehe ich deinen Sketch nicht. Dieser ist sehr unübersichtlich und es fehlen die Kommentare, damit außenstehende auch nachvollziehen können, was du da machst.

Zudem ist er schwer lesbar, da du diesen Quote-Tags gesetzt hast und nicht wie üblich in Code-Tags.
Das kannst du auch nachträglich noch ändern.

Ein Beispiel eines einfachen Beispiel-Sketches:

const int trigger = 7;
const int echo =    6;
long dauer =        0;
long entfernung =   0;

void setup() {
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

void loop() {
  digitalWrite(trigger, LOW);
  delayMicroseconds(5);
  digitalWrite(trigger, HIGH);          // Senden des Pulse
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);          // Empfang des US-Pulse
  entfernung = (dauer / 2) / 29.1;      // Enfernungsberechnung

  // Auswertung
  if (entfernung >= 500 || entfernung <= 0) {
    Serial.println("Kein Messwert");
  }
  else {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  delay(1000);
}

Teste ihn mal.

Du solltest aber darauf achten, dass die Sensoren sich nicht gegenseitig beeinflussen und nacheinander senden bzw. empfangen.
Dazwischen muss eine Pause sein, die groß genug ist, um diese Beeinflussung zu verhindern.

Das Hauptproblem bei mehreren Ultraschallsensoren ist daß sie sich gegenseitig stören. Der eine empfängt das Echo oder das 2-3 Echo des anderen und mißt somit nichts verwertbares.
Erst wenn der Schall/Echo des einen Sensors abgeklungen ist kann der nächste messen.
Grüße Uwe

Gleichzeitig macht der Arduino eh nichts. Alle wieviel Sekunden brauchst du den eine Messung von allen?

ElEspanol:
Gleichzeitig macht der Arduino eh nichts.

Mit Port-Direktzugriffen kann man zumindest 8Sensoren auf einmal einlesen und auch Triggern. Die Frage ist nur, ob man wegen der Echo-Problematik sinnvolle Werte bekommt.