[DEBUTANT] led et bouton-poussoir

Bonjour,

Débutant complet, tel le bambin faisant château branlant ses premiers pas, j'ai entrepris de réaliser un montage présenté dans "Arduino : premiers pas en informatique embarquée" (page 172 et suiv.). Il s'agit d'utiliser un bouton-poussoir pour commander l'allumage d'une led. J'ai suivi scrupuleusement les instructions, une led protégée par une résistance 220 ohms, un bouton-poussoir doté d'une résistance de "pull-up" et d'un condensateur pour limiter "l'effet rebond", et un petit programme tout simple : lorsque le bouton est enfoncé, la lampe s'éclaire, lorsqu'il est relâché, elle s'éteint. Cela fonctionne parfaitement (mais que d'efforts pour allumer une loupiote !)
Là où les choses se sont compliquées, c'est lorsque j'ai eu l'idée (saugrenue ?) de mettre une seconde led sur mon installation, avec l'idée que les deux pourraient s'allumer et s'éteindre en alternance selon l'état du bouton. J'ai donc branché une seconde led, avec exactement le même dispositif, mais sur une autre broche de l'Arduino, bien sûr, avec un programme tout bête :

const int bouton = 3;      //le bouton est connecté à la broche 3
const int led1=10;           // la led 1 est connectée à la broche 10
const int led2=11;          // la led 2 est connectée à la broche 11
int etatBouton;               // variable qui enregistre l'état du bouton


void setup() {
 pinMode(led1, OUTPUT);       // la led 1 est une sortie
 pinMode(led2, OUTPUT);       // la led 2 est une sortie
 pinMode(bouton, INPUT);     // le bouton est une entrée
 etatBouton = HIGH;              // on initialise l'état du bouton comme "relâché"
}

void loop() {
  etatBouton = digitalRead(bouton);        // rappel : bouton = 3

  if (etatBouton == HIGH)              // test si le bouton a un niveau logique haut
  {
   digitalWrite(led1, HIGH);             // la led 1 s'allume
   digitalWrite(led2, LOW);              // la led 2 est éteinte
  }
  
  else (etatBouton == LOW);           // si le bouton a un niveau logique différent de HIGH
  {
    digitalWrite(led1, LOW);              // la led 1 est éteinte
    digitalWrite(led2, HIGH);             // la led 2 s'allume
  }
}

Ça fonctionne, disons… à moitié. La première led réagit parfaitement, s'allume et s'éteint sans problème. La seconde en revanche, reste toujours à moitié allumée alors qu'elle devrait s'éteindre complètement, mais elle réagit tout de même et s'illumine de tout son éclat lorsque c'est son tour de briller. Disons que la première réagit à 0% et 100%, la seconde seulement à 50% et 100%. J'ai tout essayé, changer les led, les mettre sur des breadbords séparées, changer les bornes de l'Arduino, même changer d'Arduino, changer le bouton, changer la valeur des résistances et du condensateur, rien à faire. En désespoir de cause, j'ai supprimé le bouton-poussoir, sa résistance et son condensateur, pour établir et couper le contact manuellement avec un cavalier. Tiens ! Tu rêves, mon gars ! Cette laide led reste toujours à moitié allumée.

Le circuit réduit à sa plus simple expression, j'en déduis qu'il ne s'agit pas d'un problème matériel, de connexion ou de branchement. Les led fonctionnent parfaitement avec un programme simple ne faisant pas appel au "if" "else" ou "bouton", elles s'allument et s'éteignent alternativement ou simultanément, avec un enthousiasme qui réjouit le cœur et elles s'éteignent complètement lorsqu'on le leur demande.

Je voudrais comprendre, bon sang ! Il n'y a plus de bouton ! Lorsque je relie les bornes avec un fil électrique, le circuit est fermé, non ? Et lorsque j'ôte le fil, il est ouvert. Ça fonctionne bien comme un interrupteur ! Il faut qu'une porte soit ouverte ou fermée, disait Musset (et vous avez le bonjour d'Alfred). J'ai l'impression que pour une de mes led, la porte est toujours entrebâillée...

Merci d'avoir lu, merci pour vos commentaires, vos suggestions, vos solutions, et surtout vos explications, mille excuses aux spécialistes pour la naïveté de ce message (mais bon, je suis en ce domaine comme l'enfant qui découvre les lettres dans son abécédaire). Si je n'ai pas la solution, je n'irai pas me fiche à l'eau, c'est certain, mais tout ça risque fort de finir à la poubelle.

Cordialement

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

bonjour, même simple, un circuit est source de problèmes, de mauvais branchement. Ton problème ressemble a une masse absente sur ta 2ème led. Vérifie que le - de la led est bien relié au 0v

Bonjour,

La il y a un problème

Je suppose que tu as voulu mettre
else if (etatBouton == LOW)

En fait il suffit de mettre else, sans rien derrière et surtout pas de ; tout simplement

  else          // si le bouton a un niveau logique différent de HIGH
  {
    digitalWrite(led1, LOW);              // la led 1 est éteinte
    digitalWrite(led2, HIGH);             // la led 2 s'allume
  }
}

ce n'est pas l'expression correcte d'un if-else en C++

on écrit

if (condition) {
  // code si vrai
} else {
  // code si faux
}

si on veut refaire un test, il faut remettre un if

if (condition1) {
  // code si condition1 vraie
} else if (condition2) {
  // code si condition1 fausse et condition2 vraie
} else {
  // code si condition1 fausse et condition2 fausse
}

Mille mercis pour vos réponses. En fait, c'était ça, la solution. Ça fonctionne à présent parfaitement et mes deux led s'éteignent et s'allument sans problème. Reste à comprendre pourquoi, car enfin, le code original me paraissait tout à fait logique et fonctionnait très bien avec une seule led. Je mesure ce qu'il me reste à apprendre.

Merci encore.
Cordialement.

Ce n'est pas un problème de logique.
C'est un problème de syntaxe.
Cette ligne

else (etatBouton == LOW);

ne faisait rien et le groupe de lignes juste derrière s'exécutait tout le temps.