Problème de tout nouveau débutant

Bonjour,

Je commence juste sur l'Arduino Uno, je me suis amusé à faire clignoté des led dans tous les sens, ok ça marche. ET là je me dis je vais rajouter un interrupteur.
Ben là ça ne marche pas.

void setup() {
  pinMode(8, INPUT);
  Serial.begin(9600);
 }

void loop() {
 int value=0;
value=digitalRead(8);
Serial.println(value);
 }

Et bien ma valeur value varie entre 0 et 1 sans que je ne fasse rien.
Si j'appuis sur mon interrupteur alors là cela se stabilise bien à 1.

Qu'est-ce que je fait de pas bien ?

Merci d'avance.

Bonjour,

Est ce qu'il y a bien une résistance de pulldown sur ta pin? Sinon ta pin est en l'air et tu lis n'importe quoi.

Le plus simple est d'utiliser le pullup interne en utilisant INPUT_PULLUP (en en inversant le test du bouton)
pullup.png

Un peu de lecture ne fait pas de mal : le bouton poussoir

Et plus généralement, pour en savoir plus sur l'utilisation des arduinos : blog d'Eskimon, Locoduino --> des valeurs sûres.

Ensuite, pour toute question sur la syntaxe de programmation : c++ reference.

Met tout ça dans tes favoris, tu risques d'y retourner souvent...

Qu'est-ce que je fait de pas bien ?

a) Quand je regarde des exemples de programmes d'arduino, tout simples, la première chose que je vois, ce sont des commentaires décrivant le câblage (écrire que "// la patte 8 de l'arduino est reliée à un poussoir/interrupteur dont l'autre côté est relié à la masse " ne ferait pas de mal, et simplifierait la vie quand un montage devient complexe)

b) si vous voulez changer la patte de votre interrupteur, une déclaration, avant le setup, du type

 const int BOUTON=8;

ou (un peu moins bien)
#define  BOUTON 8 vous simplifera la vie

c) beaucoup de gens initialisent la vitesse de transmission de la voie de debugging à 9600 bauds; on peut la porter sans aucune difficulté à 115200 (si on craint beaucoup de bugs ou si on espère transmettre plein de choses)

d) votre boucle scrute à toute vitesse l'interrupteur/bouton; mettre une pause de 0.5 secondes vous laisserait le temps de lire

Un programme sommaire, tenant compte de presque toutes ces critiques, serait de la forme

// test de bouton, relié à la patte 8 et à la masse
//
const int BOUTON = 8;
void setup() {
  pinMode(BOUTON, INPUT_PULLUP); // préconisé par Kamil
  Serial.begin(115200); // vitesse maximale tolérée, tant par les PC que les RPi
 }

void loop() {
   int value = digitalRead(BOUTON);
  Serial.println(value);
  delay(500); // voir blinkwithoutDelay plus tard
 }

L'IDE Arduino dispose d'une console série qui affiche des données (nombres ou texte) mais aussi d'un traceur série qui permet de faire des courbes. Avec ton code (en passant de 9600 à 115200 baud) ou celui de dbrion (sans le delay) tu peux voir ce qu'il se passe lorsque tu appuies sur le bouton, par exemple les rebonds.

"ou celui de dbrion (sans le delay)"

Je n'ai fait qu'infliger des modifications cosmetiques au code originel, et rajouter l'initialisation par "tirage vers le haut " proposée par Kamil (modif qui n'a rien de cosmétique).
Le delay (500) permet de cacher tous -presque- les rebonds : ça donne une impression que "ça marche" (alors que tirer vers une valeur logique donnée ne résout pas le problème des éventuels rebonds).

La boucle loop, avec un baud rate de 115200 bits (soit 10 000 caractères par seconde) a un goulet d'étranglement lié à la transmission de 3 caractères (0, \n, \r) et dure à peu près 300 microsecondes.

J'espère que le traceur série (qui est une "nouveauté" assez jolie ) sera assez rapide pour montrer d'éventuels jolis rebonds (c'est plus interessant que de les cacher, et l'idée de lesept est très bonne IMO).

Ce traceur serie est accessible dans la partie du menu dédiée à la gestion de la console série: de toutes façons, nunental devra reconfigurer sa vitesse de transmission.... et peut donc la trouver, ou protester.