Débutant problème de boucle

Bonjour à tous,

Je débute avec Arduino, j'ai un petit problème tout simple que je n'arrives pas à solutionner:

voici mon code:

boolean test;
boolean preced;

void setup()
{
  Serial.begin(9600);
  pinMode(6, INPUT);
 preced=false;
}

void loop()
{
  test = digitalRead(6);
  if ( test != preced);
  {
  Serial.println(test);
  preced = test;
  }
}

J'aimerais que ne sorte sur le port série que les changements d'états de la pin 6, or, la, ça me sort en continu soit 0 soit 1 en fonction de l'état de la broche, c'est pourtant simple mais je ne vois pas où je me suis trompé.
Merci par avance pour vos éclaircissements.
David

Comment est câblé la pin 6 ? Si elle flotte son état va varier au gré des perturbations électromagnétiques

Un PULLUP serait sans doute nécessaire si vous n’avez pas de résistance de tirage externe

pinMode(6, INPUT_PULLUP);

(Sinon digitalRead ne retourne pas un boolean mais un entier, HIGH ou LOW, pour la coherence de type)

PS: et bravo pour avoir utilisé les balises de code pour votre premier post !

Supprime le ; à la fin.

1 Like

bien vu !

Super, ça fonctionne bien maintenant.
Pour la pull up, elle est en hard, je suis électronicien, donc ça, je maitrise...
Pour bien comprendre, le fait de mettre ce fameux ; à la fin de l'instruction if, lui fait ignorer la ligne ( puisque ça me sortait bien l'état de la broche mais en continu ) mais ne ressort pas en erreur à la compilation ?
Il va falloir que je me fasse à ce langage de prog :slight_smile:
Merci pour vos réponses rapide
David

en C++ le ; marque la fin d'une expression (un statement en anglais)

Une expression vide est acceptée vous pouvez écrire

void loop() {
  ;;;;;;;;;
}

ça va compiler sans souci (et en rien faire bien sûr)

la syntaxe d'un SI c'est

if (condition) expression-si-vrai

donc en écrivant

if ( test != preced);

l'expression qui est exécuté si la condition est vraie et l'expression vide

ensuite en C++ il y a la notion de compound statement (expression composée) qui permet de grouper entre accolades plusieurs expressions pour n'en faire qu'une seule

donc

{
  expression1
  expression2
  expression3
}

est une expression de type "composée" qui regroupe trois expressions

le compilateur quand il voit cela exécute les expressions les unes après les autres

Pour revenir au if, c'est pour cela qu'on met des {} si on a plusieurs choses à faire si l'expression est vraie parce que la syntaxe ne supporte qu'une seule expression à éxecuter

if (condition) expression-si-vrai

donc en mettant une paire d'accolades, on a fabriqué une expression (qui va contenir toutes les expressions que l'on veut)

au final votre code donc faisait
if ( test != preced) ; // --> ne rien faire

puis enchaînait toujours avec ce groupe d'expressions

  {
  Serial.println(test);
  preced = test;
  }

cerise sur le gateau, comme l'optimiseur du compilateur a dû voir que le if ne servait à rien, il l'a sans doute viré carrément :wink:

PS/

elle existe directement dans le micro-processeur, on peut l'activer par

  pinMode(6, INPUT_PULLUP);

ça évite le branchement externe et la résistance