IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème condition if


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut Problème condition if
    Bonjour
    Je suis débutante en ARDUINO, je voudrais commander un LED lié à ARDUINO, par interface python.
    -si on clique sur commande automatique: le led se clignote
    -si on clique sur commande réel:
    -si on clique sur led_on:le led s'allume.
    -si on clique sur led_off:le led s'éteint.
    vous trouvez ci-dessous mon code:
    en le testant sur proteus:
    la condition de clignotant fonctionne parfaitement, parmi que celle de led_on led_off ne fonctionne jamais(malgré que l'ARDUINO a reçu la donnée correspondante.
    Merci d'avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    int led = 12;
    int mode= 4; 
    int readByte;
    int readByte1;
     
     
     
    void led_On_Off(byte ledStatus)
    {
      digitalWrite(led, ledStatus);
    }
    void led_Commande(byte ledPin)
    {
      led_On_Off(1);
      delay(500); 
      led_On_Off(0);delay(500);
    }
    void led_reel()
    {
        if (readByte=='c'){digitalWrite(led, 1);} 
        else if (readByte=='d'){digitalWrite(led, 0);}
    }
     
    void setup() {                
      // initialize the digital pin as an output.
      pinMode(led, OUTPUT);
      pinMode(mode,INPUT);  
      Serial.begin(9600);
      }
     
    // the loop routine runs over and over again forever:
    void loop() {
     
     while (Serial.available() > 0) {
     readByte=Serial.read();
     if (readByte=='a') {led_reel();}
     else if (readByte=='b') {led_Commande(12);}
     
    }
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    qu'est-ce que le programme python envoie ? n'oubliez pas qu'à chaque tour de boucle s'il n'y a rien à lire, rien ne se passe

    sinon vous appelez led_reel() dans la loop quand vous avez reçu 'a' et dans cette fonction vous comparez avec 'c' et 'd'... il n'y a AUCUNE chance pour que readByte vaille 'c' ou 'd' puisque c'est 'a'...

  3. #3
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut
    l'ARDINO avait bien reçu les caractères a,b,c ou d, à chaque clique sur le label python correspondant.
    J’ai ajouté un loop(),et rien ne s’est passé.

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Je veux bien croire qu’il reçoit chaque caractère puisque vous les lisez mais regardez vos fonctions. Quelle est la valeur reçue et comme je le dis ci dessous avec quoi comparez vous ?

    Si vous n’êtes pas sure de vous ou convaincue imprimez la valeur dans la fonction avant de faire les if

  5. #5
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour MARIE

    Citation Envoyé par MARIE MARY Voir le message
    -si on clique sur commande automatique: le led se clignote
    -si on clique sur commande réel:
    -si on clique sur led_on:le led s'allume.
    -si on clique sur led_off:le led s'éteint.
    Pour le mode automatique (b), pas de problème.
    Par contre, si j'ai bien compris, pour les 2 fonctions du mode commande réel,

    il faut cliquer commande réel (a) et led_on (c) pour allumer la LED.
    l faut cliquer commande réel (a) et led_off (d) pour éteindre la LED.

    Si c'est ainsi, il faut mémoriser le fait du clic commande réel (variable boolean commandeReelOn) pour, au caractère suivant (c ou d), aiguiller le programme sur led_reel().
    Et ça donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     int led = 12;
     int mode= 4;
     int readByte;
     int readByte1;
     boolean commandeReelOn = false;
     
     
     void led_On_Off(byte ledStatus)
     {
    	 digitalWrite(led, ledStatus);
     }
     void led_Commande(byte ledPin)
     {
    	 led_On_Off(1);
    	 delay(500);
    	 led_On_Off(0);delay(500);
     }
     void led_reel()
     {
    	 if (readByte=='c'){digitalWrite(led, 1);}
    	 else if (readByte=='d'){digitalWrite(led, 0);}
    	commandeReelOn = false;                           // Sortir du mode commande reel
     }
     
     void setup() {
    	 // initialize the digital pin as an output.
    	 pinMode(led, OUTPUT);
    	 pinMode(mode,INPUT);
    	 Serial.begin(9600);
     }
     
     // the loop routine runs over and over again forever:
     void loop() {
     
    	 while (Serial.available() > 0) {
    		 readByte=Serial.read();
    		 if (readByte=='a') {commandeReelOn = true;}       // Memorise la mise en mode commande reel
    		 else if (commandeReelOn == true) {led_reel();}
    		 else if (readByte=='b') {led_Commande(12);}		 
    	 }
     }
    Cordialement
    jpbbricole

  6. #6
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut
    Bonjour Monsieur
    C’est gentil de votre part de m’aider. J’ai essayé ce programme , il répond justement comme le fonctionnement que vous avez décrivez.
    Après que l’ARDUINO reçu (a) :
    Ie led s’allume lorsqu’on clique sur led_on.
    Alors je voudrais qu’il s’éteigne lorsqu’on clique sur led_off (sans cliquer de nouveau sur (a)).
    Cordialement.

  7. #7
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Marie

    J'avais pas tout compris
    Voilà c'est corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     int led = 12;
     int mode= 4;
     int readByte;
     int readByte1;
     boolean commandeReelOn = false;
     
     
     void led_On_Off(byte ledStatus)
     {
    	 digitalWrite(led, ledStatus);
     }
     void led_Commande(byte ledPin)
     {
    	 led_On_Off(1);
    	 delay(500);
    	 led_On_Off(0);delay(500);
     }
     void led_reel()
     {
    	 if (readByte =='c' && commandeReelOn == true){digitalWrite(led, 1);}
    	 else if (readByte=='d'){digitalWrite(led, 0);}
    	commandeReelOn = false;                           // Sortir du mode commande reel
     }
     
     void setup() {
    	 // initialize the digital pin as an output.
    	 pinMode(led, OUTPUT);
    	 pinMode(mode,INPUT);
    	 Serial.begin(9600);
     }
     
     // the loop routine runs over and over again forever:
     void loop() {
     
    	 while (Serial.available() > 0) {
    		 readByte=Serial.read();
    		 if (readByte=='a') {commandeReelOn = true;}       // Memorise la mise en mode commande reel
    		 else if (readByte=='c' || readByte=='d') {led_reel();}
    		 else if (readByte=='b') {led_Commande(12);}		 
    	 }
     }
    Voilà une autre façon de prendre les décisions, avec Switch/case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     int led = 12;
     int mode= 4;
     int readByte;
     int readByte1;
     boolean commandeReelOn = false;
     
     
     void led_On_Off(byte ledStatus)
     {
    	 digitalWrite(led, ledStatus);
     }
     void led_Commande(byte ledPin)
     {
    	 led_On_Off(1);
    	 delay(500);
    	 led_On_Off(0);delay(500);
     }
     void led_reel()
     {
    	if (readByte =='c' && commandeReelOn == true){
    		digitalWrite(led, 1);
    	}
    	else if (readByte=='d'){
    		digitalWrite(led, 0);
    	}
    	commandeReelOn = false;                           // Sortir du mode commande reel
     }
     
     void setup() {
    	 // initialize the digital pin as an output.
    	 pinMode(led, OUTPUT);
    	 pinMode(mode,INPUT);
    	 Serial.begin(9600);
     }
     
     // the loop routine runs over and over again forever:
     void loop() {
     
    	while (Serial.available() > 0) {
    		readByte=Serial.read();
     
    		switch(readByte)                                   // Choix en fonction du caractere recu
    		{
    			case 'a':                                      // Si passe en mode reelOn
    				commandeReelOn = true;
    				break;
    			case 'b':                                     
    				led_Commande(12);
    				break;
    			case 'c':
    				led_reel();
    				break;
    			case 'd':
    				led_reel();
    				break;
    		}
    	}
    }
    Cordialement
    jpbbricole

  8. #8
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut
    Bonjour jpbbricole
    Merci bien Monsieur.
    Cordialement.

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    J’aime bien la version avec switch case on se rapproche de la machine à états

    On peut simplifier alors un peu puisque lorsqu’on appelle led_reel() on sait ce que l’on a reçu donc on peut en tenir compte et avoir une fonction pour chaque cas et on n’a plus à mémoriser le caractère reçu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    const byte ledPin = 12;
    bool commandeReelOn = false;
     
    void led_On_Off(byte ledStatus)
    {
      digitalWrite(ledPin, ledStatus);
    }
     
     void led_Commande()
    {
      led_On_Off(HIGH); delay(500);
      led_On_Off(LOW);  delay(500);
    }
     
     void led_reel_on()
     {
      if (commandeReelOn){
        led_On_Off(HIGH);
        commandeReelOn = false; // Sortir du mode commande reel
      }
    }
     
    void led_reel_off()
     {
      if (commandeReelOn){
        led_On_Off(LOW);
        commandeReelOn = false; // Sortir du mode commande reel
      }
    }
     
     void setup() {
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
     }
     
    void loop() {
        switch(Serial.read()) { // Choix en fonction du caractere recu. Read retourne -1 si rien à lire
     
          case 'a': // Si passe en mode reelOn
            commandeReelOn = true;
    	break;
     
          case 'b':  // on clignote
    	led_Commande();
    	break;
     
          case 'c': // allume si mode commande et sort du mode commande
            led_reel_on();
    	break;
     
          case 'd':  // éteint si mode commande et sort du mode commande
            led_reel_off();
            break;
     
          default: break; // on ignore toute autre commande sur le port série
        }
    }
    Comme cela quand on lit les options possibles dans le switch on voit tout de suite ce que ça fait.

    Notez que lorsqu’on travaille en mode commande sur 1 caractère ce nest pas la peine de tester available() dans la loop(), il suffit d’essayer de lire. Comme read() retourne -1 si on a rien à lire alors ça ne correspond à aucun des case et donc rien ne se passe. (La fonction available est lente car elle fait un calcul avec un modulo et vous n’avez pas vraiment besoin de savoir combien de caractères sont dispos, juste traiter celui qui arrive quand il arrive).

  10. #10
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut
    Bonjour
    Merci bien Jay M.Surtout poue cet astuce d'éliminer le available.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] Problème condition empty()
    Par vincedjs dans le forum Langage
    Réponses: 34
    Dernier message: 28/02/2006, 16h27
  2. Problèmes Conditions + alerts
    Par vincedjs dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2006, 16h45
  3. [Debutant]Problème Condition et TChart
    Par ghan77 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 03/01/2006, 12h12
  4. [AS1] Problème condition actionscript
    Par denis finch dans le forum Flash
    Réponses: 20
    Dernier message: 22/12/2005, 00h08
  5. Problème: condition sur formulaire dans requête
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 23h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo