Es-ce que la condition "if" est répété tant qu'elle est vraie?

Bonjour, j'aimerais savoir si mon programme marche.
J'aimerais que quand la condition (photoresistance1) soit vraie, que la condition qui est à l'intérieur de la condition soit testé jusqu'à ce qu'elle soit vrai elle aussi. Es-ce que mon programme permet de faire ça ?
Si non, que puis-je faire ?
Bonne journée.

int relais = 2;
byte personne = 0
int photoresistance1 = analogRead(2);
int photoresistance2 = analogRead(4);
void setup() {

pinMode(relais, OUTPUT);

}

void loop() {

if(photoresistance1 < 1000){
  if(photoresistance2  < 1000){
    personne=personne+1;
    delay (500) ;
  }



if(personne ≥ 1){
  digitalWrite(relais, HIGH);
}
else{
  digitalWrite(relais, LOW);
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Is the “if” condition repeated so that it is true?

No, that would be a while statement.

Français

Tutoriels et cours Le bar Réalisations et Projets Finis

Feel free to continue here, but please use English (even with google translate) so we all don't have to.

Use google translate ourselves, that is, or learn your language!

a7

Tu auras un problème avec ce code : la valeur des tensions des photorésistances est lue uniquement au lancement du programme, dans les lignes qui contiennent les analogRead.
Les valeurs des variables photoresistance1 et photoresistance2 sont constantes, fixées dès le début et il est probable que ton relais ne fasse pas ce que tu attends...

Donc ceci serait plus efficace :

int relais = 2;
byte personne = 0

void setup() {
  pinMode(relais, OUTPUT);
}

void loop() {
int photoresistance1 = analogRead(2);
if(photoresistance1 < 1000){
int photoresistance2;
do { photoresistance2 = analogRead(4); }
  while (photoresistance2  < 1000);
  personne=personne+1;
  delay (500) ;

if(personne ≥ 1) digitalWrite(relais, HIGH);
else digitalWrite(relais, LOW);
}

Je ne sais pas si ça fera ce que tu veux, mais au moins ce sera dynamique. Par exemple, si le relais sert à ouvrir un passage, il ne se refermera qu'après 256 personnes détectées.
Tu veux faire un compteur de passages avec des barrières lumineuses ?

Note que ceci :

int photoresistance2;
do { photoresistance2 = analogRead(4); }
  while (photoresistance2  < 1000);

peut se remplacer par :
while (analogRead(4) < 1000);

Bonjour,

C'est ce que ton programme fait puisque la loop est appelée en continu, le premier if est appelé continuellement et si vrai le deuxième if
Cependant je ne vois pas bien ce que ton programme est censé faire car personne est toujours incrémenté et jamais décrémenté.

edit: effectivement comme le dit @lesept il faut que les photo résistances soient relues dans la loop.

en faite j'amerais créer un système avec des photorésistances et des lasers pour allumer quand j'entre et éteindre quand je sors de ma chambre. Effectivement, merci beaucoup, je n'avais pas fait attention au photorésistances dans le setup. Et j'avais oublié une partie de mon code. J'aimerais en faite que l'arduino attende dans la première boucle que la deuxieme boucle soit verifié même si la première boucle n'est plus vrai...
Mais j'ai peur car si je fais le code ci-dessous, je ne pense pas que mon programme s'arrête tant que la condition à l'intérieur de la condition n'est pas vrai

int relais = 2;
byte personne = 0;

void setup() {

pinMode(relais, OUTPUT);

}

void loop() {


if(analogRead(2) < 1000)// ici je demande à l'arduino si la valeur de la première photorésistance est inferieur à 1000
 {
 while(analogRead (4) < 1000){ // ici je demande à l'arduino si la valeur de la seconde photorésistance est inferieur à 1000
    personne=personne+1; // donc je peux lui dire que une personne est entrée dans la pièce
    delay (500) ;
  }
 
}
  

if(analogRead (4) < 1000){// ici je demande à l'arduino si la valeur de la seconde photorésistance est inferieur à 1000
while(analogRead(2) <  1000){// ici je demande à l'arduino si la valeur de la première photorésistance est inferieur à 1000
    personne=personne-1;// donc je peux lui dire que une personne est sortie de la pièce
    delay (500) ;
  }
 
  }

if(personne >= 1){
  digitalWrite(relais, HIGH);
}
else{
  digitalWrite(relais, LOW);
}

}

Ok donc tu dois détecter une entrée ou une sortie, c'est à dire détecter les passages devant chaque capteur, et surtout d'avoir dans quel ordre ils se déclenchent. Dans un ordre c'est une entrée, tu dois fermer la porte (on supporte quelle est ouverte déjà), dans l'autre c'est une sortie et tu dois ouvrir la porte (pour laisser le passage).

C'est ainsi que j'imagine ton système.

Donc il faut écouter tes deux capteurs en même temps. Lorsque l'un d'eux se déclenche tu écoutes l'autre. Lorsque le second de déclenche, tu agis sur le relais, en fonction de l'ordre dans lequel ils se sont déclenchés.

Oui, merci pour ton attention, c'est exactement ça, cependant je ne sais pas si mon programme est bon. Tu ferais ton code de quelle manière toi ?

Voici un genre de pseudo code pour la loop, à toi d'en faire un code en C (on t'aidera, ne t'en fais pas) :

  • lecture des deux capteurs
  • si capteur 1 se déclenche :
    • tant que capteur 2 ne se déclenche pas : ne rien faire
    • si déclenchement du capteur 2 : ouvrir ou fermer le relais
    • attendre 10 secondes (le temps du passage)
  • même chose en échangeant les numéros des capteurs et l'action sur le relais

Tu comprends que si aucun capteur ne se déclenche, on boucle sur la lecture des 2 capteurs, en attendant le premier déclenchement.

C'est juste un premier jet, pour voir si ça marche. Il est probable qu'on puisse l'améliorer lors des tests.

Merci beaucoup, j'avais déjà fait un test en faisant de cette maniere. Je pense que c'est une bonne solution. Je teste ça demain et je publierai également le code, si ça marche je mettrais ton commentaire en solution.
Merci encore et bonne soirée

Bonne soirée !

Du coup, j'ai essayé un code qui à l'air de marcher...
Le voici...

int relais = 2;
byte personne = 0;
long prevMillis = 0;
boolean relais_etat=0;
boolean etatbouton = 0;
int lumiere_ambiante = 0 ;

void setup() {

pinMode(relais, OUTPUT);
pinMode(5,INPUT);
etatbouton=digitalRead(5);


}

void loop() {
if(relais_etat==1){
  lumiere_ambiante= analogRead(5)+200;// changer la valeur !!!
 }
 else{
  lumiere_ambiante= analogRead(5);
 }
  if(digitalRead(5)!= etatbouton) {//interrupteur laisse passé le courant ou pas ?
  digitalWrite(relais, !relais_etat);//mettre à l'inverse  l'état du relais de son etat avant
  etatbouton=!etatbouton;
  relais_etat=!relais_etat;
}


if(lumiere_ambiante< 500) { //lumiere ambiante photoresistante pin5 / effectuer le programme si la lumiere ambiante n'est pas suffisante

  
while(analogRead(2)<  1000 && analogRead(4)< 1000){
if(digitalRead(5)!= etatbouton) {
  digitalWrite(relais, !relais_etat);
  etatbouton=!etatbouton;
  relais_etat=!relais_etat;
}
  
}

if(analogRead(2) < 1000 ){
  prevMillis=millis()+5000;
 while(analogRead(4)  > 1000 && millis() < prevMillis  ){
   
  }
  if (analogRead(4)< 1000 )
  {  personne=personne+1;

    delay (500) ;
}
  
}
if(analogRead(4) < 1000 ){
  prevMillis=millis()+5000;

while(analogRead (2)  > 1000 && millis()< prevMillis){
   
  }
if (analogRead(2)< 1000 )
  {  personne=personne-1;
    delay (1000) ;
}
  }

if(personne >= 1){
  digitalWrite(relais, HIGH);
  relais_etat = 1;
}
else{
  digitalWrite(relais, LOW);
  relais_etat = 0;
}
}

}

mon code fait que buger je ne comprends pas... il fuat que les deux capteurs se declenchet en meme temps pour que ca marche

Je peux essayer de t'aider mais il faut que tu expliques clairement le rôle de chaque "périphérique" : capteurs de lumière, bouton, relais. Si je n'arrive pas à comprendre le déroulement attendu, je n'arriverai pas à faire un truc qui fasse ce que tu attends...

Dans mon pseudocode du message 9, le bouton n'apparait pas, donc je ne connais pas son rôle.

J'ai enfin fini par y arriver...
Voici le code si ça peut en aider certains.

boolean etatbouton=0;
boolean relaisetat=0;
int nbPersonne=0;

void setup() {
  // put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(5, INPUT);
etatbouton=digitalRead(5);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
   if (digitalRead(5)!=etatbouton){
    digitalWrite(2, !relaisetat);
    relaisetat=!relaisetat;
    etatbouton=!etatbouton;
  }



  
while ((analogRead(2)> 600 && analogRead(4)> 600 ) || (analogRead(2)< 600 && analogRead(4)< 600 )){
  if (digitalRead(5)!=etatbouton){
    digitalWrite(2, !relaisetat);
    relaisetat=!relaisetat;
    etatbouton=!etatbouton;
  } }


  
  if(analogRead(5)< 600 && relaisetat==0 )  {

if (analogRead(2)<600) {
  nbPersonne=nbPersonne+1;
  Serial.println(nbPersonne);
  if (nbPersonne>=1){
    digitalWrite(2,HIGH);
    relaisetat=!relaisetat;
    delay(2000);
  }
}
  
if (analogRead(4)<600) {
  Serial.println(nbPersonne);
    delay(2000);
  }
}




  
  if (relaisetat==1) {
    
  if (analogRead(2)<600) {
    nbPersonne=nbPersonne+1;
  Serial.println(nbPersonne);
    delay(2000);
  }

  
if (analogRead(4)<600) {
  nbPersonne=nbPersonne-1;
  if(nbPersonne<1){
    digitalWrite(2, LOW);
    relaisetat=0;
  }
  Serial.println(nbPersonne);
    delay(2000);
  }
  }
}

J'ai finalement refait mon code de A à Z en changeant quelques trucs et en faisant au plus simple et ça marche parfaitement bien. Merci à tous pour votre aide.
J'ai un systeme qui allume et éteint la lumiere quand j'entre et sort de ma pièce, un interrupteur manuel et un capteur de lumière qui active le systeme d'entrée/sortie que lorsque la lumière ambiante n'est pas suffisante pour eclairer la piece...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.