Problème de Plusieurs conditions

Bonjour/Bonsoir,

J'aurais besoin d'aide pour mon projet de terminale, j'ai un très gros problème sa fait 2 jours je suis dessus et que je ne trouve pas comment faire. Mon Projet c'est organiser une course en cours. En gros moi et mon groupe avons deux pistes de courses. Mon problème c'est que Si le feux de départ est rouge et que le capteur du départ sont activés il y ait un son sortant du buzzer mais je n'arrive pas à trouver comment faire pour faire ma commande if

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

  digitalWrite(rouge, HIGH);
  digitalWrite(vert, LOW);
delayMicroseconds(10);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance
distance= duration*0.034/2;

safetyDistance = distance;
if ((safetyDistance <= 5) && (rouge == HIGH)){
  digitalWrite(buzzer, HIGH);
}
else{
  digitalWrite(buzzer, LOW);
}
  delay(1000);
  digitalWrite(vert, HIGH);
  digitalWrite(rouge, LOW);
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

Je n'arrive pas à mettre mes deux conditions :cry:

Si quelqu'un pourrait m'aider ce serait parfait

Bonsoir

Le titre de ton message a sur ce forum un effet repoussoir (le titres doivent évoquer le contenu de l'aide demandée)
->C'est maintenant fait.

Si c'est urgent, vas VITE prendre connaissance des Règles du Forum, entre autres :
comment publier du code dans un message
->ça reste à faire

Reprends ton message initial en conséquence

al1fch:
Bonsoir

Le titre de ton message a sur ce forum un effet repoussoir (le titres doivent évoquer le contenu de l'aide demandée)
->C'est maintenant fait.

Si c'est urgent, vas VITE prendre connaissance des Règles du Forum, entre autres :
comment publier du code dans un message
->ça reste à faire

Reprends ton message initial en conséquence

Ok désolé :cry: je vais reprendre le tout

Une piste....

Si (feu_rouge && capteur_départ )
{
buzzer ;
}

Dans ton code je ne vois pas de capteur depart.. normal ?

Arzou:
Une piste....

Si (feu_rouge && capteur_départ )
{
buzzer ;
}

Dans ton code je ne vois pas de capteur depart.. normal ?

C'est cette partie du code :

if ((safetyDistance <= 5) && (rouge == HIGH)){
  digitalWrite(buzzer, HIGH);
}

Bonjour,
avec le code complet, on verrait peut-être mieux, parce que tu as mis le rouge à HIGH juste avant de poser la question ?

Et quelle valeur est dans ta variable "safetyDistance"?, tu le recupére ou? comment?
affiche les valeurs dans ta console via Serial.print

parce que si

if ((safetyDistance <= 5) && (rouge == HIGH)) est vrai et que le reste de ton code et bon (et ton câblage!) ca va buzzer!!!

mais là , pour vérifier on va tous sortir au choix:
horoscope de mme Irma,
boule de cristal
marc de café
entrailles de bouc fraichement éviscérés
etc

Voici le code complet ARDUINO et si vous voulez voici une vidéo que j'ai fais juste avant pour montrer que cela ne fonctionne pas : - YouTube

// defines pins numbers
const int trigPin = 2;
const int echoPin = 3;
const int buzzer = 9;
const int rouge = 13;
const int vert = 12;

// defines variables
long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buzzer, OUTPUT);
pinMode(rouge, OUTPUT);
pinMode(vert, OUTPUT);
Serial.begin(9600); // Starts the serial communication
}


void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

  digitalWrite(rouge, HIGH);
  digitalWrite(vert, LOW);
delayMicroseconds(10);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance
distance= duration*0.034/2;

safetyDistance = distance;
if ((safetyDistance <= 5) && (rouge == HIGH)){
  digitalWrite(buzzer, HIGH);
}
else{
  digitalWrite(buzzer, LOW);
}
  delay(1000);
  digitalWrite(vert, HIGH);
  digitalWrite(rouge, LOW);
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

distance et safety distance doivent être des float

lesept:
distance et safety distance doivent être des float

Ok je vais essayer

mais la distance s'affiche dans le moniteur série

eric_wagner:
Voici le code complet ARDUINO et si vous voulez voici une vidéo que j'ai fais juste avant pour montrer que cela ne fonctionne pas : https://youtu.be/EkufQF1nujo

// defines pins numbers

const int trigPin = 2;
const int echoPin = 3;
const int buzzer = 9;
const int rouge = 13;
const int vert = 12;

// defines variables
long duration;
int distance;
int safetyDistance;

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buzzer, OUTPUT);
pinMode(rouge, OUTPUT);
pinMode(vert, OUTPUT);
Serial.begin(9600); // Starts the serial communication
}

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

digitalWrite(rouge, HIGH);
  digitalWrite(vert, LOW);
delayMicroseconds(10);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance
distance= duration*0.034/2;

safetyDistance = distance;
if ((safetyDistance <= 5) && (rouge == HIGH)){
  digitalWrite(buzzer, HIGH);
}
else{
  digitalWrite(buzzer, LOW);
}
  delay(1000);
  digitalWrite(vert, HIGH);
  digitalWrite(rouge, LOW);
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

qu'est ce que ca te donne ca?

Serial.print("Distance: ");
 Serial.println(distance);

et insère le dans ta boucle de test pour savoir les valeurs que tu as.
Mais maintenant, vu ton code je vais te dire que tu n'ira pas loin..

en effet tu déclares;

// defines variables
long duration;
int distance;
int safetyDistance;         .....   des entiers

et tu fais ca ;

distance= duration*0.034/2;

le résultat sera un entier ?
je pense que ton compilateur va rendre n'importe quoi.

Distance: 15.45
Distance: 15.90
Distance: 15.45
Distance: 15.45
Distance: 16.34
Distance: 15.45
Distance: 15.45
Distance: 15.45
Distance: 15.47
Distance: 15.45
Distance: 15.45
Distance: 15.45

c'est ce que sa m'affiche

dans le moniteur série

// defines pins numbers
const int trigPin = 2;
const int echoPin = 3;
const int buzzer = 9;
const int rouge = 13;
const int vert = 12;

// defines variables
long duration;
float distance;
float safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buzzer, OUTPUT);
pinMode(rouge, OUTPUT);
pinMode(vert, OUTPUT);
Serial.begin(9600); // Starts the serial communication
}


void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

  digitalWrite(rouge, HIGH);
  digitalWrite(vert, LOW);
delayMicroseconds(10);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance
distance= duration*0.034/2;

safetyDistance = distance;
if ((safetyDistance <= 5) && (rouge == HIGH)){
  digitalWrite(buzzer, HIGH);
}
else if ((safetyDistance >= 5) && (rouge == HIGH)){
  delay(10000);
  digitalWrite(vert, HIGH);
  digitalWrite(rouge, LOW);
  delay(5000);
  digitalWrite(buzzer, LOW);
}
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

le test de la condition est :

if ((safetyDistance <= 5) && (rouge == HIGH)){...

donc affiche "safetyDistance" le reste on s'en moque un peu non ?

Arzou:
le test de la condition est :

if ((safetyDistance <= 5) && (rouge == HIGH)){...

donc affiche "safetyDistance" le reste on s'en moque un peu non ?

sa change rien du tout :cry:

rouge est un numéro de pin, pas la valeur renvoyée par le capteur qui lui est attaché...

En l'occurrence, rouge vaut 13 et high vaut 1 : il y a peu de chance que la condition du test soit vérifiée.

lesept:
rouge est un numéro de pin, pas la valeur renvoyée par le capteur qui lui est attaché...

En l'occurrence, rouge vaut 13 et high vaut 1 : il y a peu de chance que la condition du test soit vérifiée.

J'ai pas compris ...

const int rouge = 13;
... 
pinMode(rouge, OUTPUT);

'rouge' est le numéro de la pin d'une led rouge j'imagine. Dans tout ton code, 'rouge' vaudra 13, car c'est ainsi que tu le définis dans la première ligne ci-dessus.

if ((safetyDistance <= 5) && (rouge == HIGH)){

Pour qu'un && soit vrai, il faut que les deux opérandes soient vrais. Mais HIGH est un raccourci pour dire 1.

Donc la seconde condition, qui est de tester si 13 est égal à 1, n'est jamais vraie. Donc le test n'est jamais vérifié, et les commandes associées jamais exécutées.

Je suppose que tu veux vérifier si la led rouge est allumée. Mais ce n'est pas évident, puisque je ne sais pas ce que doit faire ton code.

Si c'est le cas, tu dois déjà le savoir puisque c'est toi qui décides d'allumer ou non les leds. Donc il faut revoir comment écrire ces conditions.

c'est digitalRead(rouge) qui vaut 1, sinon pourquoi poser la question puisque la valeur est fixée juste avant ?

Une propriété de la pin 13 en quelque sorte, il me semble.

  • rouge son nom
  • HIGH son état

Pour vous répondre à tous les deux,
La Led rouge et la Led verte sont un feu rouge donc quand le feu est rouge et que la distance est inférieure à 5 le buzzer doit sonner mais si le feu est rouge et la distance toujours supérieure à 5 alors au bout d'un certain temps le feu est vert.

Je me suis fait avoir avec le rouge...

Effectivement rouge vaut 13 dans ton code, cest le numéro de sortie, pas sont état..
Il faut que tu créer une variable qui reflète l'état de ta sortie rouge.

En plus tu devrais continuer à donner des noms qui parlent a tes variables

const int trigPin = 2; ok
const int echoPin = 3; ok
const int buzzer = 9; buzzerPin
const int rouge = 13; rougePin
const int vert = 12; vertPin

Par exemple pour continuer dans ta lancée.

..

// Pour la variable 
 bool Feu_rouge; // on va faire simple..
 bool Feu_vert;

.........
....
Plus loin.. dans ton programme 
.....
Feu_vert=false; // ben oui le feu vert est eteint

Feu_rouge=true; // du coup le rouge est allumé                 


......


Allumage ou extinction des feux

digitalWrite(rouge, Feu_rouge);
  digitalWrite(vert, Feu_vert);


Puis

safetyDistance = distance;
if ((safetyDistance <= 5) && (Feu_rouge )){   //  ====>  Feu_rouge==True  ?
  digitalWrite(buzzer, HIGH);
}
else{
  digitalWrite(buzzer, LOW).......

Et ca devrait aller mieux