Bonjour dabigben
Je me suis amusé à l'exercice et ça donne ceci:
Uns structure contenant les temps et les pin des LED
struct ledTempoDef
{
unsigned long tempoOn; // Temps allumée
unsigned long tempoOff; // Temps éteinte
const int pin; // Pin de la LED
};
remplie ainsi
ledTempoDef ledTempo[] =
{
// tempoOn TempoOff Pin
{ 350, 350, 8 }, // LED 0
{ 350, 350, 9 }, // LED 1
{ 350, 350, 10 }, // LED 2
{ 350, 350, 11 }, // LED 3
};
Pour ajouter ou supprimer des LED, il suffit d'ajouter une ligne dans ledTempo[]
La ligne
const int ledEtatOn = HIGH; // Quel état pour allumer la led
sert à définir quel état allume tes LED.
Tu peux, en tout temps, changer la pause d'une LED par un
ledTempo[4].tempoOff = 600;
pour mettre la pause de la LED 4 à 600 millisesecondes.
Le programme:
/*
Name: AF_dabigben_LedTempoDifférents.ino
Created: 03.05.2024 08:39:27
Author: jpbbricole
Remarque: Faire clignoter des LED à des tempo différents
https://forum.arduino.cc/t/clignotement-millis-intervalles-differents/1254945/6
*/
//------------------------------------- LED
//const int ledPin[] = {8, 9, 10, 11}; // Tableau des pin.
//const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]); // Nombre de led
const int ledEtatOn = HIGH; // Quel état pour allumer la led
int ledActive = 0; // LED en cours de traitement
struct ledTempoDef
{
unsigned long tempoOn; // Temps allumée
unsigned long tempoOff; // Temps éteinte
const int pin; // Pin de la LED
};
ledTempoDef ledTempo[] =
{
// tempoOn TempoOff Pin
{ 350, 350, 8 }, // LED 0
{ 350, 350, 9 }, // LED 1
{ 350, 350, 10 }, // LED 2
{ 350, 350, 11 }, // LED 3
};
const int ledNombre = sizeof(ledTempo) / sizeof(ledTempo[0]); // Nombre de led
unsigned long ledClignTempo = 0; // Temporisation de la led actuellement en action
unsigned long ledClignMillis = 0; // Temporisation de la led actuellement en action, chrono
void setup()
{
Serial.begin(115200);
//--------------------------------- Initialisation des LED
for (int l = 0; l < ledNombre; l ++)
{
pinMode(ledTempo[l].pin, OUTPUT);
digitalWrite(ledTempo[l].pin, !ledEtatOn); // Eteindre la LED
}
//--------------------------------- Amorçage du système
ledActive = 0;
ledCycleDebut(ledActive);
}
void loop()
{
if (millis() - ledClignMillis >= ledClignTempo) // Si periode du cycle terminée
{
if (digitalRead(ledTempo[ledActive].pin) == ledEtatOn) // Si LED allumée
{
digitalWrite(ledTempo[ledActive].pin, !ledEtatOn); // Eteindre la LED
ledClignTempo = ledTempo[ledActive].tempoOff; // Passage des temps de pause
ledClignMillis = millis(); // Démarrage du chrono
}
else // Si la led éteinte
{
digitalWrite(ledTempo[ledActive].pin, !ledEtatOn); // Extinction de la LED
Serial.println("Led " + String(ledActive) + " OFF");
ledActive ++; // LED suivante
if (ledActive >= ledNombre)
{
ledActive = 0;
}
ledCycleDebut(ledActive); // Redémarrage du cycle suivant
}
}
}
void ledCycleDebut(int ledNum) // Démarrage d'une séquence de LED
{
digitalWrite(ledTempo[ledNum].pin, ledEtatOn); // Allumage de la LED
ledClignTempo = ledTempo[ledNum].tempoOn;
ledClignMillis = millis(); // Démarrage du chrono
Serial.println("Led " + String(ledNum) + " ON");
}
A+
Cordialement
jpbbricole