Controler plusieurs Leds avec plusieurs boutons poussoirs en mode ON/OFF

Bonjour à tous,
Je suis nouveau sur ce forum.
Je viens de me lancer sur un projet qui nécessite une carte arduino (ou raspberry).
Je découvre complètement le langage arduino et je galère un peu malgré toutes mes recherches.
Je souhaite utiliser plusieurs boutons poussoirs et plusieurs Leds de manière à ce que chaque bouton allume une unique Led et que toutes les autres s'éteignent.

Voici une capture de mon code ainsi qu'une capture de mon circuit (réalisé sur thinkercad).
J'ai ajouté les multimètres juste pour vérifier que la tension initiale :slight_smile: (grand débutant)
Je ne comprends pas pourquoi les Leds sont allumées au démarrage et aucune réaction lors de l'appui des boutons.

Merci d'avance pour le temps consacré et l'aide apportée.

b

const int btn_1 = 3;  // Bouton 1 pour allumer la led 1
const int btn_2 = 4;  // Bouton 2 pour allumer la led 2
const int btn_3 = 5;  // Bouton 2 pour allumer la led 3
const int btn_4 = 6;  // Bouton 2 pour allumer la led 4

const int led_1 = 8;      // Led 0
const int led_2 = 9;      // Led 1
const int led_3 = 10;     // Led 2
const int led_4 = 11;     // Led 3

int numero_led;  // le numéro de la led qui sera allumée
int etat_bouton;     // lecture de l'état des boutons

int memoire_btn_1 = LOW;   // état relâché par défaut pour le bouton 1
int memoire_btn_2 = LOW;   // état relâché par défaut pour le bouton 2
int memoire_btn_3 = LOW;   // état relâché par défaut pour le bouton 3
int memoire_btn_4 = LOW;   // état relâché par défaut pour le bouton 4

void setup()
{
    pinMode(btn_1, INPUT);
    pinMode(btn_2, INPUT);
	pinMode(btn_3, INPUT);
    pinMode(btn_4, INPUT);

    pinMode(led_1, OUTPUT);
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
}

void loop()
{
	etat_bouton = digitalRead(btn_1); //lecture de son état

    if((etat_bouton != memoire_btn_1) && (etat_bouton == HIGH))
    {
        numero_led = 1;
    }
    memoire_btn_1 = etat_bouton;
	
	etat_bouton = digitalRead(btn_2);
	    if((etat_bouton != memoire_btn_2) && (etat_bouton == HIGH))
    {
        numero_led = 2;
    }
    memoire_btn_2 = etat_bouton;

    etat_bouton = digitalRead(btn_3);
		    if((etat_bouton != memoire_btn_3) && (etat_bouton == HIGH))
    {
        numero_led = 3;
    }
  
      etat_bouton = digitalRead(btn_4);
    if((etat_bouton != memoire_btn_4) && (etat_bouton == HIGH))
    {
        numero_led = 4;
    }
    memoire_btn_4 = etat_bouton;

	allumage(numero_led);
}

void allumage(int valeur_recue) 
{
    digitalWrite(led_1, LOW);
    digitalWrite(led_2, LOW);
    digitalWrite(led_3, LOW);
    digitalWrite(led_4, LOW);

    if(valeur_recue=1)  // "si la valeur reçue est égale à 1..."
    {
        digitalWrite(led_1, HIGH);
    }
    if(valeur_recue=2)  // "si la valeur reçue est égale à 2..."
    {
        digitalWrite(led_2, HIGH); 
    }
    if(valeur_recue=3)
    {
        digitalWrite(led_3, HIGH);
    }
    if(valeur_recue=4)
    {
        digitalWrite(led_4, HIGH);
    }
}


: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

Désolé.
J'avais bien vu ces recommandations.
Il me semblait également avoir utilisé le raccourci en haut à droite pour créer mon post.

Bonjour,

Les BP étant symétriques, pour éviter de se casser la tête, câble les en "diagonale", comme ceci:


De plus, il ne faut pas mettre 2 résistances par BP, mais 1 seule.

Et tenir compte du fait que le BP appuyé, avec ce montage, tu envois un 0.

Bonne continuation.

Complément:

La résitance que j'ai laissé sur le schéma permet de fixer le potentiel de l'entrée Arduino quand le contact est ouvert.

Elle est dite Résistance de PULLUP parce qu'elle raméne un état haut quand le BP est ouvert.

Si tu veux simplifié le montage, tu peux coder ainsi dans le setup

    pinMode(btn_1, INPUT_PULLUP);
    pinMode(btn_2, INPUT_PULLUP);
    pinMode(btn_3, INPUT_PULLUP);
    pinMode(btn_4, INPUT_PULLUP);

Et ne pas cabler les résistance de pullup externes.

Bonjour vincentm0911

Pratique Thinkercad :wink:
Regades cet exemple pour câbler tes boutons

Ton programme doit fonctionner sans modification. Après, je te montrerai comment te passer de résistances.

Cordialement
jpbbricole

Merci pour ces précisions :slightly_smiling_face:
J'ai recâblé mon montage et modifié mon code et maintenant ça fonctionne.
Par contre, je ne comprends pas pourquoi le système de message de la première version ne fonctionnait pas. J'ai l'impression que le message "numero de led" n'était pas bien envoyé ou qu'il était mal interprété en fin de programme.

Voici le câblage actuel et le code.

const int btn_1 = 0;  // Bouton 1 pour allumer la led 1 sur pin 0
const int btn_2 = 1;  // Bouton 2 pour allumer la led 2 sur pin 1
const int btn_3 = 2;  // Bouton 3 pour allumer la led 3 sur pin 2
const int btn_4 = 3;  // Bouton 4 pour allumer la led 4 sur pin 3
const int btn_5 = 4;  // Bouton 5 pour allumer la led 5 sur pin 4
const int btn_6 = 5;  // Bouton 6 pour allumer la led 6 sur pin 5
const int btn_7 = 6;  // Bouton 7 pour allumer la led 7 sur pin 6
const int btn_8 = 7;  // Bouton 8 pour allumer la led 8 sur pin 7


const int led_1 = 8;      // Led 1 sur pin 8
const int led_2 = 9;      // Led 2 sur pin 9
const int led_3 = 10;     // Led 3 sur pin 10
const int led_4 = 11;     // Led 4 sur pin 11
const int led_5 = 12;     // Led 5 sur pin 12
const int led_6 = 13;     // Led 6 sur pin 13
const int led_7 = A0;     // Led 7 sur pin A0
const int led_8 = A1;     // Led 8 sur pin A1


int timeDelay = 20;		  	// Delay pour éviter les rebonds du bouton poussoir

void setup()
{
    pinMode(btn_1, INPUT);		// Les pin boutons sont en entrées sur le Arduino	
    pinMode(btn_2, INPUT);
	pinMode(btn_3, INPUT);
    pinMode(btn_4, INPUT);
    pinMode(btn_5, INPUT);
    pinMode(btn_6, INPUT);
    pinMode(btn_7, INPUT);
    pinMode(btn_8, INPUT);

    pinMode(led_1, OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
    pinMode(led_5, OUTPUT);
    pinMode(led_6, OUTPUT);
    pinMode(led_7, OUTPUT);
    pinMode(led_8, OUTPUT);	
}

void loop()
{
		if (digitalRead(btn_1) == HIGH)
		{
			digitalWrite(led_1, HIGH);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}	

		if (digitalRead(btn_2) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, HIGH);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);			
		}	
		
		if (digitalRead(btn_3) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, HIGH);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}
		
		if (digitalRead(btn_4) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, HIGH);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}

		if (digitalRead(btn_5) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, HIGH);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}

		if (digitalRead(btn_6) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, HIGH);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}

		if (digitalRead(btn_7) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, HIGH);
			digitalWrite(led_8, LOW);		
			delay(timeDelay);
		}

		if (digitalRead(btn_8) == HIGH)
		{
			digitalWrite(led_1, LOW);
			digitalWrite(led_2, LOW);
			digitalWrite(led_3, LOW);
			digitalWrite(led_4, LOW);
			digitalWrite(led_5, LOW);
			digitalWrite(led_6, LOW);
			digitalWrite(led_7, LOW);
			digitalWrite(led_8, HIGH);		
			delay(timeDelay);
		}
}

Le code est un peu long (grand débutant !).
J'ai essayé d'utiliser une boucle

for (int i = 1; i <= 8; i++) {pinMode(btn_[i], INPUT);}

pour déclarer les pin en entrées et en sorties mais ça ne semble pas fonctionner. Une erreur de rédaction peut être ?

Bonjour vincentm0911

L'essentiel quand il y a de grandes répétitions est l'usage des tableaux.
Je t'ai modifié, à titre d'exemple, la gestion des LED, les pin des LED sont dans un tableau:
const int ledPin[] = {8, 9, 10, 11, 12, 13, A0, A1}; // Tableau des pin des LED

On calcule le nombre de LED ainsi
const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]); // Nombre de LED
(je te laisse chercher la signification comme celle de sizeof() :wink:)

L'initialisation des pin des LED ainsi que de leur extinction, au départ se font dans cette boucle:

	for (int l = 0; l < ledNombre; l ++)
	{
		pinMode(ledPin[l], OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
		digitalWrite(ledPin[l], LOW); // Eteindre la LED
	}

Et ton code modifié:

const int btn_1 = 0;  // Bouton 1 pour allumer la led 1 sur pin 0
const int btn_2 = 1;  // Bouton 2 pour allumer la led 2 sur pin 1
const int btn_3 = 2;  // Bouton 3 pour allumer la led 3 sur pin 2
const int btn_4 = 3;  // Bouton 4 pour allumer la led 4 sur pin 3
const int btn_5 = 4;  // Bouton 5 pour allumer la led 5 sur pin 4
const int btn_6 = 5;  // Bouton 6 pour allumer la led 6 sur pin 5
const int btn_7 = 6;  // Bouton 7 pour allumer la led 7 sur pin 6
const int btn_8 = 7;  // Bouton 8 pour allumer la led 8 sur pin 7


//const int led_1 = 8;      // Led 1 sur pin 8
//const int led_2 = 9;      // Led 2 sur pin 9
//const int led_3 = 10;     // Led 3 sur pin 10
//const int led_4 = 11;     // Led 4 sur pin 11
//const int led_5 = 12;     // Led 5 sur pin 12
//const int led_6 = 13;     // Led 6 sur pin 13
//const int led_7 = A0;     // Led 7 sur pin A0
//const int led_8 = A1;     // Led 8 sur pin A1
const int ledPin[] = {8, 9, 10, 11, 12, 13, A0, A1}; // Tableau des pin des LED
const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]); // Nombre de LED

int timeDelay = 20;		  	// Delay pour éviter les rebonds du bouton poussoir

void setup()
{
	pinMode(btn_1, INPUT);		// Les pin boutons sont en entrées sur le Arduino
	pinMode(btn_2, INPUT);
	pinMode(btn_3, INPUT);
	pinMode(btn_4, INPUT);
	pinMode(btn_5, INPUT);
	pinMode(btn_6, INPUT);
	pinMode(btn_7, INPUT);
	pinMode(btn_8, INPUT);

	for (int l = 0; l < ledNombre; l ++)
	{
		pinMode(ledPin[l], OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
		digitalWrite(ledPin[l], LOW); // Eteindre la LED
	}
	//pinMode(led_1, OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
	//pinMode(led_2, OUTPUT);
	//pinMode(led_3, OUTPUT);
	//pinMode(led_4, OUTPUT);
	//pinMode(led_5, OUTPUT);
	//pinMode(led_6, OUTPUT);
	//pinMode(led_7, OUTPUT);
	//pinMode(led_8, OUTPUT);
}

void loop()
{
	if (digitalRead(btn_1) == HIGH)
	{
		digitalWrite(ledPin[0], HIGH);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

	if (digitalRead(btn_2) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], HIGH);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}
	
	if (digitalRead(btn_3) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], HIGH);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}
	
	if (digitalRead(btn_4) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], HIGH);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

	if (digitalRead(btn_5) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], HIGH);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

	if (digitalRead(btn_6) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], HIGH);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

	if (digitalRead(btn_7) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], HIGH);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

	if (digitalRead(btn_8) == HIGH)
	{
		digitalWrite(ledPin[0], LOW);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], HIGH);
		delay(timeDelay);
	}
	//if (digitalRead(btn_8) == HIGH)
	//{
	//digitalWrite(led_1, LOW);
	//digitalWrite(led_2, LOW);
	//digitalWrite(led_3, LOW);
	//digitalWrite(led_4, LOW);
	//digitalWrite(led_5, LOW);
	//digitalWrite(led_6, LOW);
	//digitalWrite(led_7, LOW);
	//digitalWrite(led_8, HIGH);
	//delay(timeDelay);
	//}
}

J'ai laissé tes lignes en remarques.

Essaies de faire la même chose avec les boutons, si problème, n'hésites pas à poser des questions, une fois fait, on pourra supprimer la résistance de PULLDOW
image
par la résistance de PULLUP, interne à l'Arduino. Petite remarque concernant l'attribution des pin des boutons, tu utilises 0 et 1, or ces pin sont utilisées par la communication du port USB, d'où, peut être la cause de ceci:

Tu as encore des ports de libre comme A2 et A3, tu peux les utiliser en digitalRead, pour btn_1 et btn_2.
La prochaine étape, sera de créer une fonction qui allume la LED en fonction d'un bouton, ça simplifie l'écriture, surtout lorsque dans une action comme:

	if (digitalRead(btn_1) == HIGH)
	{
		digitalWrite(ledPin[0], HIGH);
		digitalWrite(ledPin[1], LOW);
		digitalWrite(ledPin[2], LOW);
		digitalWrite(ledPin[3], LOW);
		digitalWrite(ledPin[4], LOW);
		digitalWrite(ledPin[5], LOW);
		digitalWrite(ledPin[6], LOW);
		digitalWrite(ledPin[7], LOW);
		delay(timeDelay);
	}

qui se répète 8 fois avec seulement un paramètre qui change.
Dis moi quand tu est prêt pour ça :wink:

A+
Cordialement
jpbbricole

oops... :cold_face:

Oui, quel ....
Je corrige ça au plus vite.

C'est corrigé.

1 Like

Merci pour tous ces conseils.
C'est pour ça que je suis venu sur ce forum ! :slight_smile:
Je n'aurai pas le temps de me former sur les spécificités de l'arduino mais je tiens quand même à faire quelque chose de "propre".

Je me mets au boulot. Je maitrise le côté logique algo mais pas la langage arduino.

Petite question concernant le Puldown (ou Up) : j'avais vu cette possibilité de déclaration des pins dans mes recherches mais concrètement, quelle est la différence entre mettre une résistance externe ou utiliser celle interne ? Ca fait une soudure en moins mais est ce que ça a une influence sur le comportement de l'arduino ? Au niveau de la réaction du calculateur ?

deux soudures et une résistance en moins

sinon pas de différence (à moins de prendre une valeur "idiote" pour la résistance).

L'avantage de celle qui est intégrée, c'est qu'elle est intégréé :slight_smile:

Bonjour vincentm0911

Oui, ça fait des soudures en moins :wink:.
C'est seulement dans des conditions d'environnement "bruité" électroniquement parlant que l'on met des résistances externes de basse valeurs.
Attention avec les PULLUP Iinternes de l'Arduino, le bouton est d'un côté à GND et on lit le bouton actif == LOW (c'est l'inverse de ton programme).

Ds renseignements ici.

A+
Cordialement
jpbbricole

Bonjour,

Dans un systéme trés electroniquement bruité, les courants parasites génerent des tensions parasites selon la loi "U= RxI".

Donc plus R est grand, plus U parasite est grand.

Comme on ne connait pas exactement la valeur de R pullup Interne, mieux vaut parfois (quand c'est trés bruité) en mettre une externe de valeur connue (2k Ohms).

Mais dans ton cas, je ne pense pas que se soit utile, le PULLUP Interne suffit je pense.

Ca fonctionne :slight_smile:

const int btnPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Tableau des pin des boutons
const int btnNombre = sizeof(btnPin) / sizeof(btnPin[0]); // Nombre de boutons

const int ledPin[] = {10, 11, 12, 13, A0, A1, A2, A3}; // Tableau des pin des LED
const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]); // Nombre de LED = nombre d'éléments du tableau calculé à partir du nombre d'octets occupés par le tableau divisé par le nombre d'octets occupé par un seul élément du tableau (ic ile premier)

int timeDelay = 200;		  	// Delay pour éviter les rebonds du bouton poussoir
int timeDemo = 200;

int i;							// Variables muettes pour les boucles for
int k;

void setup()
{
for (int i = 0; i < ledNombre; i ++)    //la variable i boucle 8 fois sur le tableau
	{
	pinMode(ledPin[i], OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
	pinMode(btnPin[i], INPUT$);		// Les pin Leds sont en sorties sur le Arduino
	digitalWrite(ledPin[i], LOW); 	// Eteindre la LED
	}
}

void loop()
{
	for (int i = 0; i < ledNombre; i ++)
	{
		if (digitalRead(btnPin[i]) == HIGH)
		{
			delay(timeDelay);
			digitalWrite(ledPin[i], HIGH); // led i allumée en mode PULLUP
				
			for (int k = 0; k < i; k++)
			{
			digitalWrite(ledPin[k], LOW); // Leds éteintes en mode PULLUP
			}
				
			for (int k = i+1; k < ledNombre; k++)
			{
			digitalWrite(ledPin[k], LOW);  // Leds éteintes en mode PULLUP
			}
		}	
	}	
}

Par contre, j'ai essayé de virer la résistance et du coup le fil sur le 5V de chaque poussoir pour passer les INPUT en PULLUP.
Les poussoirs sont reliés uniquement au GRND et à la pin d'Entrée.
J'ai changé ma condition de if (digitalRead(bouton) == LOW
et là ça ne fonctionne plus. :anguished:

C’est quoi ce dollar?

(Sinon c’est souvent plus simple de tout éteindre et ensuite allumer la bonne led. A la vitesse de votre arduino ça ne se voit pas et le délai serait mieux après la gestion des leds qu’avant

Bonsoir vincentm0911

Voilà un exemple en PULLUP:

Le programme:

/*
    Name:       AF_Controle_8_LED_8_boutons_C.ino
    Created:	10.11.2024
    Author:     jpbbricole
*/

//------------------------------------- Définition des interfaces, boutons, LED
struct interfacesDef
{
	const int btnPin; // Pin du bouton
	const int ledPin; // Pin de la LED
};

interfacesDef intf[] = {{2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, A0}, {7, A1}, {8, A2}, {9, A3}};
const int intfNombre = sizeof(intf) / sizeof(intf[0]); // Nombre de boutons

int timeDelay = 20;		  	// Delay pour éviter les rebonds du bouton poussoir

void setup()
{

	//--------------------------------- Initialisation des interfaces
	for (int i = 0; i < intfNombre; i ++)
	{
		pinMode(intf[i].btnPin, INPUT_PULLUP);		// Les pin boutons sont en entrée sur le Arduino, un côté à GND

		pinMode(intf[i].ledPin, OUTPUT);	
		digitalWrite(intf[i].ledPin, LOW); // Eteindre la LED
	}
}

void loop()
{
	for (int i = 0; i < intfNombre; i ++)
	{
		if (digitalRead(intf[i].btnPin) == LOW)
		{
			ledAllumer(i);
		}
	}
}

void ledAllumer(int ledNum)
{
	for (int i = 0; i < intfNombre; i ++) 
	{
		if (i == ledNum) // Si LED sélectionnée
		{
			digitalWrite(intf[i].ledPin, HIGH); // Allumer la LED
		}
		else
		{
			digitalWrite(intf[i].ledPin, LOW); //Eteindre la LED
		}
	}
	
	delay(timeDelay);
}

A+
Bonne soirée
jpbbricole

@JML Jackson,
Le dollar était une faute de frappe qui avait été malheureusement copiée collée au moment de rédiger mon message.
Pour l'extinction des leds, je cherchais à les éteindre TOUTES SAUF celle allumée.
C'est vrai qu'au final avec ta solution, on y voit que du feu.

@jpbbricole,
d'hommage que je ne sois pas tombé sur ton projet avant :slight_smile: c'est exactement ce que je cherche à réaliser :slight_smile:
Mais au moins ça m'a permis de construire mon assemblage de A à Z et de comprendre le rôle de chaque élément et de chaque ligne de code.
Merci pour votre aide.
Je n'ai pas encore modifié en PULLUP, je le ferai probablement ce soir.

J'ai un dernier petit soucis, j'aimerais animer les leds au lancement du programme.
J'arrive à les allumer une par une de la 1 à la 8 (ledPin[0] à ledPin[7]).
Ensuite les éteindre une par une de la 8 à la 1.
Je les allume par paires de (1,5) à (4,8).
Par contre, lorsque je les éteins de (4,8) à (1,5), la led n°5 (ledPin[4] sur A0) s'éteint tout de suite en même temps que la 8. Je ne comprends pas où est le problème sur mon code.

const int btnPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Tableau des pin des boutons
//const int btnNombre = sizeof(btnPin) / sizeof(btnPin[0]); // Nombre de boutons

const int ledPin[] = {10, 11, 12, 13, A0, A1, A2, A3}; // Tableau des pin des LED
//const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]); // Nombre de LED = nombre d'éléments du tableau calculé à partir du nombre d'octets occupés par le tableau divisé par le nombre d'octets occupé par un seul élément du tableau (ic ile premier)

int timeDelay = 100;		  	// Delay pour éviter les rebonds du bouton poussoir
int timeDemo = 200;

int i;							// Variables muettes pour les boucles for
int k;

void setup()
{
for (int i = 0; i < 8 ; i = i+1)    //la variable i boucle 8 fois sur le tableau
	{
	pinMode(ledPin[i], OUTPUT);		// Les pin Leds sont en sorties sur le Arduino
	pinMode(btnPin[i], INPUT);		// Les pin Leds sont en sorties sur le Arduino
	digitalWrite(ledPin[i], LOW); 	// Eteindre toutes les LED
	}
	
// effet demarrage
for(int i = 0; i < 8; i++)		//LED allumée une par une
{
digitalWrite(ledPin[i],HIGH);
delay(timeDemo);
}
for(int i = 8; i > -1; i--)
{
digitalWrite(ledPin[i],LOW);		//LED éteinte une par une
delay(timeDemo);
}
delay(timeDemo);
  
for(int i = 0; i < 4; i++)		//LED allumée gauche droite
{
digitalWrite(ledPin[i],HIGH);
digitalWrite(ledPin[i+4],HIGH);
delay(timeDemo);
delay(timeDemo);
} 
for(int i = 8; i > 3; i--)		//LED éteinte droite grauche
{								//BUG ICI la ledPin[4] sur la pin A0 s'éteint tout de suite alors qu'elle devrait être la dernière.
digitalWrite(ledPin[i],LOW);
digitalWrite(ledPin[i-4],LOW);
delay(timeDemo);
}

for(int i = 0; i < 8; i++)			//LED flash
{
digitalWrite(ledPin[i],LOW);
}  
delay(timeDemo);for(int i = 0; i < 8; i++)		
{
digitalWrite(ledPin[i],HIGH);
}
delay(timeDemo);
for(int i = 0; i < 8; i++)
{
digitalWrite(ledPin[i],LOW);
}  
delay(timeDemo);
delay(timeDemo);

Bonjour vincentm0911

C'est exactement comme ceci qu'il faut progresser, quitte à faire compliqué, au départ.

Pour ton problème, je n'ai pas trouvé, mais une façon de procéder, faire des Serial.print aux endroits "stratégiques" de ton programme, ainsi:
dans Setup()
Serial.begin(115200);
Où il y a problème:

	for(int i = 8; i > 3; i--)		//LED éteinte droite grauche
	{								//BUG ICI la ledPin[4] sur la pin A0 s'éteint tout de suite alors qu'elle devrait être la dernière.
		Serial.println(i); // Pour contrôler la valeur de i
		digitalWrite(ledPin[i],LOW);
		digitalWrite(ledPin[i-4],LOW);
		delay(timeDemo);
	}

et tu as la trace dans ta console à 115200.

Quelques suggestions de show, ici.

A+
Cordialement
jpbbricole

Bonjour,

Le petit piége est là:

La 1ére Led, c'est ledPin[0] en broche 10

La 8éme Led, c'est ledPin[7] en broche A3

A faire gaffe dans les "for".

Je dirais même plus:

il n'y a as de ledPin[8]!
et ">-1" eqivaud à "=0", c'est plus élegant dirait les pros.

c'est le même souci que le

précédent :slight_smile:

de manière générale on évite de mettre des "nombres magiques" dans le code comme 8.

vous avez commenté les constantes qui comptent le nombre de leds / boutons

➜ C'est une mauvaise idée. Il faut les conserver et les utiliser dans les boucles
au lieu de

for (int i = 0; i < 8 ; i++)    

il faut mettre

for (int ledIndex = 0; ledIndex < ledNombre ; ledIndex ++)    

(parfois un nom plus parlant que juste i peut être bénéfique)

ou au lieu de

for(int i = 8; i > -1; i--)

il faut metttre soit

for(int ledIndex = ledNombre-1; ledIndex >=0; ledIndex--)

et dans ce cas ledIndex est directement le bon indice pour le tableau, soit

for(int i = ledNombre; i >0; i--)

et dans ce cas il faut utiliser i-1 comme indice du tableau

la première option est plus lisible