Problème de compréhension des "if"

Bonjour à tous,
je débute dans le monde merveilleux de l’arduino mais je me heurte déjà à un preemier problème.
Je suis en train de faire une ouverture dfe porte de poulailler automatique est j’ai plusieurs if à ajouter mais celà ne fonctionne pas.
Le programme zappe mon premier “if” seul mon deuxième fonctionne alors que si je mets un else if cela fonctionne.
Vous allez me dire du coup de mettre le “else if”, mais je vais avoir d’autres conditions à ajouter dans ce programme donc si je ne comprends pas bien pourquoi il ne prend pas en compte mon premier “if” ça va devenir compliqué pour la suite.
Et je souhaite vraiment comprendre la lecture du programme.
Je pense que ce n’est qu’un problème d’écriture…
Merci d’avance pour votre aide.
Voici le programme :

int switchHt=2;
int switchBs=3;
int moteurRIn1=5;
int moteurLIn2=6;
int toto=212;
int led=13;
int jour=9;

void setup() {
  Serial.begin(9600);
  pinMode(switchHt, INPUT_PULLUP);
  pinMode(switchBs, INPUT_PULLUP);
  pinMode(moteurRIn1, OUTPUT);
  pinMode(moteurLIn2, OUTPUT);
  pinMode (led, OUTPUT);
  pinMode (jour, INPUT_PULLUP);
  }

void loop() {
  //toto=digitalRead(jour);
 //Serial.println(toto);
  if ((digitalRead(jour) == HIGH)&&(digitalRead(switchBs) == HIGH)&&(digitalRead(switchHt) == LOW))// si soleil levé et porte fermée et porte ouverte 
  { 
        digitalWrite(moteurRIn1, HIGH);// ouverture porte
        digitalWrite(moteurLIn2, LOW); 
        digitalWrite(led, HIGH);  
    }
    
  if ((digitalRead(jour) == LOW)&&(digitalRead(switchHt) == HIGH)&&(digitalRead(switchBs) == LOW))// si soleil couché et porte ouverte 
   { 
        digitalWrite(moteurRIn1, LOW);// fermeture porte
        digitalWrite(moteurLIn2, HIGH); 
        digitalWrite(led, HIGH);   
    }
    
    else { // sinon
        digitalWrite(moteurRIn1, LOW);
        digitalWrite(moteurLIn2, LOW);
        digitalWrite(led, LOW);  
    }
    
      delay(100);
   }

hello tes switchs sont en INPUT_PULLUP donc si pas actionnés, tu liras les entrées égales à HIGH.

ton 1er if: if ((digitalRead(jour) == HIGH)&&(digitalRead(switchBs) == HIGH)&&(digitalRead(switchHt) == LOW)) équivaut à: si il fait jour et et si le switch bas n'est pas actionné et si le switch haut est actionné alors lever la porte.

le problème c'est que les conditions du if correspondent à une porte déjà levée.

il faut: si il fait jour et et si le switch bas est actionné et si le switch haut n'est pas actionné autrement dit: if ((digitalRead(jour) == HIGH)&&(digitalRead(switchBs) == LOW)&&(digitalRead(switchHt) ==HIGH)) que tu peux aussi ecrire: if ((digitalRead(jour))&&(!digitalRead(switchBs))&&(digitalRead(switchHt)))

Très bien merci beaucoup pour la réponse et la réactivité. Mais je ne me suis peut être pas tout à fais bien expliqué dans mon problème, je vous mets les deux codes : le premier zappe le premier "if" alors que le deuxième code fonctionne lorsque je remplace le "if" par le "else if" et c'est cette nuance que je n'ai pas comprise. Merci pour l'info pour les pull up. Et comment ce lit le "!" ? Voici les deux codes :

int switchHt=2;
int switchBs=3;
int moteurRIn1=5;
int moteurLIn2=6;
int led=13;
int jour=9;

void setup() {
  pinMode(switchHt, INPUT_PULLUP);
  pinMode(switchBs, INPUT_PULLUP);
  pinMode(moteurRIn1, OUTPUT);
  pinMode(moteurLIn2, OUTPUT);
  pinMode (led, OUTPUT);
  pinMode (jour, INPUT_PULLUP);
  }

void loop() {

  if ((digitalRead(jour) == HIGH)&&(digitalRead(switchHt) == LOW))// si soleil levé et porte fermée 
  { 
        digitalWrite(moteurRIn1, HIGH);// ouverture porte
        digitalWrite(moteurLIn2, LOW); 
        digitalWrite(led, HIGH);  
    }
    
if ((digitalRead(jour) == LOW)&&(digitalRead(switchBs) == LOW))// si soleil couché et porte ouverte 
   { 
        digitalWrite(moteurRIn1, LOW);// fermeture porte
        digitalWrite(moteurLIn2, HIGH); 
        digitalWrite(led, HIGH);   
    }
    
    else { // sinon
        digitalWrite(moteurRIn1, LOW);
        digitalWrite(moteurLIn2, LOW);
        digitalWrite(led, LOW);  
    }
    
      delay(100);
   }

et voici le deuxième code :

int switchHt=2;
int switchBs=3;
int moteurRIn1=5;
int moteurLIn2=6;
int led=13;
int jour=9;

void setup() {
  pinMode(switchHt, INPUT_PULLUP);
  pinMode(switchBs, INPUT_PULLUP);
  pinMode(moteurRIn1, OUTPUT);
  pinMode(moteurLIn2, OUTPUT);
  pinMode (led, OUTPUT);
  pinMode (jour, INPUT_PULLUP);
  }

void loop() {

  if ((digitalRead(jour) == HIGH)&&(digitalRead(switchHt) == LOW))// si soleil levé et porte fermée 
  { 
        digitalWrite(moteurRIn1, HIGH);// ouverture porte
        digitalWrite(moteurLIn2, LOW); 
        digitalWrite(led, HIGH);  
    }
    
 else if ((digitalRead(jour) == LOW)&&(digitalRead(switchBs) == LOW))// si soleil couché et porte ouverte 
   { 
        digitalWrite(moteurRIn1, LOW);// fermeture porte
        digitalWrite(moteurLIn2, HIGH); 
        digitalWrite(led, HIGH);   
    }
    
    else { // sinon
        digitalWrite(moteurRIn1, LOW);
        digitalWrite(moteurLIn2, LOW);
        digitalWrite(led, LOW);  
    }
    
      delay(100);
   }

Salut

Et comment ce lit le "!" ?

C'est une négation.

c'est cette nuance que je n'ai pas comprise.

Exactement comme en français.

Si condition1 action1 Si condition2 action2 Sinon action3

Si condition1 est vraie alors action1 est exécutée. Si condition2 est vraie alors action2 est exécutée et le reste n'est pas évalué. Si condition2 est fausse alors action3 est exécutée.

Si condition1 action1 Sinon Si condition2 action2 Sinon action3

Si condition1 est vraie alors action1 est exécutée et le reste n'est pas évalué. Si condition1 est fausse et condition2 est vraie alors action2 est exécutée et le reste n'est pas évalué. Si condition1 est fausse et condition2 est fausse alors action3 est exécutée.

Cela fait une différence non ?

Ceci dit, AMHA tu mets trop de conditions.

Pour ouvrir, on se fout (presque) du capteur bas. Pour fermer, on se fout (presque) du capteur haut.

Les vraies conditions pour ouvrir ou fermer la porte sont :

SI il fait jour SI le capteur haut est ouvert ouverture SINON stop moteur SINON SI le capteur bas est ouvert fermeture SINON stop moteur

Tu devras également tenir compte des situations anormales : pendant l'ouverture, le capteur bas reste fermé trop longtemps, plus d'une seconde situation anormale pendant l'ouverture, le capteur haut reste ouvert trop longtemps, plus de 2 * le temps normal d'ouverture situation anormale pendant la fermeture, si le capteur haut reste fermé trop longtemps, plus d'une seconde situation anormale pendant la fermeture, si le capteur bas reste ouvert trop longtemps, plus de 2 * le temps normal de fermeture situation anormale

Situation anormale : le moteur est HS ou un capteur est HS ou une poule est coincée

@+

Merci pour ta super réponse.
Ok pour la négation, je vais gagner un peu d’écriture :slight_smile:

Ne croyez pas que je ne comprend rien et que je veux me faire lourd, j’ai bien compris la nuance, tes explications sont bien claire et ça me parait logique mais dans mon cas ça ne fonctionne pas.

Dans le premier code de ma deuxième réponse, il ne lit pas mon premier “if” et du coup par rapport à tes explications je ne comprend pas pourquoi.

Si condition1
action1
Si condition2
action2
Sinon
action3

Si condition1 est vraie alors action1 est exécutée.

Je rempli bien la condition 1 et pourtant il l’ignore car il ne crée pas l’action.

Alors que lorsque j’écris mon code de la deuxième manière:

Si condition1
action1
Sinon Si condition2
action2
Sinon
action3

Si condition1 est vraie alors action1 est exécutée et le reste n’est pas évalué.

Là je fais la même chose que dans l’autre cas et il prend bien en compte ma condition 1.

Par contre je vais réécrire le code comme tu me l’a suggèré, effectivement, c’est bien ce qui m’intéressait de votre expérience, le côté optimisation du code…

J’ai également bien pensé aux éventuels problèmes cités mais du coup cela dépasse déjà mon niveau de compétence en terme de code.
Si tu as quelques choses à me suggèrer je suis preneur sinon je vais continuer mes recherches.
L’idée en cas d’anomalie serait quelle(s) action(s).

Encore merci beaucoup pour votre aide, c’est grâce à des gens comme vous que des gens comme moi peuvent apprendre et découvrir…

veux tu tester ce code

int switchHt=2;
int switchBs=3;
int moteurRIn1=5;
int moteurLIn2=6;
int led=13;
int jour=9;

void setup() {
  pinMode(switchHt, INPUT_PULLUP);
  pinMode(switchBs, INPUT_PULLUP);
  pinMode(moteurRIn1, OUTPUT);
  pinMode(moteurLIn2, OUTPUT);
  pinMode (led, OUTPUT);
  pinMode (jour, INPUT_PULLUP);
  }

void loop() {

  if ((digitalRead(jour) == HIGH)&&(digitalRead(switchHt) == HIGH))// si soleil levé et porte fermée 
  { 
        digitalWrite(moteurRIn1, HIGH);// ouverture porte
        digitalWrite(moteurLIn2, LOW); 
        digitalWrite(led, HIGH);  
    }
    
if ((digitalRead(jour) == LOW)&&(digitalRead(switchBs) == HIGH))// si soleil couché et porte ouverte 
   { 
        digitalWrite(moteurRIn1, LOW);// fermeture porte
        digitalWrite(moteurLIn2, HIGH); 
        digitalWrite(led, HIGH);   
    }
    
    else { // sinon
        digitalWrite(moteurRIn1, LOW);
        digitalWrite(moteurLIn2, LOW);
        digitalWrite(led, LOW);  
    }
    
      delay(100);
   }

Bonjour, merci beaucoup pour votre aide à tous les deux :) :) C'est très constructif pour moi. Je viens donc de tester ton code @dfgh tel quel en copier coller et il ne fonctionne pas. Cela fais comme moi, seule lorsque la condition 2 est remplie cela fonctionne pour l'action 2.

if ((digitalRead(jour) == LOW)&&(digitalRead(switchBs) == HIGH))// si soleil couché et porte ouverte { digitalWrite(moteurRIn1, LOW);// fermeture porte digitalWrite(moteurLIn2, HIGH); digitalWrite(led, HIGH); }

La condition 1 n'est pas prise en compte même lorsque les critères sont vrai. Par contre avec "si" et "sinon si" cela fonctionne.

Sinon je suis également en train d'essayer de transcrire le code d'@hbachetti

SI il fait jour SI le capteur haut est ouvert ouverture SINON stop moteur SINON SI le capteur bas est ouvert fermeture SINON stop moteur

Mais je fais des erreurs dans mes parenthèses, j'ai des messages d'erreurs :

int switchHt=2; int switchBs=3; int moteurRIn1=5; int moteurLIn2=6; int led=13; int jour=9;

void setup() { pinMode(switchHt, INPUT_PULLUP); pinMode(switchBs, INPUT_PULLUP); pinMode(moteurRIn1, OUTPUT); pinMode(moteurLIn2, OUTPUT); pinMode (led, OUTPUT); pinMode (jour, INPUT_PULLUP); }

void loop() {

if (digitalRead(jour));// si soleil levé if (!digitalRead(switchHt));//contacteur ht ouvert (porte fermée) { digitalWrite(moteurRIn1, HIGH);// ouverture porte digitalWrite(moteurLIn2, LOW); digitalWrite(led, HIGH); }

else { // sinon digitalWrite(moteurRIn1, LOW); // stop moteur digitalWrite(moteurLIn2, LOW); digitalWrite(led, LOW); }

else if (!digitalRead(switchBs))// contacteur bas ouvert (porte ouverte) { digitalWrite(moteurRIn1, LOW);// fermeture porte digitalWrite(moteurLIn2, HIGH); digitalWrite(led, HIGH); }

else { // sinon digitalWrite(moteurRIn1, LOW); // stop moteur digitalWrite(moteurLIn2, LOW); digitalWrite(led, LOW); }

delay(100); }

Encore merci pour votre précieux temps c'est vraiment sympa.

J'essaye au moins de poser les bases mais je suis encore loin de mes peines car, je devrai ajouter une photorésistance, (pour le moment j'utilise un switch pour créer jour/nuit) et ensuite les conditions de sécurité, mais j'essayerai de me débrouiller seul rt je verrai ça plus tard.

Il ne faut pas mettre de ; après la condition d'un if :

if (condition);  // NON
if (condition)   // CORRECT

et si nous reprenions au début

comment sont cablés tes switchs? lorsqu'ils sont actionnés, ils doivent mettre le GND sur l'entrée à laquelle ils sont raccordés

bonjour à tous,

merci @lesept, erreur de débutant :

Il ne faut pas mettre de ; après la condition d'un if :

là tout d'un coup ça fonctionne :confused:

@dfgh, je te ferai un petit schéma pour que tu comprennes mon montage, mais je ne pense pas que mon problème vienne de là, car c'est vraiment dans l'écriture de mon scénario que cela change les choses. En réécrivant le code correctement de @hbachetti, tout fonctionn très bien.

Il faut que je mette mon système en oeuvre avant mon départ en vacances et que je le test un peu avant de partir, du coup je ne vais pas m'acharner tout de suite sur mon premier code qui n'est pas le plus judicieux (mais j'y reviendrai car j'aime bien comprendre...)

En tout cas merci encore pour votre aide. :)