Appliquation d'une animation de LED sur d'autres PINS

Bonjour, actuellement je travaille sur un projet avec une carte arduino uno et 8 bandeaux de 9 Leds, je les ait tous isolé pour pouvoir créer les animation que je voulais.
Actuellement j'essaye de créer un mouvement vers l'avant avec un effet progressif sur chaque bandeau, je veux que chaque bandeau fasse le même effet.
L'effet que j'ai réussi à obtenir est celui que je voulais obtenir, les leds s'allument une par une et s'éteignent lorsqu'elle passe a la suivante, il y a aussi un effet de couleur progressif, l'on passe du blanc au vert.
Je veux donc toujours avoir le même effet mais je veux avoir le même sur mes autres bandeaux au même moment.
Il faudrait donc que je rajoute les 7 autres pins mais je n'y arrive pas une vrai galère :sweat_smile:
Je fournis donc le script ci-joint

#include <Adafruit_NeoPixel.h>

// Configuration du bandeau LED
#define NUM_LEDS 9
#define PIN        4  // Modifiez le numéro de broche selon votre configuration

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setLedColor(int ledNumber, uint32_t color) {
  // Définir la couleur d'une LED en utilisant un code RGB
  strip.setPixelColor(ledNumber, color);
}

void showStrip() {
  // Mettre à jour toutes les LED en une seule fois
  strip.show();
}

void slideEffect(uint32_t colors[], int delayTime) {
  // Faire glisser les couleurs sur le bandeau LED
  for (int i = 0; i < NUM_LEDS; i++) {
    setLedColor(i, colors[i]);
    showStrip();
    delay(delayTime);
    setLedColor(i, strip.Color(0, 0, 0));  // Éteindre la LED après le déplacement
  }
  showStrip();  // Mettre à jour une dernière fois pour éteindre toutes les LED
}

// Exemple d'utilisation
void setup() {
  strip.begin();
  strip.show(); // Initialiser toutes les LED avec la couleur par défaut (noir)
}

void loop() {
  // Définir les couleurs des LED en utilisant des codes RGB
  uint32_t colors[NUM_LEDS] = {
    strip.Color(255, 255, 255),   // Blanc
    strip.Color(240, 240, 240),   // Très clair
    strip.Color(150, 255, 150),   // Vert clair
    strip.Color(100, 255, 100),   // Vert moyen clair
    strip.Color(0, 200, 0),       // Vert moyen
    strip.Color(0, 180, 0),       // Vert moyen foncé
    strip.Color(0, 150, 0),       // Vert foncé clair
    strip.Color(0, 120, 0),       // Vert foncé
    strip.Color(0, 100, 0)        // Vert très foncé
  };

  slideEffect(colors, 50); // Faire glisser les couleurs avec un délai de 50 millisecondes
  delay(500); // Attendre un court instant avant de changer de couleur
}

J'espère que quelqu'un pourra m'aider, merci :smile:

: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

Ben non... Dans ce cas n'utilisez une seul pin de contrôle qui "parle" à tous les bandeaux. ils recevront ainsi tous la même commande au même moment.

Bonjour nox_i,

Donc tu veux que tes 8 bandeaux affichent le même show, en même temps?

A+
jpbbricole

Bonjour, merci de me répondre mais je ne peux pas tous les mettre sur le même pin car j'ai besoin de créer d'autre effet ou je suis obligé de séparer les pins comme par exemple faire un clin d'œil

Bonjour, c'est exactement ça

Est ce qu'il faut envisager que ces bandeaux n'auront pas toujours le même show, en même temps?
Est ce que ces bandeaux auront toujours le même nombre de LED?

Oui, il faudrait que l'action s'effectue en même temps sur tous les bandeaux, j'avais réussi à faire cela mais avec des leds de la même couleur
Et oui chaque bandeau et composé de 9 leds chacun

C'est à dire, car malheureusement ce qui est galère c'est essayer d'aider quelqu'un qui ne donne pas vraiment d'information pour l'aider :frowning:

Si tu veux faire la même chose sur chaque broche, il suffit appeler par exemple dans setLedColor, la fonction setPixelColor sur les 7 objets que tu aura défini pour chacun de tes bandeaux.
Je ne vois pas ou tu pourrais bloquer?

Après comme l'indique @J-M-L pourquoi vouloir séparer les 7 bandeaux et ne pas les gérer comme un seul ?
Personnellement, je trouve plus logique de gérer les 7 bandeaux séparément, mais cela reste une vision très personnel.
Il serait intéressant de savoir si cela correspond à une conception mental ou un blocage par "ignorance" (gros mot mais qui n'a rien de péjoratif, j'ai pas trouvé mieux :slight_smile: )

Il y a 2 solutions, la première, la plus simple physiquement est un bandeau de 72 LED, bandeaux qui seront "virtualisés" dans un tableau (1 pin de l'Arduino) ou la solution avec 8 bandeaux indépendants qui nécessite 8 pin de l'Arduino.
La quelle te conviendrai le lieux?

Ce que je n'arrive pas à faire c'est de rajouter les pins 3, 4, 5, 6, 7, 8 et 9 pour que le script s'applique à ces pins aussi
Je commence seulement arduino donc je ne mis connait pas trop

Je veux appliquer les leds sur une boule comme ci-joint, et si je veux séparer les différents bandeaux ça serait pour mes autres animation, qui serait de tourner vers la droite et la gauche ou j'aurais un mouvement cylindrique autour de la boule mon montrer que je ne tourne à gauche ou à droite
Je joint deux photos qui montre un mouvement vers l'avant et un autre vers la droite (vu de l'arrière)


Je préfèrerais la solution avec les bandeaux indépendants

OK, je te fais un exemple ainsi.

Ok merci

voici un exemple avec 8 bandeaux connectés sur les pins de 2 à 9 qui font défiler un effet "arc en ciel"

le contenu est différent pour tous les bandeaux mais rien ne vous empêche de remplir le bandeau avec les même valeurs

les détails
#include <Adafruit_NeoPixel.h>
const size_t nbLeds = 9;

Adafruit_NeoPixel strips[] = {
  {nbLeds, 2, NEO_GRB + NEO_KHZ800},
  {nbLeds, 3, NEO_GRB + NEO_KHZ800},
  {nbLeds, 4, NEO_GRB + NEO_KHZ800},
  {nbLeds, 5, NEO_GRB + NEO_KHZ800},
  {nbLeds, 6, NEO_GRB + NEO_KHZ800},
  {nbLeds, 7, NEO_GRB + NEO_KHZ800},
  {nbLeds, 8, NEO_GRB + NEO_KHZ800},
  {nbLeds, 9, NEO_GRB + NEO_KHZ800},
};
const size_t nbStrips = sizeof strips / sizeof * strips;

uint16_t hueDebut[nbStrips];
uint16_t deltaHue = 500;

void setup() {
  Serial.begin(115200);
  for (auto& s : strips) s.begin();
  for (size_t i = 0; i < nbStrips; i++) hueDebut[i] = random(0xFFFF);
}

void loop() {
  // calcul du nouveau contenu
  for (size_t i = 0; i < nbStrips; i++) {
    strips[i].rainbow(hueDebut[i]);
    hueDebut[i] += deltaHue;
  }

  // affichage de toutes les strips
  for (auto& s : strips) s.show();
}
1 Like

Bonjour nox_i

Joli la boule, il y a de l'imprimante 3D là dessous :wink:

Voilà, j'ai adapté ton programme à une "multi connexions", le numéro des pin se trouvent dans le tableau:

const int bandPin[] = {4, 5, 6, 7, 8, 9, 10, 11};     // Connexion des bandeaux

Le programme:

/*
    Name:       ARDFR_nox_i_nimation_de_LED_sur_d_autres_PINS.ino
    Created:	02.01.2024 11:22:31
    Author:     nox_i/jpbbricole #16
	https://forum.arduino.cc/t/appliquation-dune-animation-de-led-sur-dautres-pins/1206111
*/
#include <Adafruit_NeoPixel.h>

//------------------------------------- Bandeaux (band)
const int bandNombre = 8;     // Nombre de LED par bandeau
const int bandNombreLed = 9;     // Nombre de LED par bandeau
const int bandPin[] = {4, 5, 6, 7, 8, 9, 10, 11};     // Connexion des bandeaux

Adafruit_NeoPixel strip[] =     // Création des 9 instances
{
	Adafruit_NeoPixel (bandNombreLed, bandPin[0], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[1], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[2], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[3], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[4], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[5], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[6], NEO_GRB + NEO_KHZ800),
	Adafruit_NeoPixel (bandNombreLed, bandPin[7], NEO_GRB + NEO_KHZ800),
};


void setLedColor(int ledNumber, uint32_t color, int bandIndex) {
	// Définir la couleur d'une LED en utilisant un code RGB
	strip[bandIndex].setPixelColor(ledNumber, color);
}

void showStrip(int bandIndex) {
	// Mettre à jour toutes les LED en une seule fois
	strip[bandIndex].show();
}

void slideEffect(uint32_t colors[], int delayTime, int bandIndex) {
	// Faire glisser les couleurs sur le bandeau LED
	for (int i = 0; i < bandNombreLed; i++) {
		setLedColor(i, colors[i], bandIndex);
		showStrip(bandIndex);
		delay(delayTime);
		setLedColor(i, strip[bandIndex].Color(0, 0, 0), bandIndex);  // Éteindre la LED après le déplacement
	}
	showStrip(bandIndex);  // Mettre à jour une dernière fois pour éteindre toutes les LED
}

// Exemple d'utilisation
void setup() {
	for (int b = 0; b < bandNombre; b ++)
	{
		strip[b].begin();
		strip[b].show(); // Initialiser toutes les LED avec la couleur par défaut (noir)
	}
}

void loop() {
	// Définir les couleurs des LED en utilisant des codes RGB
	uint32_t colors[bandNombreLed] = {
		strip[0].Color(255, 255, 255),   // Blanc
		strip[0].Color(240, 240, 240),   // Très clair
		strip[0].Color(150, 255, 150),   // Vert clair
		strip[0].Color(100, 255, 100),   // Vert moyen clair
		strip[0].Color(0, 200, 0),       // Vert moyen
		strip[0].Color(0, 180, 0),       // Vert moyen foncé
		strip[0].Color(0, 150, 0),       // Vert foncé clair
		strip[0].Color(0, 120, 0),       // Vert foncé
		strip[0].Color(0, 100, 0)        // Vert très foncé
	};

	int showTempo = 50;
	for (int bande = 0; bande < bandNombre; bande ++)
	{
		slideEffect(colors, showTempo, bande); // Faire glisser les couleurs avec un délai de showTempo millisecondes
		delay(500); // Attendre un court instant avant de changer de couleur
		showTempo += 20;     // Incrémenter 
	}
}

N'hésites pas à poser des questions!

A+
Cordialement
jpbbricole

1 Like

Tout est dans la déclaration de ta variable strip

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

Il suffit de créer d'autre variable du même type "Adafruit_NeoPixel"

Cela devrait donc donner un truc comme ça "pas testé":

#define PINSTRIP1        3
#define PINSTRIP2        4
#define PINSTRIP3        5
#define PINSTRIP4        6
#define PINSTRIP5        7
#define PINSTRIP6        8
#define PINSTRIP7        9

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip4 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP4, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip5 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP5, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip6 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip7 = Adafruit_NeoPixel(NUM_LEDS, PINSTRIP7, NEO_GRB + NEO_KHZ800);

Encore une fois, c'est un choix de séparé les bandeaux, mais absolument pas une obligation.
L'un ou l'autre mène exactement au même rendu.

Ha une autre chose, je crois avoir vu dans ton code des "delay", malheureusement en générale l'utilisation de "delay" risque de te bloquer dans les annimations.
Car pendant que tu fais un "delay" pour l'animation d'un bandeau, tu ne pourra pas continuer l'animation sur un autre.
Il est plus intéressant d'utiliser la fonction "millis", qui te donne un nombre de millisecondes écoulé depuis le lancement de ton programme.
Donc en mémorisant le temps à différent moment clé de ton programme, tu peux déclencher une action lorsque la différence de temps de deux variables à dépasser une valeur voulu.

l'exemple simple est de mémoriser le temps dans une variable temp1 dans ton setup.
puis dans la loop mémoriser le temp2, et lorsque la différence entre temp2 et temp1 est supérieur à une valeur par exemple 1 seconde faire quelque chose, comme imprimer un message sur le moniteur série.
Et si tu veux recompter encore une seconde, il suffit en même temps que tu fais ton action, de sauvegarder une nouvelle valeur de temps dans temp1

1 Like

Merci beaucoup pour ton conseil, je ne savais pas que la fonction delay pouvais affecter l'animation

Merci beaucoup, ton programme fonctionne parfaitement j'ai juste modifié pour que toutes les barres de leds s'allument au même moment
J'avais juste une autre question, à quoi correspond cette partie, c'est quand le programme a été importé ?

Name:       ARDFR_nox_i_nimation_de_LED_sur_d_autres_PINS.ino
    Created:	02.01.2024 11:22:31
    Author:     nox_i/jpbbricole #16
	https://forum.arduino.cc/t/appliquation-dune-animation-de-led-sur-dautres-pins/1206111

Merci, cela me permettrais de créer d'autre animations