Allumage progressif de LEDs dans un tableau - problème

Bonjour à tous.

J'ai un projet de réaliser un rond en LEDs avec plusieurs animations (tout allumé, allumage et arrêt progressif, clignotement du rond, chenillard et arrêt). Ces états seront sélectionnés par pression d'un bouton, une variable servant à garder en mémoire quel bouton a été actionné.

Ainsi le bouton relâché, la variable reste en mémoire et l'animation continue jusqu'à l'activation d'un autre bouton ou l'arrêt de l'Arduino.

J'ai réussi à coder 4 états mais je peine à programmer l'allumage simultané et progressif de toutes les LEDs puis leurs arrêts progressifs. J'ai déjà fouillé sur le forum et google, et je vous avoue que les tutos du style "allumage progressif de LEDs pour un escalier" ne m'aident pas.

Voici le code et une image de mon projet réalisé sur un site

int state = 0; // pour commencer avec tout éteins
int start = 49; //bouton pour allumer leds
int progr = 50; //Allumage progressif de toutes les leds
int clign = 51; //clignotement de toutes leds
int rond = 52; //fait tourner les leds en rond via clignotement
int Stop = 53; //arret des leds
int sta, pro, cli, ron, sto = 0;
int leds[] = {2,3,4,5,6,7,8,9,10,11}; //Sur des broches PWM
int brightness = 0;

void setup() {
  
  for(int i=0; i<10; i++) {
    pinMode(leds[i], OUTPUT);
    }
    
    pinMode(start,INPUT); //start
    pinMode(progr,INPUT); //progressif
    pinMode(clign,INPUT); //clignotement
    pinMode(rond,INPUT); //clignoter en rond
    pinMode(Stop,INPUT); //stop
  }

void loop() {
  
  state = state;
  sta = digitalRead(start);
  pro = digitalRead(progr);
  cli = digitalRead(clign);
  ron = digitalRead(rond);
  sto = digitalRead(Stop);

  if(sta==HIGH){
   state = 1;
  }
  else if(pro==HIGH){
    state = 2;
  }
  else if(cli==HIGH){
    state = 3;
  }
  else if(ron==HIGH){
    state = 4;
  }
  else if(sto==HIGH){
    state = 0;
  }

  switch(state){
    case 0: //tout éteind
      for(int i=0; i<10; i++) {
      digitalWrite(leds[i], LOW);
      }
    break;
    
    case 1: //tout allumé
      for(int i=0; i<10; i++) {
      digitalWrite(leds[i], HIGH);
      }
    break;
  
    case 2: //allumage progressif de toutes les leds
      for(int i=0; i < 10; i++) {
       for(brightness <= 0; brightness >= 255; brightness+5) {
           analogWrite(leds[i], brightness);
           delay(30);
         }
             
           if (brightness <= 0 || brightness >= 255){
             for(int i=0; i<10; i++) {
              analogWrite(leds[i], brightness);
              brightness = brightness -5;
              delay(30);
             } 
           }
        }
    break;
    
    case 3: //clignotement de toutes les leds
      for(int i=0; i<10; i++) {
         digitalWrite(leds[i], HIGH);
      }
      delay(60);
      for(int i=0; i<10; i++) {
         digitalWrite(leds[i], LOW);
      }
       delay(60);
    break;
      
    case 4: //allumage des leds en tournant
       if (leds[0]  || leds[2] || leds[4] || leds[6] || leds[8] == HIGH){
       //on éteins toutes les leds avant de lancer l'animation
        for(int i=0; i<10; i++) {
          digitalWrite(leds[i], LOW);
           }
         }
      for(int i=0; i<10; i++) {
        digitalWrite(leds[i], HIGH);
        delay(30);
        digitalWrite(leds[i], LOW);
        if (state==1 || state ==2 || state==3 || state==0)break; //pour sortir de la boucle for
      }
     break;
     
  }// fin Switch
} //fin void loop

Attention dans l'image qui suit, j'ai volontairement oublié les résistances aux LEDs pour la clarté, mais dans mon projet elles sont là.

J'ai testé l'imbrication de 2 boucles for comme dans l'exemple ci-dessus, une boucle while (brightness >= 255) combinée avec une boucle for pour appliquer la variable brightness au LEDs (qui augmentait ou diminuait comme dans l'exemple ci-dessus) mais cela ne fonctionne pas, et 2-3 autres trucs dont je ne m'en souviens plus vu que c'était un échec.

Quelle(s) solution(s) est(sont) à envisager? Merci d'avance pour votre aide.

ça veut rien dire ça

led[0] c'est un numéro de pin... il faut faire des digitalRead()

sinon une machine à état pour les animation serait pas mal ça éviterait d'être coincé dans un des cas et ne pas pouvoir appuyer sur un bouton pendant l'animation

si vous mettiez le lien vers votre wokwi on pourrait tester aussi :slight_smile:

Bonjour Grekss_Eko

Si tu veux un allumage simultané de tes LED, l'imbrication des boucles i et brightness doit 'être différent, i doit "tourner" à l'intérieur de brightness.

brightness+5ne fait rien, c'est brightness += 5 ou brightness -= 5

Voici l'exemple:

int state = 0; // pour commencer avec tout éteins
int start = 49; //bouton pour allumer leds
int progr = 50; //Allumage progressif de toutes les leds
int clign = 51; //clignotement de toutes leds
int rond = 52; //fait tourner les leds en rond via clignotement
int Stop = 53; //arret des leds
int sta, pro, cli, ron, sto = 0;
int leds[] = {2,3,4,5,6,7,8,9,10,11}; //Sur des broches PWM
int brightness = 0;

void setup() {
	
	Serial.begin(115200);

	for(int i=0; i<10; i++) {
		pinMode(leds[i], OUTPUT);
	}
	
	pinMode(start,INPUT); //start
	pinMode(progr,INPUT); //progressif
	pinMode(clign,INPUT); //clignotement
	pinMode(rond,INPUT); //clignoter en rond
	pinMode(Stop,INPUT); //stop
}

void loop() {
		//case 2: //allumage progressif de toutes les leds
		for(brightness = 0; brightness <= 255; brightness += 5) {
			for(int i=0; i < 10; i++){
				Serial.println("LED " + String(i) + "\t" + String(brightness));
				analogWrite(leds[i], brightness);
				delay(30);
			}
		}

		for(brightness = 255; brightness >= 0; brightness -= 5) {
			for(int i=0; i < 10; i++){
				Serial.println("LED " + String(i) + "\t" + String(brightness));
				analogWrite(leds[i], brightness);
				delay(30);
			}
		}
		//break;
} //fin void loop

Dans le moniteur de l'IDE à 115200, il y a des indications quand à la LED et à son intensité:

LED 0	0
LED 1	0
LED 2	0
LED 3	0
LED 4	0
LED 5	0
LED 6	0
LED 7	0
LED 8	0
LED 9	0
LED 0	5
LED 1	5
LED 2	5
LED 3	5
LED 4	5
LED 5	5
LED 6	5
LED 7	5
LED 8	5
LED 9	5
LED 0	10
LED 1	10
LED 2	10
LED 3	10

A+
Cordialement
jpbbricole

Merci pour votre réponse à tout les 2.

Voici le lien vers wokwi : ledsring - not finished - Wokwi ESP32, STM32, Arduino Simulator

Ce qui m'étonne sur le wokwi, c'est que les leds ne clignotent pas quand j'appuie sur le bouton 4, mais par contre dans mon projet, ça clignote bien (je peux faire une vidéo pour le montrer)

C'était si simple et je n'étais pas loin du but... quel idiot je suis (surtout pour le += et le -=) !

Merci, je vais pouvoir peaufiner ça et rajouter une condition à la boucle 2 pour en sortir si l'état change. je clôturerais cette question si tout est OK avec la solution finale et, si vous le voulez, les photos de ce à quoi ça va servir.

Bonne soirée et merci :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.