Modification "Delay" par "Millis"

Bonjour à tous,
Pouvez-vous m’apportez votre aide ou conseils pour modifier un programme sur lequel je travaille et qui concerne un projet de sculpture en leds. Après avoir fusionné deux sketchs, un chenillard de quatre(series) de leds ainsi qu’un effet fondu de deux(series) de leds et tous deux avec la fonction “delay”, le résultat final ne correspond plus aux effets initiaux. Au vu des différentes recherches que j’ai fait il semblerait que le plus judicieux serait de passer par la fonction millis. Malgré les différents tutos j’ai du mal à concevoir ce changement. Mon projet se trouve en pièce jointe, voici aussi les deux codes utilisés ainsi que la fusion des deux.Votre aide serait la bienvenue. Merci d’avance.

/*
 * Programme pour arduino uno
 * Projet APTE Loco-Revue
 * par C. Bézanger Octobre 2013
 * Licence GNU GPLv3
 *
 * Ce programme réalise un chenillard.
 * Il fait flasher successivement six DEL oranges relées aux sorties 4 à 7
 * Puis il réalise une pause de 500 millisecondes avant de recommencer
 */
 
// Initialisation des lignes 4 à 7 en sortie
void setup () {
  pinMode (4, OUTPUT) ;
  pinMode (5, OUTPUT) ;
  pinMode (6, OUTPUT) ;
  pinMode (7, OUTPUT) ;
}
 
// Fonction loop
void loop () {
  // Extinction de toutes les DEL au départ du programme
  for (byte i = 4 ; i <= 7 ; i++) {
    digitalWrite (i, LOW) ; // éteint la DEL reliée à la broche i
  }
 
  // Boucle pour faire flasher les DEL
  for (byte i = 4 ; i <= 7 ; i++) {
    digitalWrite (i, HIGH) ; // allume la DEL sur broche i
    delay (500) ; // durée du flash 500 millisecondes
    digitalWrite (i, LOW) ; // éteint la DEL
  }
 
  // délai de 500 millisecondes
  delay (500) ;
 
  // Recommence la séquence
}
//fonction fondu pour le projet Cantabile
//représentant le nom

int pin1 = 9; //PWM pin
int pin2 = 10; //PWM pin

void setup() {
 pinMode(pin1, OUTPUT);
 pinMode(pin2, OUTPUT);
}

byte number = 0;
bool goingUp = true; //This sets the direction

void loop() {
  
  if(goingUp) //this will be true the first time we run and true until we set it false
  {
      analogWrite(pin1, number);
      analogWrite(pin2, 230 - number); //write the opposite
      number++; //increase number
      if(number == 230)
      {
          goingUp = false; //switch direction, we reached the top 
      }  
  }
  else //we are going down here
  {
       analogWrite(pin1, number);
       analogWrite(pin2, 230 - number);
       
       number = number - 5; //decrease number by a factor of 5
       //normally -1 means 1 second for 255 loops()
       //but we want 0.2 seconds, so that's a 1/5th of a second
       //so go 5 times faster than on the fadeUp
       
       if(number <= 5)
       {  
           goingUp = true; //switch direction again, going up
           number = 5; //just in case it went in the negative, reset to 0
       }
  }
  
  delayMicroseconds(3921); //IMPORTANT. for 3.9 milliseconds, we do nothing
  //This means roughly, every 255 cycles that equals 1 second
}

Et la fusion des deux

//Projet animation d'une Partition Musicale, la portée et la clef de sol seront en leds fixes.
//Seul l'Arduino Nano gérera une fonction chenillard pour un ensemble de quatres leds (Notes) et une fonction fondu deux leds (Nom)
//Initialisation des lignes 4 à 7 en sorties pour Notes
// Initialisation des lignes 9 à 10 en sorties PWM pour Nom

 void setup () 
{
  pinMode (4, OUTPUT) ;
  pinMode (5, OUTPUT) ;
  pinMode (6, OUTPUT) ;
  pinMode (7, OUTPUT) ;
  pinMode (9, OUTPUT) ;
  pinMode (10, OUTPUT);
}
  byte number = 0;
bool goingUp = true; //Cela définit la direction
// Fonction loop
void loop () {
  // Extinction de toutes les DEL au départ du programme
  for (byte i = 4 ; i <= 7 ; i++) {
    digitalWrite (i, LOW) ; // éteint la DEL reliée à la broche i
  }
  
   // Boucle pour faire flasher les DEL
  for (byte i = 4 ; i <= 7 ; i++) {
    digitalWrite (i, HIGH) ; // allume la DEL sur broche i
    delay (1000) ; // durée du flash 500 millisecondes
    digitalWrite (i, LOW) ; // éteint la DEL
  }
  {
  
  if(goingUp) //ce sera vrai la première fois que nous courrons et vrai jusqu'à ce que nous le définissions faux
  {
      analogWrite(9, number);
      analogWrite(10, 230 - number); //écris le contraire
      number++; //augmenter le nombre
      if(number == 230)
   {
          goingUp = false; //changer de direction, nous avons atteint le sommet 
      }  
    
  // délai de 500 millisecondes
  delay(500) ;
 
  // Recommence la séquence
}
}
}

Comment est votre anglais pour la lecture? Je vous suggère de vous débattre à travers le link fourni pour obtenir des informations sur l'utilisation de millis au lieu du delay.

Suivez link ici.

Take it to the French forum guys.

Ah come on Chris. A bit of continental courtesy?? (I'm Canadian by the way, so we do both.)

Bienvenue sur la partie française du forum…

Il faudrait que tu définisses bien ton besoin. Tu parles de séries de leds. Est ce que ce sont des rubans de leds addressables WS2812 ou similaires ? Ton code n’utilise pour l’instant que des leds uniques.

Ensuite quel est le scénario d’allumage / extinction ? Est ce juste une durée unique pour chaque chenillard, une durée différente pour chaque…?

Dans le principe, pour gérer ce genre de problème, tu vas créer des sortes de chronomètres qui vont t’indiquer quand allumer ou éteindre tes leds.

Chaque chrono utilise la fonction millis() qui compte le nombre de millisecondes écoulées depuis le début du programme. Pour chaque chrono, tu utilises une variable, à laquelle tu donnes un nom évocateur

unsigned long chronochenillard1 = 0;ainsi qu’une période

unsigned long periodechenillard1 = 500;

Puis tu l’initialises dans le setup

chronochenillard1 = millis() ;

Et tu vérifies dans la loop que le chrono atteint la valeur de la période associée

if (millis() - chronochenillard1 > periodechenillard1) {
  chronochenillard1 = millis() ; // on remet le chrono à zero
  *** les instructions à exécuter ***
}

Si tu as 6 chronomètres, tu vérifies chacun l’un après l’autre.