Utiliser deux capteurs à ultrasons HC-SR04 simultanément

Bonjour !

Comme projet de fin d’année, je souhaite réaliser un quizz sur Processing, lequel serait relié à un Arduino. Les “buzzers” seraient des capteurs à ultrasons, des buzzers sans-contact, si l’on préfère.

Ils sont au nombre de deux, mais voilà, après près de une semaine de recherche, impossible de faire marcher les deux en même temps. Le premier me donne la bonne valeur, tandis que le deuxième m’affiche encore et toujours, 0.

- j’utilise aussi un capteur d’humidité et de température DHT11, pour améliorer la précision de la mesure, il n’a rien à voir avec les capteurs à ultrasons -

J’ai en effet essayé beaucoup de code, de manières différentes, mais toujours la même issue. Voici le code que j’ai en place pour le moment : (trouvé ici , par ailleurs)

#include <Adafruit_Sensor.h>



#include <NewPing.h>
#include <DHT.h>


#define DHTPIN 7
#define DHTTYPE DHT11
#define TRIGGER_PIN_1 2
#define ECHO_PIN_1 3
#define TRIGGER_PIN_2 4
#define ECHO_PIN_2 5
#define MAX_DISTANCE 400

int buttonValue; // Stores analog value when button is pressed

NewPing sonar1(TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE);

float hum;
float temp;
float duration1;
float duration2;
float distance1;
float distance2;
float soundsp;
float soundcm;
int iterations=5;


DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(9600);
  dht.begin();
  
}

void loop()
  { 
  delay(1000);
    hum = dht.readHumidity();
    temp = dht.readTemperature();
    soundsp = 331.4 + (0.606 * temp) + (0.0124 * hum);
    soundcm = soundsp / 10000;
     
  duration1 = sonar1.ping_median(iterations);
  delay(500);
  
  duration2 = sonar2.ping_median(iterations);

  distance1 = (duration1 / 2) * soundcm;
  distance2 = (duration2 / 2) * soundcm;
   
    
    Serial.print("Distance 1: ");
 
    if (distance1 >= 400 || distance1 <= 2) {
    Serial.print("Out of range");
    }
    else {
    Serial.print(distance1);
    Serial.print(" cm ");
    }
    
    Serial.print("Distance 2: ");
 
    if (distance2 >= 400 || distance2 <= 2) {
    Serial.print("Out of range");
    }
    else {
    Serial.print(distance2);
    Serial.print(" cm");
    }
  
  Serial.println(" ");




  buttonValue = analogRead(A0); // Read analog value from A0 pin

  // For 1st button:
  if (buttonValue >= 927 && buttonValue <= 935) {
    Serial.println(1, DEC);
  }
  // For 2nd button:
  else if (buttonValue >= 971 && buttonValue <= 979) {
    Serial.println(2, DEC);
  }
  // For 3rd button:
  else if (buttonValue >= 1000  && buttonValue <= 1008) {
    Serial.println(3, DEC);
  }
  // For 4th button:
  else if (buttonValue >= 1010  && buttonValue <= 1018) {
    Serial.println(4, DEC);
  }
}

Si vous avez quelconque idée ou proposition, je les prendrai avec plaisir ! Merci :slight_smile:

Alors bonsoir,
Je comprends pas:

Un buzzer ça fait du bruit
Comment tu remplaces un buzzer par des capteurs????
Ou alors tu parles du champignon sur lequel on appuie?
Il sert à quoi le capteur d'humidité? Oo

On jette un seau d'eau quand on a la réponse? ^^ roh je rigole
J'aurais mis un capteur de clap moi, avec des micros... Ou des tilts...

Oups, par buzzer j'entends bien ce gros bouton sur lequel on appuie, et qui bip.

Sauf que là, le buzzer ça serait un capteur -> si la main de la personne passe en dessous d'une certaine distance, du genre 20cm, alors c'est comme si elle avait pressé le buzzer. Et s'accompagne alors un son, comme quoi la personne doit répondre à la question.

Pour le capteur d'humidité, il faut se référer au lien donné (je me suis trompé de lien, ici, plutôt).

If you’re designing a device that is to be used outdoors or in an unusually hot or cold environment you might want to take into account the fact that the speed of sound in air varies with temperature, air pressure and humidity. Since the speed of sound factors into our HC-SR04 distance calculation this could affect our readings if the temperature was a lot hotter or colder than room temperature.

Pour la méthode utilisée pour le buzzer, il précise :

When using multiple sensors one obvious consideration is that you need to keep the signal emitted by one sensor from being picked up and measured by another sensor. The easiest way to accomplish this is to simply pulse the trigger on one sensor and wait until you receive the echo back before proceeding to the next sensor.

Mais ça ne fonctionne pas!

En permutant les deux capteurs, le second marche?

Les deux sont fonctionnels, oui!

Ah ok, j’avais pas lu le lien. A mon avis, à 20cm, c’est négligeable. C’est bien à quelques mètres ou si tu veux un relevé précis. Là, je m’en passerais, parce que les deux joueurs sont logés à la même enseigne…

Bon, et finalement, ça marche?

AntoninA:
Les deux sont fonctionnels, oui!

Finalement, non, toujours pas. Bizarre.

Tu as des delay() dans ton code. Il cadencent tes mesures, elles devraient se faire le plus vite possible ou cadencées sur le même timer et lancées en même temps.

Je pense que les variables duration1 et 2 devraient être des unsigned ont et non des float

Toujours rien. J'ai passé le delay en assez bas (20 ms) et les distance1&distance2 en unsigned int.

Toujours out of range pour le second capteur !

Les deux capteurs sont ils orientés dans la même direction ?

Nop! Pas d'interférence possible, normalement vu comment je les ai placés

Je vous transmet une image de mon montage :

https://www.noelshack.com/2018-20-4-1526577824-arduino.jpg

Tu utilises newping, et cette bibliothèque propose un exemple avec 15 capteurs : est-ce que tu t'en es inspiré ?

  • Si oui, tu as certainement un problème hard (branchement, alim, que sais-je ?)
  • Si non, je te conseille de reprendre son code, avec 2 capteurs au lieu de 15, d'enlever tous les autres boutons et capteurs et de tester un montage le plus simple possible (Arduino et les 2 capteurs)
    Si cette solution marche, alors tu ajoutes le DHT22, tu testes, puis un bouton, tu testes, puis les autres boutons...

Je viens d'essayer avec newping :

à priori, le branchement avec deux capteurs fonctionne.

Je vous tiens au courant, et merci ! :wink:

C’est bon! (un des deux capteurs était inefficace, comme quoi…)
Désolé pour le dérangement.

Je vous poste le code, si jamais :

#include <TimerFreeTone.h>


#include <NewPing.h>

#define SONAR_NUM     2 // Number or sensors.
#define MAX_DISTANCE 200 // Max distance in cm.

int buttonValue;
NewPing sonar[SONAR_NUM] = { // Sensor object array.
  NewPing(3, 2, MAX_DISTANCE),
  NewPing(9, 8, MAX_DISTANCE),
};

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
    delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
    Serial.print(i);
    Serial.print("=");
    Serial.print(sonar[i].ping_cm());
    Serial.print("cm ");
    if (sonar[i-1].ping_cm() < 25 && sonar[i-1].ping_cm() > 2.5) {
      Serial.print("55555");
      TimerFreeTone(12, 100, 250, 10);
    }
   else if (sonar[1+i].ping_cm() < 25 && sonar[i+1].ping_cm() > 2.5) {
    Serial.print("666666");
    TimerFreeTone(12, 250, 250, 10);
   }
  }
  Serial.println();

    buttonValue = analogRead(A0); // Read analog value from A0 pin

    // For 1st button:
    if (buttonValue >= 927 && buttonValue <= 935) {
      Serial.println("1");
    }
    // For 2nd button:
    else if (buttonValue >= 971 && buttonValue <= 979) {
      Serial.println("22");
    }
    // For 3rd button:
    else if (buttonValue >= 1000  && buttonValue <= 1008) {
      Serial.println("333");
    }
    // For 4th button:
    else if (buttonValue >= 1010  && buttonValue <= 1018) {
      Serial.println("4444");
    }
    delay(100);
  }


// On envoie les données à Processing !

Content pour toi ! :slight_smile:

Christian_R:
En permutant les deux capteurs, le second marche?

AntoninA:
Les deux sont fonctionnels, oui!

WTF?

La base c'est de tester les composants, les isoler et les tester avec un pti programme.
Si un composant marche, on le remplace par un autre et on voit s'il marche.
La flemme ne donne que l'illusion que ça va aller tout seul.
Va au bout des choses.
Content que ça marche

Hey, tu es revenu à l'ancien avatar kammo ?