Pages: [1]   Go Down
Author Topic: Probleme de condition dans un while  (Read 924 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'ai un petit problème dans ce morceau de code:

while( digitalRead(in_Pin11) != TRUE ||  digitalRead(in_Pin12) != TRUE)
{

}

il y a que la première condition qui me fait quitter la boucle alors que la même syntaxe de code marche très bien sous Windows ou ubuntu.

Merci pour les info
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Première remarque, tu devrais tester HIGH et LOW qui sont les valeurs retournées par digitalRead. Et "true" et "false" s'écrivent en minuscule sous Arduino.

Deuxièmement, on ne voit pas dans ton extrait de code si les deux pattes sont bien définies comme entrées

Code:
pinMode(in_Pin11, INPUT);
pinMode(in_Pin12, INPUT);

Troisième piste, ne pas tester des inégalités mais des égalités.

Code:
if (digitalRead(in_Pin11) == LOW || digitalRead(in_Pin12) == LOW) {
   ...
}

Je ne vois pas le rapport de comparaison avec Windows et Ubuntu. Tu veux dire quand tu compiles sous Apple, donc que ce code a fonctionné compilé sous Windows ? Ou bien que tu fais une analogie avec la programmation en C sous Windows / Linux ?

Dans tous les cas il me semble que l'environnement de compilation est indépendant de la plateforme. Si ce n'est pas le cas, alors ma première idée est la bonne : TRUE et FALSE n'ont peut être pas la même valeur sous Apple ?? J'en doute mais bon..

Plus d'information sur true et false est donnée sur cette page (en anglais) : http://arduino.cc/en/Reference/Constants où on apprend que false vaut 0 en Arduino mais que n'importe quelle autre valeur sera évaluée à true. Je ne sais pas comment != TRUE peut être évalué.

« Last Edit: November 15, 2010, 09:26:11 am by julien@pobot.org » Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3018
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Déjà dans l'environnement Arduino il y a
HIGH qui vaut 0x1
ou
true qui vaut aussi 0x1

mais TRUE n'est pas défini il génère une erreur lors de la compilation. Donc tu as du le définir toi même et la source de ton problème se trouve sans doute là.
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bien vu fdufnews ! Je viens de voir du code (bootloader de la Funnel) qui défini TRUE et FALSE de manière inverse au standard.

C'est aussi pour ça qu'il vaut mieux prendre le réflexe d'écrire "if (test)" que "if (test == true)" au cas où "true" ait été défini différemment que ce que va tester la condition "if" (qui accepte toute valeur non nulle).

Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En effet dans je le bout de code que j'ai montré je me suis trompé c'est bien HIGT que je test sur mon sketch pour la comparaison avec windows je parlé d'une structure de code identique réalise sous visual studio en c++ et dont le double test dans le while ne pause pas de probleme.
« Last Edit: November 15, 2010, 12:14:51 pm by supermac1 » Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir.

D'accord. Je confirme que le double test fonctionne aussi sous Arduino.
Essayez un test == LOW plutôt que != HIGH

En tout cas ça m'intéresse de connaitre le fin mot de l'histoire.
Vous n'avez pas répondu sur la déclaration en INPUT ?

On peut aussi reprendre vos tests :

a) 11 est HIGH et 12 est HIGH : on ne rentre pas dans cette portion de code ou on sort de la boucle
b) 11 est HIGH et 12 est LOW : on boucle
c) 11 est LOW et 12 est HIGH : on boucle
d) 11 est LOW et 12 est LOW : on boucle

Quel(s) est/sont le(s) cas qui fonctionne(nt) avec votre code ?

Si vous n'êtes pas d'accord avec mes 4 cas (et que je n'ai pas fait d'erreur, il est tard), alors c'est que vous avez mal distribué le ! . Quand vous dites "il n'y a que la première condition qui me fait quitter la boucle", ça me met la puce à l'oreille.
« Last Edit: November 16, 2010, 05:50:36 pm by julien@pobot.org » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

déclaration:

int in_Pin11 = 11;    
int in_Pin12 = 12;


int bouton_ouverture = 0;
int bouton_fermeture = 0;
    
boolean etat_capteur = 0;

void setup()
{
      pinMode(in_Pin11, INPUT);
      pinMode(in_Pin12, INPUT);
}

code de ma fonction de lecture des entrées

void lecteur_valeur()
{

      etat_capteur = digitalRead(in_Pin11);
        bouton_ouverture = digitalRead(in_Pin12);

}



code de ma fonction de test


void test()
{


      lecteur_valeur();
      
      while( etat_capteur == LOW ||  bouton_ouverture  == LOW)
      {
            lecteur_valeur();
      }



}

loop()
{
     test();
}
/************************************************************************/


Voila le but de ma bouche est d'en sortir si une de mais 2 entrées est passé a l'état HIGT.

A l'heure actuel si je test avec :

while( etat_capteur == LOW ||  bouton_ouverture  == LOW)

ou

while( etat_capteur != TRUE ||  bouton_ouverture  != TRUE)

il n'y a que la premier variable etat capteur qui me fait sortir bouton ouverture n'est jamais pris en compte  smiley-sad
« Last Edit: November 17, 2010, 03:05:58 am by supermac1 » Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le code n'est pas très clair : tu utilises un booléen puis un int pour stocker les valeurs de digitalRead() mais bref..

Comment sais-tu si tu es sorti ou pas ? Comment le détectes-tu ?

Je ne comprends pas ce que tu veux dire par "la première variable me fait sortir" : peux-tu utiliser les cas a, b, c et d que j'ai décris plus haut ?

Si je comprends bien, dans la situation actuelle (qui n'est pas ce que tu souhaites) :

Cas a : tu sors bien de la boucle ?
Cas b : tu sors de la boucle ? alors qu'il faudrait rester
Cas c : tu restes dans la boucle ?
Cas d : tu restes dans la boucle ?

A quoi sont connectés 11 et 12 ? Est-ce que tu as testé la patte 12 seule ? Tu sais que tu peux utiliser la patte 13 en sortie pour avoir une lumière qui s'allume ou s'éteint. Si ça se trouve la tension sur la patte 12 n'est pas suffisamment faible pour être lue comme LOW et est vue toujours au niveau HIGH par la carte ? Ce qui correspondrait bien aux deux cas a et b.
« Last Edit: November 17, 2010, 03:28:30 am by julien@pobot.org » Logged

Pages: [1]   Go Up
Jump to: