Je suis bloqué j'aimerai faire clignoter la led de l'arduino plusieurs fois (10 cycles a peu près) avec la fonction millis. J'y arrive très bien avec un seul cycle (allumé 5s et éteindre 10s) mais quand je rajoute un deuxième cycle cela ne fonctionne pas.
Je vous remercie par avance,
Je joins le code ci dessous :
int LED = 13;
unsigned long interval,interval2;
unsigned int t1=5000, t2=10000, t3=20000, t4=50000;
unsigned long CurrentTime=0;
unsigned long CurrentTime2=0;
unsigned long PreviousTime = 0;
unsigned long PreviousTime2 = 0;
bool led1Etat;
void setup()
{
pinMode(LED,OUTPUT);
Serial.begin(9600);
}
void loop()
{
unsigned long CurrentTime = millis();
if((CurrentTime-PreviousTime) >= interval)
{
PreviousTime=CurrentTime;
if(led1Etat == LOW)
{
led1Etat=HIGH;
interval=t1;
}
else if (led1Etat == HIGH)
{
led1Etat=LOW;
interval=t2;
}
digitalWrite(13,led1Etat);
Serial.println(CurrentTime);
}
CurrentTime2 = millis();
if((CurrentTime2-PreviousTime2) >= interval2)
{
PreviousTime2=CurrentTime2;
if(led1Etat == LOW)
{
led1Etat=HIGH;
interval2=t3;
}
else if (led1Etat == HIGH)
{
led1Etat=LOW;
interval2=t4;
}
digitalWrite(13,led1Etat);
Serial.println(CurrentTime2);
C'est la durée pendant laquelle la led est allumée, en tout cas quand je test avec un seul cycle j'ai bien 5s la led allumée - 10s éteinte ainsi de suite
Donc quand millis = 5000 (allumée) 15000 (éteinte) 20000(allumée) .....
essayez un truc comme cela (tapé ici donc pas sûr que ça compile, mais le principe devrait être clair)
struct Tempo {
unsigned long dureeOn;
unsigned long dureeOff;
};
Tempo animation[] = {
{500, 1000},
{1000, 1000},
{2000, 1000},
{3000, 1000},
{4000, 1000},
};
const size_t nombreAnimations = sizeof animation / sizeof * animation;
size_t animationEnCours = 0;
unsigned long chrono;
const byte brocheLed = 13;
void setup() {
pinMode(brocheLed, OUTPUT);
chrono = millis();
digitalWrite(brocheLed, HIGH); // on démarre l'animation
}
void loop() {
if (digitalRead(brocheLed) == HIGH) {
// on est allumé, on regarde s'il faut éteindre
if (millis() - chrono >= animation[animationEnCours].dureeOn) {
// il faut éteindre
digitalWrite(brocheLed, LOW);
chrono = millis();
}
} else {
// on est eteint, on regarde s'il faut allumer et passer à l'animation suivante
if (millis() - chrono >= animation[animationEnCours].dureeOff) {
// il faut allumer
digitalWrite(brocheLed, HIGH);
chrono = millis();
if (++animationEnCours >= nombreAnimations) animationEnCours = 0; // on boucle si on est arrivé à la fin des animations
}
}
}
on met les durée dans une structure pour que ce soit facilement lisible
on crée un tableau de cette structure pour définir l'ensemble des étapes de l'animation
la boucle regarde l'état de la LED (ce qui permet de savoir si on doit allumer ou éteindre) et si le temps attendu est passé. Si oui, on fait l'action qu'il faut.