PIlotage de 6 leds avec bouton poussoir

Bonjour,
Tour d'abord ,je dois piloter un ensemble de 6 leds l'ors d'un appui sur un bouton poussoir. Chaque appui allume une led et éteint la précédente.
Donc, voici le code que j'ai fais (sous visual studio):

#include <Arduino.h>
const int Ledpin1 = 12; 
const int Ledpin2 = 13;
const int Ledpin3 = 14;  
const int Ledpin4 = 16;


const int Button = 27;

 void setup() {
 
  pinMode(Ledpin1, OUTPUT);
  pinMode(Ledpin2, OUTPUT);
  pinMode(Ledpin3, OUTPUT);
  pinMode(Ledpin4, OUTPUT);

  pinMode(Button, INPUT);
  }
void loop() {
 
  for (int i = 12 ; i <= 18 ; i++) 
  {
    
  if (digitalRead(Button) == 1)
  
   i++; 
   digitalWrite (i, HIGH) ;'
   
    
    delay (250) ; // durée du flash 50 millisecondes
   i--;
    digitalWrite (i, LOW) ; // éteint la DEL
    
  }

}

ça marche presque comme je veux mais c'est que la première led s'allume même quand j'ai pas appuyé sur le BP alors que je veux pas qu'elle s'allume sans le BP.
Je voudrais de l'aide svp

vos N° de pins ne vont pas de 12 à 18 (c'est 12, 13, 14 et 16)

pourquoi "tripotez" vous i dans la boucle ??

pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon. regardez comment gérer un bouton, les INPUT_PULLUP, et surtout comment détecter le changement d'état, pas le fait que le bouton soit tenu appuyé

un tableau serait une bonne idée pour conserver le N° des pins des LEDs

merci beaucoup, pour votre réponse. Mais je n'ai pas compris quand vous dites "pourquoi "tripotez" vous i dans la boucle". Et vous parlez d'un tableau comment ça?

#include <Arduino.h>
const int Ledpin1 = 12; 
const int Ledpin2 = 13;
const int Ledpin3 = 14;  
const int Ledpin4 = 16;


const int Button = 27;

 void setup() {
 
  pinMode(Ledpin1, OUTPUT);
  pinMode(Ledpin2, OUTPUT);
  pinMode(Ledpin3, OUTPUT);
  pinMode(Ledpin4, OUTPUT);

  pinMode(Button, INPUT);
  }
void loop() {
 
  for (int i = 12 ; i <= 16 ; i++) 
  {
    
  if (digitalRead(Button) == 1)
  
   i++; 
   digitalWrite (i, HIGH) ;
   
    
    delay (250) ; // durée du flash 50 millisecondes
   i--;
    digitalWrite (i, LOW) ; // éteint la DEL
    
  }

}
```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

pourquoi faire

dans la boucle ?

lisez aussi un peu de doc sur les if et ce qui est exécuté si on ne met pas de {}

quand j'appui une led s'allume mais éteint la précédente. Sans ça ,ça marche pas et quand je mets {} ça marche pas non plus j'ai juste un pb. que la première led ne soit pas allumé de base mais quand j'appuie sur le bouton

Au lieu de faire ça

On fait plutôt ça

  for (int i = 12 ; i <= 16 ; i++) 
  {   
    if (digitalRead(Button) == 1)
      digitalWrite (i + 1, HIGH) ;
      delay (250) ; // durée du flash 50 millisecondes
      digitalWrite (i - 1, LOW) ; // éteint la DEL
 
  }

Je ne m'occupe pas des accolades je te laisse un peu chercher. Je suis d'ailleurs surpris que cela fonctionne tel que tu le décris.

On ne sait pas comment est câblé le bouton, mais s'il n'y a pas de résistance de tirage externe le bouton peut-être vu actionné même si ce n'est pas le cas.

EDIT: je viens de comprendre pourquoi le code d'origine est tombé en marche. Comme le if n'a pas d'accolade, le i++ ne se fait pas et du coup la boucle n'avance pas.

Pour être plus clair, si tu modifie la valeur de i dans la boucle, tu modifie les conditions de ta boucle.
En d'autre termes, si tu ne maitrise pas ce que tu fais, rien te garantit que tu aura bien fait 5 itérations.
C'est pour ça que @fdufnews t'a proposer un code ou tu te sert de la valeur de i dans la boucle, sans la changer.

de toutes façons les pins prévues sont

et la boucle utilise 12, 13, 14, 15, 16 et 17 potentiellement... donc il y a un truc louche

non la 15 n'est pas disponible car je travaille sur la carte d1r32 mais est-ce quelqu'un pourrait m'aider c'est urgent car mon prof a dit que la boucle for est faux. C'est vraiment une urgence

Quelle est l’urgence ??
Depuis le premier post on vous dit que la boucle ne va pas…

j'ai compris que la boucle n'allait pas.
Donc ,je demandes votre aide c'est tout. J'ai beau gratter je n'y arrive pas.

Écrivez un code qui imprime appui bouton lors de l’appui (une seule fois, pas tant que le bouton est appuyé ) et postez cela

Du coup ça a donné quoi ?
@fdufnews a corrigé ta boucle, comment ça ce fait que ton prof te dise quelle est fausse?

il a juste traité le souci de la manipulation des indices mais pas le fait que ça ne correspond pas aux pins.

de plus il ne faut pas de boucle du tout, c'est la loop() qui doit servir à traiter le sujet

@J-M-L c'est pas que ça ne correspond pas, c'est qu'il manque la déclaration de deux LED surtout, puisqu'il en déclare 4 sur les 6 annoncées.

Il faut, il faut, ça serait mieux plutôt, mais rien ne t'empêche de gérer mal les choses et que cela corresponde à ce qui est demandé :slight_smile:

J’sais pas pour vous, mais moi mon cerveau me l’interdit…

Ça ne m'étonne pas​:smiley:, mon cerveau est beaucoup plus arrangeant :face_with_hand_over_mouth:

Question d’esthétique… et puis ça semble naturel comme algo

void loop() {
  si (appuiBouton) {
    eteindre Led en Cours (si une est allumée)
    Led en Cours devient LED Suivante (retour au début de la liste si on est à la fin)
    Allumer Led en Cours 
  }
} 

Avec Une variable globale qui serait le N° de la pin en cours ou mieux un Index dans un tableau de pins (si elles ne sont pas séquentielles c’est mieux)

merci à tous pour vos réponses c'est que je suis en bac+3. On m'a pas appris à bien coder, les méthodes d'apprentissage en informatiques sont nulle dans l'éducation national, on nous apprends aucune méthode de réflexion et j'ai donc réussis avec de l'aide bien sur en faisant ça :


int Appuye=0; // tes variables (count, new count, initialisation à 0)
int Appuye2;
void setup()

{
Serial.begin(9600);
pinMode(27,INPUT);  //ton bouton
pinMode(12,OUTPUT); //Led 1
pinMode(13,OUTPUT); //Led 2
pinMode(14,OUTPUT); //Led 3
pinMode(16,OUTPUT); //Led 4
pinMode(17,OUTPUT); //Led 5
pinMode(18,OUTPUT); //Led 6
}

void loop()
{

if(digitalRead(27)==HIGH) //High = Led ON
{
Appuye2=Appuye+1; // Incrémente de 1 lors de chaque pression
if(Appuye2!=Appuye)
{
Serial.println(Appuye2);
switch (Appuye2)
{
case 1: digitalWrite(12,HIGH);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        digitalWrite(16,LOW);
        digitalWrite(17,LOW);
        digitalWrite(18,LOW);
break;

case 2: digitalWrite(13,HIGH);
        digitalWrite(12,LOW);
        digitalWrite(14,LOW);
        digitalWrite(16,LOW);
        digitalWrite(17,LOW);
        digitalWrite(18,LOW);
break;

case 3: digitalWrite(14,HIGH);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(16,LOW);
        digitalWrite(17,LOW);
        digitalWrite(18,LOW);
break;

case 4: digitalWrite(16,HIGH);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        digitalWrite(17,LOW);
        digitalWrite(18,LOW);
break;

case 5: digitalWrite(17,HIGH);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        digitalWrite(16,LOW);
        digitalWrite(18,LOW);
break;

case 6: digitalWrite(18,HIGH);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        digitalWrite(16,LOW);
        digitalWrite(17,LOW);
break;

default: digitalWrite(12,LOW); // initialisé sur OFF 
digitalWrite(13,LOW);
digitalWrite(14,LOW);
digitalWrite(16,LOW);
digitalWrite(17,LOW);
digitalWrite(18,LOW);
Appuye2=0;
break;
}
Appuye=Appuye2; //Eteint les led après avoir appuyé 6 fois sur le bouton
}
}
delay(100); //delai de 100ms
}`