Projet halloween

Bonjour à tous,
Je suis un grand débutant dans la programmation Arduino.
Pour Halloween je suis en train de mettre au point des petits bandeaux leds de 10cm chacun installés dans des tubes avec des découpes en formes d'yeux de bêtes féroces afin de les placer dans la partie basse de mes haies.
Pour cela je souhaite utiliser le PWM afin de faire varier l'intensité d'éclairage de chaque bandeau pour simuler les battements de paupières et clignements des yeux.
J'ai réussi a créer ce que je voulais pour obtenir l'effet désiré sur un bandeau. Je souhaiterais maintenant pouvoir lancer la même fonction sur d'autres pins de mon arduino avec un décalage pour que l'effet ne soit pas synchronisé sur tous les yeux. Je dispose de 6 bandeaux leds que je voudrais brancher sur 6 GPIO différents pour qu'ils ne clignotent pas en même temps.
J'imagine qu'il faut appeler ma fonction avec un délai entre chaque appel de fonction, mais je ne sais pas comment placer les paramètres et variables pour envoyer vers les autres GPIO où sont branchés mes bandeaux leds.
Pouvez-vous m'aiguiller ?
J'espère que mes explications sont à peu près claires....
Merci à vous !

Voici l'ébauche de mon programme actuel :

int ledPin1 = 5;    
int fadeValue2 = 30;

void setup() {}

void yeux()
 {
  analogWrite(ledPin1, 0);
  delay(10000);
  for (int fadeValue = 0 ; fadeValue <= 50; fadeValue ++) {
    analogWrite(ledPin1, fadeValue);
    delay(50);
  }
delay(7000);
   for (int fadeValue = 50 ; fadeValue >= 0; fadeValue --) {
    analogWrite(ledPin1, fadeValue);
    delay(50);
  }
  for (int fadeValue = 0 ; fadeValue <= 50; fadeValue ++) {
    analogWrite(ledPin1, fadeValue);
    delay(10);
  }
delay(7000);
   for (int fadeValue = 50 ; fadeValue >= 0; fadeValue --) {
    analogWrite(ledPin1, fadeValue);
    delay(10);
  }
  delay(200);
    for (int fadeValue = 0 ; fadeValue <= 50; fadeValue ++) {
    analogWrite(ledPin1, fadeValue);
    delay(10);
  }
delay(7000);
   for (int fadeValue = 50 ; fadeValue >= 0; fadeValue --) {
    analogWrite(ledPin1, fadeValue);
    delay(180);
  } 
    for (int fadeValue = 0 ; fadeValue <= 50; fadeValue ++) {
    analogWrite(ledPin1, fadeValue);
    delay(50);
  }
delay(7000);
   for (int fadeValue = 50 ; fadeValue >= 0; fadeValue --) {
    analogWrite(ledPin1, fadeValue);
    delay(10);
  }
}

void loop() {
yeux();
}

Bonjour jumi63

Si j'ai bien compris, tu aimerai avoir plusieurs fonctions du genre yeux(), mais qui tournent de façons indépendante?

A+
Cordialement
jpbbricole

Bonsoir,
Oui c'est exactement ça, et que chaque fonction gère le PWM sur un GPIO différent et de façon non synchronisée pour avoir un effet aléatoire d'un bandeau led à l'autre.
Merci à toi pour ton aide !

Bon, on ne va y arriver ce soir :wink:, mais la première chose à faire, est de se "débarasser" de ces longs delay() de plusieurs secondes, ça. bloque le programme, ce qui a pour conséquence qu'aucun autre bandeau ne peut fonctionner.
Pour que tu puisses appréhender cette "technique", fais l'exemple Blink Without Delay
https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay/

Bonjour à toi !
J'ai essayé de modifier tout ça en supprimant les delay() comme tu m'as conseillé.
J'ai ensuite essayé de jouer avec plusieurs intervalles différents, cela fonctionne également.
Par contre je rencontre un problème lorsque je tente d'intégrer les allumages et extinctions progressifs en PWM en ajoutant les boucles...

const int ledPin = 5; 
const long INTERVAL_LOW = 200;
const long INTERVAL_HIGH = 7000;
int ledState = LOW; 
unsigned long previousMillis = 0;  
int interval; 

void setup() {
   pinMode(ledPin, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {

    previousMillis = currentMillis;

    if (ledState == LOW) {
      ledState = HIGH;
      interval = INTERVAL_HIGH;
    } else {
      ledState = LOW;
      interval = INTERVAL_LOW;
    }

    digitalWrite(ledPin, ledState);
  }
}

J'ai remplacé la ligne

ledState = HIGH;

par

for (int fadeValue = 0 ; fadeValue <= 50; fadeValue ++) {
       analogWrite(ledPin, fadeValue);
    delay(50);
  }

et la ligne

ledState = LOW;

par

for (int fadeValue = 50 ; fadeValue >= 0; fadeValue --) {
    analogWrite(ledPin, fadeValue);
    delay(50);
  }

mais le résultat attendu n'est pas là...

Bonjour jumi63

Je pensai bien :wink:, tu veux avoir plusieurs temporisations imbriquées et ce pour plusieurs bandeaux de LED et plusieurs PWM, pas facile et je n'ai pas encore eu le temps de me pencher sur ton problème.

Il y a quelques temps, j'avais fait ça, des clignotements différents sur plusieurs LED :

Je pense m'en inspirer.
Tu peux voir ce que pense l'IA de ton projet, je n'ai pas eu le temps d'essayer :wink:

PS: Je l'ai essayé, tu devrait pouvoir l'utiliser sans retouches.

A+
Cordialement
jpbbricole

J'ai fait un tutoriel sur le sujet du parallélisme sur Arduino :

Ce n'est pas encore ton projet mais ça peut t'aider à comprendre les bases.
Ton problème est un peu plus complexe que celui que j'y présente : moi je ne fais qu'afficher des messages à des temps donnés. Mais toi tu veux faire des choses complexes, comme allumer et éteindre des bandeaux de LEDs.

Il faut donc réfléchir pour l'adapter. Par exemple, si tu ne cherches qu'à allumer et éteindre, il faut conserver l'état (allumé ou éteint) en mémoire pour savoir quoi faire le moment venu :

  • Si allumé : éteindre
  • Si éteint : allumer

De plus, pour éviter des clignotements, il faudra rendre les durées aléatoires.

Bonjour jumi63

Si tu veux "pousser plus loin" il y a un super logiciel VixenLightsSoftware

Cordialement
jpbbricole