Problème code novice

Bonjour à tous
content d'être parmi vous et découvrir le mode de l'arduino.
pour tenter d'apprendre un peu seul dans mon coin j'ai tenté un test de feu de départ de course avec des leds rgb et un capteur ultrason
mon idée était de déclencher une séquence led si un véhicule était détecté dans les 20 cm du capteur ultrason cependant cela fonctionne sur tinkercad mais en réel sur mon nano la séquence tourne en boucle comme si le capteur détecter constamment quelque chose.
je suppose donc que le code pour le capteur ultrason HC-SR04 doit avoir un soucis mais je comprends vraiment pas tout seul la depuis plusieurs semaines

quelqu'un saurait il m'aider et pourrais jeter une coup d'oeil à ce code
peut être un truc évident pour un expert :wink:

// C++ code
//
int test = 0;

long readUltrasonicDistance(int triggerPin, int echoPin)
{
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  // Sets the trigger pin to HIGH state for 10 microseconds
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  // Reads the echo pin, and returns the sound wave travel time in microseconds
  return pulseIn(echoPin, HIGH);
}

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(5, HIGH);
  if (0.01723 * readUltrasonicDistance(2, 3) <= 20) {
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(11, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(10, LOW);
    digitalWrite(9, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(7, LOW);
    digitalWrite(4, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(4, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
  } else {
    digitalWrite(5, HIGH);
  }
}

Bonsoir sebdenice06200

Dans cas comme ceci comme dans toutes phases de développement, il faut afficher des variables dans le moniteur (à 115200) à fin de "voir" fonctionner ton programme et le hardware.
Ainsi tu peux afficher les valeurs données par ton radar, qui semble être la cause du problème. Je t'ai modifié ton programme afin que tu voies comment faire:

// C++ code
//
int test = 0;

long readUltrasonicDistance(int triggerPin, int echoPin)
{
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  // Sets the trigger pin to HIGH state for 10 microseconds
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  // Reads the echo pin, and returns the sound wave travel time in microseconds
  return pulseIn(echoPin, HIGH);
}

void setup()
{
  Serial.begin(115200);

  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(5, HIGH);

  Serial.println(0.01723 * readUltrasonicDistance(2, 3));

  if (0.01723 * readUltrasonicDistance(2, 3) <= 20) {
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(11, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(10, LOW);
    digitalWrite(9, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(7, LOW);
    digitalWrite(4, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(4, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
  } else {
    digitalWrite(5, HIGH);
  }
}

à ta disposition pour d'autres questions.

A+
Cordialement
jpbbricole

Bonsoir et merci beaucoup pour le temps accordé
alors effectivement avec le code modifié dans le moniteur je vois bien un mesure apparaitre a chaque début de cycle mais la boucle tourne en rond peut importe la mesure comme si ma variable n'était pas prise en compte j'avoue ne pas trop comprendre car j'ai demandé que la boucle ne démarre qu'à partir de 20 cm ou moins du capteur sinon rien et la ça tourne en boucle constamment

Changes
<= 20
contre
>= 20

https://docs.arduino.cc/language-reference/en/structure/comparison-operators/greaterThanOrEqualTo/

merci pour votre aide
je viens de tenter et la le soucis s'inverse
les mesures sont toujours prises et correctes dans le moniteur mais dans ce cas la boucle ne se déclenche plus du tout
je dois avoir le soucis sous le nez depuis des semaines
c'est frustrant :wink:
si vous avez une autre idée je suis preneur et vous remercie encore pour votre aide jp

quels sont les valeurs affichées, donnes en moi une dizaine.

Tu calcules en flottant il faut faire une comparaison en flottant

 if (0.01723 * readUltrasonicDistance(2, 3) <= 20.0) {

voici quelque exemples affichés
7.77

8.43

8.89

9.46

12.22

15.95

442.74

802.78

merci pour l'info il va falloir que je la decrypte vu mon niveau debutant
ce n'est donc pas une valeur en cm?

bonjour si le flottant voulait dire avec une virgule je viens de tester 20.0 et c'est toujours identique
avec <= 20.0 la boucle tourne sans arrêt et avec >= 20.0 elle ne démarre plus du tout peut importe la mesure
on dirait vraiment que le soucis provient de la parti code de l'ultrason mais je ne trouve pas la coquille

Bonjour sebdenice06200

Essaies de mettre la formule entre parenthèses:
if ((0.01723 * readUltrasonicDistance(2, 3)) <= 20)

Je ferai des essais "en vrai" dans le courant de la matinée.

A+
Bonne journée
jpbbricole

Tu cherches à allumer tes LEDs si la distance est inférieure à 20cm donc le test doit utiliser <= c'est inutile de changer le sens du test cela ne fera pas mieux fonctionner le programme.


Le else dans le test est inutile puisque tu repositionnes toutes les LEDs à une valeur par défaut au début de la boucle.
Il faut introduire un delay(100) à la fin du code. Actuellement, lorsque la condition du test n'est pas remplie, tu relances aussitôt une mesure. La datasheet du module indique de laisser au minimum 60ms entre 2 mesures.

we suggest to use over 60ms measurement cycle , in order to prevent trigger signal to the echo signal.

Bonjour sebdenice06200

J'ai testé la condition:
if (0.01723 * readUltrasonicDistance(2, 3) <= 20)
le problème n'est pas là.

On va neutraliser le mesure et mettre une valeur fixe:

long readUltrasonicDistance(int triggerPin, int echoPin)
{
	//pinMode(triggerPin, OUTPUT);  // Clear the trigger
	//digitalWrite(triggerPin, LOW);
	//delayMicroseconds(2);
	//// Sets the trigger pin to HIGH state for 10 microseconds
	//digitalWrite(triggerPin, HIGH);
	//delayMicroseconds(10);
	//digitalWrite(triggerPin, LOW);
	//pinMode(echoPin, INPUT);
	//// Reads the echo pin, and returns the sound wave travel time in microseconds
	//return pulseIn(echoPin, HIGH);

	return 1500;
}

Avec return 1500 on ne doit pas aller dans la boucle.
ensuite, changes:
return 1500;
en
return 900;
et on doit aller dans la boucle.

A+
jpbbricole

peut importe la valeur fixe 1500 ou 900 la boucle ne se déclenche plus
donc le soucis vient d'ailleurs mais là je suis vraiment paumé

Remets tout ton programme en ligne.

Oui, enfin là, si tu fais ton test en plusieurs étapes et que tu fais afficher les valeurs tu devrais quand même avoir une piste assez rapidement.
Au lieu de faire
if (0.01723 * readUltrasonicDistance(2, 3) <= 20.0) {
tu fais

long capteur = readUltrasonicDistance(2, 3);
Serial.print("capteur: "); Serial.println(capteur); 
float distance = 0.01723 * capteur;
Serial.print("distance: "); Serial.println(distance); 
bool test = distance <= 20.0;
Serial.print("test: "); Serial.println(test); 
if (test){
// C++ code
//
int test = 0;

long readUltrasonicDistance(int triggerPin, int echoPin)
{
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  // Sets the trigger pin to HIGH state for 10 microseconds
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  // Reads the echo pin, and returns the sound wave travel time in microseconds
  return pulseIn(echoPin, HIGH);
}

void setup()
{
  Serial.begin(115200);

  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(5, HIGH);

  Serial.println(0.01723 * readUltrasonicDistance(2, 3));

if (0.01723 * readUltrasonicDistance(2, 3) <= 20) {
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(11, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(10, LOW);
    digitalWrite(9, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    delay(1000); // Wait for 1000 millisecond(s)
    digitalWrite(7, LOW);
    digitalWrite(4, HIGH);
    delay(5000); // Wait for 5000 millisecond(s)
    digitalWrite(4, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
  } {
    digitalWrite(5, HIGH);
    delay(100);
  }
}

capteur: 0

distance: 0.00

test: 1

803.11

capteur: 0

distance: 0.00

test: 1

on dirait que malgré la mesure il prend en compte un distance de 0 constamment non?

Mets le code associé à cet affichage.

Essaies ça, qu'as tu dans la console?

// C++ code
//
int test = 0;

long readUltrasonicDistance(int triggerPin, int echoPin)
{
	pinMode(triggerPin, OUTPUT);  // Clear the trigger
	digitalWrite(triggerPin, LOW);
	delayMicroseconds(2);
	// Sets the trigger pin to HIGH state for 10 microseconds
	digitalWrite(triggerPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(triggerPin, LOW);
	pinMode(echoPin, INPUT);
	// Reads the echo pin, and returns the sound wave travel time in microseconds
	return pulseIn(echoPin, HIGH);
}

void setup()
{
	Serial.begin(115200);
	pinMode(4, OUTPUT);
	pinMode(6, OUTPUT);
	pinMode(11, OUTPUT);
	pinMode(10, OUTPUT);
	pinMode(9, OUTPUT);
	pinMode(8, OUTPUT);
	pinMode(7, OUTPUT);
	pinMode(5, OUTPUT);
}

void loop()
{
	digitalWrite(4, LOW);
	digitalWrite(5, LOW);
	digitalWrite(11, LOW);
	digitalWrite(10, LOW);
	digitalWrite(9, LOW);
	digitalWrite(8, LOW);
	digitalWrite(7, LOW);
	digitalWrite(5, HIGH);
	long mesureUS = 0.01723 * readUltrasonicDistance(2, 3);
	if (mesureUS <= 20) {
		Serial.println("Action " + String(mesureUS));
		delay(1000);
		//digitalWrite(5, LOW);
		//digitalWrite(6, HIGH);
		//delay(5000); // Wait for 5000 millisecond(s)
		//digitalWrite(11, HIGH);
		//delay(1000); // Wait for 1000 millisecond(s)
		//digitalWrite(11, LOW);
		//digitalWrite(10, HIGH);
		//delay(1000); // Wait for 1000 millisecond(s)
		//digitalWrite(10, LOW);
		//digitalWrite(9, HIGH);
		//delay(1000); // Wait for 1000 millisecond(s)
		//digitalWrite(9, LOW);
		//digitalWrite(8, HIGH);
		//delay(1000); // Wait for 1000 millisecond(s)
		//digitalWrite(8, LOW);
		//digitalWrite(7, HIGH);
		//delay(1000); // Wait for 1000 millisecond(s)
		//digitalWrite(7, LOW);
		//digitalWrite(4, HIGH);
		//delay(5000); // Wait for 5000 millisecond(s)
		//digitalWrite(4, LOW);
		//digitalWrite(11, LOW);
		//digitalWrite(10, LOW);
		//digitalWrite(9, LOW);
		//digitalWrite(8, LOW);
		//digitalWrite(7, LOW);
		} else {
		Serial.println("Trop loin " + String(mesureUS));
		delay(1000);
		//digitalWrite(5, HIGH);
	}
}