Come leggere i dati da 2x HC-SR04 ultrasuoni contemporaneamente?

Ciao a tutti, mi sono presentato nella sezione dedicata anche se, dopo mesi che vi seguo avrei bisogno di un aiuto.
Da settimane sto realizzando un circuito di misurazione attraverso 2 moduli ad ultrasuoni HC-SR04.

La mia difficoltà nasce da quando ho inserito un secondo modulo è nel capire in cosa sbaglio nel seguente sketch.

Quello che vorrei realizzare è uno sketch dove:
**1:**premuto il pulsante vengono effettuate 3 misure dal sensore SX e DX(ultrasuoni).
**2:**di queste 3 misure viene fatta una media per sensore.
**3:**sul display avrò a SX e DX una misura in millimetri del sensore SX e DX.
**4:**Il ciclo si ferma finche non ripremo il pulsante.
**5:**A fine ciclo memorizza su sd card il valore letto.

Al momento nello sketch mancano i punti 2,3,5 il punto 5 al momento non è prioritario.

Riscontro un malfunzionamento nella lettura dei valori, ovvero nel monitor seriale non riesco a distinguere il sensore sinistro dal destro nonostante nello sketch abbia contrassegnato con una S e una D i due sensori. Ne leggo solo uno.

Nello sketch non ho inserito il display ma nello schema di fritzing ho già preparato i futuri collegamenti. Chiedo quindi se decidete di aiutarmi a capire dove sbaglio di non modificarmi i pin assegnati almeno che non ci sia un requisito a livello di collegamento obbligatorio.
In basso a sinistra c’e uno schizzo della barra su cui sono installati i sensori.

const int TRIGS_PIN = 9;     //Sensore SX
const int ECHOS_PIN = 10;    //Sensore SX
const int TRIGD_PIN = 11;    //Sensore DX
const int ECHOD_PIN = 12;    //Sensore DX
int  val = 0; 
#define P1 8  //Pulsante che mi avvia la lettura
 
void setup() {
  Serial.begin(9600);
  pinMode(P1, INPUT);
  pinMode(TRIGS_PIN,OUTPUT);
  pinMode(ECHOS_PIN,INPUT);
  pinMode(TRIGD_PIN,OUTPUT);
  pinMode(ECHOD_PIN,INPUT);
}

void loop(){
     long duration, distancemm;
    val = digitalRead(P1);  // legge il valore dell'input e lo memorizza
  if (val == HIGH) {         // controlla che l'input sia HIGH
     for(int x = 0; x < 3; x++)     //per quante volte deve ripetersi il ciclo (3)
     
   
//CODICE RELATIVO AL SENSORE SINISTRO   
  digitalWrite(TRIGS_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGS_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGS_PIN, LOW);
  duration = pulseIn(ECHOS_PIN,HIGH);
// fine codice sensore sinistro

//CODICE RELATIVO AL SENSORE DESTRO
    digitalWrite(TRIGD_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGD_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGD_PIN, LOW);
  duration = pulseIn(ECHOD_PIN,HIGH);
// fine codice sensore destro
  distancemm = duration / 2.91 / 2 ;  // conversione tra tempo e distanza (2,91 X i mm ---- 29,1 x i cm)
 
  if (distancemm <= 0){
    Serial.println("Fuori misura");
  }
  else {
    Serial.print(distancemm);
    Serial.print("mm misurati");
    Serial.println();
    delay(1000);
          if (val == LOW) {
  }
}
}
}

Grazie anticipatamente a chi vorrà aiutarmi

Tu leggi prima il sensore sinistro, poi leggi il sensore destro. Solo che lo fai usando la stessa variabile duration Quindi il primo sensore è come se non lo leggessi

duration = pulseIn(ECHOS_PIN,HIGH);

poi

duration = pulseIn(ECHOD_PIN,HIGH);

Che valore sará nella variabile? il primo, il secondo o la somma/media/differenza??

Inoltre a questo problema sei sicuro che l' eco di uno non fa scattare l' altro? Anche se arriva un eco dal primo oggetto nelle vicinanze del sensore non vuol dire che non ci siano altri echi di altri ogetti in secondo piano. Ciao Uwe

Grazie per le dritte, intanto pastrocchiando con lo sketch il problema sensore sinistro e destro è stato risolto, Effettuo la lettura SX e DX dopo 1,5 secondi lo ristampo. Ora sto impazzendo con il ciclo FOR, letto su molti forum, tutorial e manuali, il problema e che a me lo fa all’infinito e non si blocca dopo 3 cicli. Non so se dipenda dal tipo di sensore, ma con un altro sketch che ho realizzato questo problema non si verifica.

const int TRIGS_PIN = 9;     //Sensore SX
const int ECHOS_PIN = 10;    //Sensore SX
const int TRIGD_PIN = 11;    //Sensore DX
const int ECHOD_PIN = 12;    //Sensore DX
long durationS, distancemmS;  //variabile sensore SX
long durationD, distancemmD;  //variabile sensore DX
#define P1 8  //Pulsante che mi avvia la lettura

void setup() {
  Serial.begin(9600);
  pinMode(P1, INPUT);
  pinMode(TRIGS_PIN,OUTPUT);
  pinMode(ECHOS_PIN,INPUT);
  pinMode(TRIGD_PIN,OUTPUT);
  pinMode(ECHOD_PIN,INPUT);
}
void loop(){
    for (int i = 0; i < 3; i++) 
    {
    Serial.print("i = ");
    Serial.println(i);
  digitalWrite(TRIGS_PIN, LOW);   //CODICE RELATIVO AL SENSORE SINISTRO   
  delayMicroseconds(2);
  digitalWrite(TRIGS_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGS_PIN, LOW);
  durationS = pulseIn(ECHOS_PIN,HIGH);
  distancemmS = durationS / 2.91 / 2 ; // fine codice sensore sinistro
  digitalWrite(TRIGD_PIN, LOW);   //CODICE RELATIVO AL SENSORE DESTRO
  delayMicroseconds(2);
  digitalWrite(TRIGD_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGD_PIN, LOW);
  durationD = pulseIn(ECHOD_PIN,HIGH);
  distancemmD = durationD / 2.91 / 2 ;  // fine codice sensore destro 

  if (distancemmD <= 0)
    Serial.println("Fuori misura");
  else 
    Serial.print("SENSORE SX ");
    Serial.print(distancemmS);
    Serial.print(" mm misurati");
    Serial.print('\n');
    delay(250);   //delay tra Sensore Sx e Dx
    Serial.print("SENSORE DX ");
    Serial.print(distancemmD);
    Serial.print(" mm misurati");
    Serial.println();
    Serial.print('\n');
    delay(1500);  // delay prima della prossima lettura
    }
}

momentaneamente ho tolto il pulsante per vedere se almeno dopo 3 letture si blocca o meno ma niente da fare, il serial monitor continua a stampare le letture. dove ho sbagliato?
**uwefed ** la somma di 3 letture del sensore di sinistra mi danno una media, stessa cosa con il sensore di destra. Riguardo al problema eco non dovrebbe esserci perche i sensori sono distanti circa piu di mezzo metro e sono posti in modo parallelo l’uno all’altro, misurano l’altezza dell’oggetto posto al centro dell’asta (nel primo post ho inserito un allegato se vuoi farti un idea di com’è costruito questo strumento).

Una cosa che non risolve il Tuo problema:

if (distancemmD <= 0)
    Serial.println("Fuori misura");
  else
    Serial.print("SENSORE SX ");
    Serial.print(distancemmS);

Non so se é voluto il else si rifeisce solo al
Serial.print("SENSORE SX ");
Il resto viene eseguito sempre indipendentemente dalla condizione del if.

Riguardo al problema eco non dovrebbe esserci perche i sensori sono distanti circa piu di mezzo metro e sono posti in modo parallelo l’uno all’altro, misurano l’altezza dell’oggetto posto al centro dell’asta

appunto, hai 2 echi; il primo del ogetto e un secondo eco del pavimento. Il secondo eco potrebbe sentire il secondo sensore ultrasuoni.

Ciao Uwe

Grazie a tutti per il supporto e consigli che mi date

AGGIORNAMENTO
Ho inserito un delay tra il sensore SX e DX in modo da evitare interferenze di eco, quindi quando il Sensore SX è acceso l’altro ancora non è in funzione viceversa.

Ho abbandonato l’idea di fare la media, non so perchè ho misure piu reali senza fare le medie.

Uwe la parte “else” l’ho lasciata di proposito perchè se i sensori misurano fuori dal campo mi stampa un messaggio, viceversa se sono nel range mi stampa il valore rilevato.
Riguardo interferenze eco non ci sono in quanto l’altezza che devo misurare è di pochi cm e i sensori sono installati su un asta di circa 50 cm quindi l’angolo in cui viaggiano gli ultrasuoni non dovrebbero aver problemi, ma a livello di programmazione ho inserito un delay per evitare che il ping di uno vada sull’altro.

La parte con il ciclo FOR ora funziona, (mi ero dimenticato come una semplice parentesi mancante creasse un problema banale :o )

Stasera provo a installare l’LCD per vedere tutto in stand alone.

Quello che vorrei realizzare è uno sketch dove:
1:premuto il pulsante vengono effettuate 3 misure dal sensore SX e DX(ultrasuoni).
2:di queste 3 misure viene fatta una media per sensore.
3:sul display avrò a SX e DX una misura in millimetri del sensore SX e DX.
4:Il ciclo si ferma finche non ripremo il pulsante.
5:A fine ciclo memorizza su sd card il valore letto.

Guadavo alcuni esempi per memorizzare i file txt sul modulo sd card reader, molti parlano di memorizzare e leggere le variabili da sd, avete qualche esempio da indirizzarmi cosi me lo studio un po? Praticamente dovrebbe creare un semplice file chiamato “misure.txt” e salva le misure fatte di conseguenza. In teoria salva e basta, non mi serve che vada a leggere altre informazioni. Se poi ad ogni avvio di arduino può creare un file nuovo ancora meglio.

Intanto vi posto il codice casomai fosse interessato qualcuno

const int TRIGS_PIN = 9;     //Sensore SX
const int ECHOS_PIN = 10;    //Sensore SX
const int TRIGD_PIN = 11;    //Sensore DX
const int ECHOD_PIN = 12;    //Sensore DX
long durationS, distancemmS;  //variabile sensore SX
long durationD, distancemmD;  //variabile sensore DX
int  P1 = 8;  //Pulsante che mi avvia la lettura

void setup() {
  Serial.begin(9600);
  pinMode(P1, INPUT);
  pinMode(TRIGS_PIN,OUTPUT);
  pinMode(ECHOS_PIN,INPUT);
  pinMode(TRIGD_PIN,OUTPUT);
  pinMode(ECHOD_PIN,INPUT);
}
void loop(){
  if(digitalRead(P1)==HIGH){
    for(int i=0;i<1;i++) {
  delay(1000);
  digitalWrite(TRIGS_PIN, LOW);   //CODICE RELATIVO AL SENSORE SINISTRO   
  delayMicroseconds(2);
  digitalWrite(TRIGS_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGS_PIN, LOW);
  durationS = pulseIn(ECHOS_PIN,HIGH);
  distancemmS = durationS / 2.91 / 2 ; // fine codice sensore sinistro
  delay(200);
  digitalWrite(TRIGD_PIN, LOW);   //CODICE RELATIVO AL SENSORE DESTRO
  delayMicroseconds(2);
  digitalWrite(TRIGD_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGD_PIN, LOW);
  durationD = pulseIn(ECHOD_PIN,HIGH);
  distancemmD = durationD / 2.91 / 2 ;  // fine codice sensore destro 

  if (distancemmS <= 0)
    Serial.println("Fuori misura");
  else 
    delay(10);
    Serial.print("Altezza SX:");
    Serial.print(distancemmS);
    Serial.print(" mm");
    Serial.print('\n');
    
    Serial.print("Altezza DX:");
    Serial.print(distancemmD);
    Serial.print(" mm");
    Serial.println();
    Serial.print('\n');
    delay(3000);  // delay prima della prossima lettura
    }
}
}