class Led {
byte broche;
bool ledOn;
unsigned long duree;
unsigned long t0;
public:
Led(byte p) : broche(p) {}
void begin() {
pinMode(broche, OUTPUT);
off();
duree = random(10, 200);
}
void on() {
digitalWrite(broche, HIGH);
ledOn = true;
}
void off() {
digitalWrite(broche, LOW);
ledOn = false;
}
void inverser() {
if (ledOn) off(); else on();
}
void eclair() {
if (millis() - t0 >= duree) {
inverser();
duree = random(ledOn ? 10 : 300, ledOn ? 100 : 500); // nouvelle durée aléatoire
t0 = millis();
}
}
};
Led eclairs[] = {5, 6, 9};
unsigned long timeStarted = 0; //temps de référence
unsigned int pauseAnimation = 6000; //durée de la pause en millisecondes
unsigned int playAnimation = 2000; //durée de l'animation en millisecondes
bool play = true; //Booleen indiquant si on doit jouer ou pas l'animation
void setup() {
Serial.begin(115200);
for (auto&l : eclairs) l.begin(); // pour chaque élément qu'on appelle l dans le tableau eclairs appeler begin()
}
void loop() {
//on test dans quel cas on est, animation ou pause
if (play) {
for (auto&l : eclairs) l.eclair();
//on test si le temps de jeu de l'animation n'est pas dépassé
if (millis() - timeStarted > playAnimation) {
//dans ce cas on change le booleen, pour indiquer que l'animation est en pause
//cela prendra effet au prochain appel à la fonction "loop"
Serial.print("Stop l'animation ");Serial.println(millis());
play = false;
timeStarted = millis();// comme on change d'état on repdrend une référence de temps
}
} else {
//on test si le temps de pause n'est pas dépassé
if (millis() - timeStarted > pauseAnimation) {
//dans ce cas on change le booleen, pour indiquer que l'animation est active
//cela prendra effet au prochain appel à la fonction "loop"
Serial.print("Start l'animation ");Serial.println(millis());
play = true;
timeStarted = millis();// comme on change d'état on repdrend une référence de temps
}
}
}