Oui, c'est possible en utilisant la fonction millis() et des variables pour gérer l'état des leds et le dernier temps de changement d'état de chaque led:
après avoir mi le code si dessous les 2 LED ne suivent pas du tout le temps d'allumage et le temps eteint pouvez vous me dire pourquoi ?
Merci
j'en profite pour le UP
long temps; // variable qui stocke la mesure du temps
boolean etat_led1 =0;
boolean etat_led2 =0;
void setup()
{
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
// par défaut la LED sera éteinte
// on initialise le temps
temps = millis();
}
void loop(){
if ((millis()%1000==0))
{
etat_led1 = !etat_led1; // on inverse l'état de la LED
digitalWrite(1, etat_led1); // on allume ou éteint
if ((millis()%2000==0))
etat_led2 = !etat_led2; // on inverse l'état de la LED
digitalWrite(2, etat_led2); // on allume ou éteint
if ((millis()%2000==0))
etat_led1 = !etat_led1; // on inverse l'état de la LED
digitalWrite(1, etat_led1); // on allume ou éteint
if ((millis()%3000==0))
etat_led2 = !etat_led2; // on inverse l'état de la LED
digitalWrite(2, etat_led2); // on allume ou éteint
}
Il ne faut pas faire une opération égale à 0 dans ton if. Il y a peut de chance que tu tombes directement sur le modulo 0.
Les conditions sont aussi mal montées.
De plus, comme le temps pour le changement d'état de tes LEDs n'est pas le même entre le On et le Off, je pense qu'il faut que tu testes d'abord l'état de la Led (surtout pour la Led 2)
Merci mais comme je peux faire en sorte de verifier l'état de me led et par quoi je peux changer l'oprération ?
Triskey a écrit:
Bonjour,
Il ne faut pas faire une opération égale à 0 dans ton if. Il y a peut de chance que tu tombes directement sur le modulo 0.
Les conditions sont aussi mal montées.
De plus, comme le temps pour le changement d'état de tes LEDs n'est pas le même entre le On et le Off, je pense qu'il faut que tu testes d'abord l'état de la Led (surtout pour la Led 2)
Je met de côté l'histoire des 10 secondes de la Led1 et des 20 secondes de la Led2 qui sont contradictoires avec l'instruction d'avant dans ton code.
Je vois le message mais je suis au travail. Je ne peux pas te proposer de code, mais voici les pistes à explorer. Comme tu es débutant, ça t'aidera à progresser, plus qu'un bête copier coller.
Pour connaître l'état de la Led, il faut l'interroger. Led1 et Led2 sont des boolean. Donc ils doivent avoir comme valeur soit True, soit False. Pour commencer, leur déclaration devrait être :
Donc si tu veux afficher l'état, tu peux faire Serial.print(ta_variable); . Si tu veux déclencher une action quand la variable est true variable, tu fais if (etat_led1)...
Comme ta boucle loop() met un temps non défini à s'exécuter, tu ne peux pas savoir quand vont s’exécuter les fonctions ou les conditions. Donc quand tu testes le temps, il y a une chance sur mille que tu tombes sur l'instant zéro. Hors le modulo (%) sert à trouver le reste de la division. Et là, tu testes que le reste soit à zéro. Comme tu déclare une variable temps, à ta place je l'utiliserais. J'en créerai même une seconde pour gérer le temps de chaque led.
Comme tu es débutant, il est certainement plus simple d'avoir deux blocs if distincts
Au final, le loop devrait être du genre pour led1
Si millis moins temps1 est supérieur à une seconde et que etat_led1 est false alors etat_led1 est changé en true et je met à jour temps1 avec la valeur courante de millis Sinon si millis moins temps1 est supérieur à une seconde et que etat_led1 est true alors etat_led1 est changé en false et je met à jour temps1 avec la valeur courante de millis Sinon je met simplement à jour la variable temps1
Pour Led2, c'est la même chose en changeant le temps pour l'allumage.
Après si c'est bien monté, tu peux jouer sur les temps comme tu veux. Mais gère les Led dans deux conditions différentes, ce sera plus facile.
Pour compléter sur la gestion du temps, on peut voir chaque Led comme un objet qui gère les actions qu'il a besoin d'effectuer
son constructeur fait un pinMode(...)
une méthode, appelons-la loop(), faiut ce qu'elle doit faire dans le loop du programme
Le programme principal ressemblerait à ceci (avec deux types de LEDs, puisqu'elle n'ont pas le même comportement)
// code non testé. Use at your own risks.
LedType1 led1(1);
LedType2 led2(2);
void setup() {
...
}
void loop() {
led1.loop();
led2.loop();
..
}
Chaque LED s'occupe de son initialisation, mémorise son état et le moment où elle doit en changer
class LedType1
int pin;
unsigned long prochain_changement;
int etat_actuel;
// les états successifs
// 0 : allumé une seconde
// 1 : éteint une seconde
// 2 : allumé une seconde
// 3 : éteint
public:
LedType1(int p) {
pin = p;
pinMode(pin, OUTPUT);
etat_actuel = -1;
prochain_changement = 0;
}
void loop() {
unsigned long temps_actuel = millis();
if (temps_actuel >= prochain_changement && etat_actuel != 3) {
etat += 1;
if (etat_actuel == 0 || etat_actuel == 2)
digitalWrite(pin, HIGH);
else
digitalWrite(pin, LOW);
prochain_changement = temps_actuel + 1000; // 1 seconde
}
}
};
et bien sûr, on peut utiliser l'héritage pour des classes qui ont "presque" le même comportement.
- Edité par michelbillaud 8 septembre 2019 à 11:04:27
plusieurs led
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Que ta route soit parsemée de jasmin.
https://triskey.fr
Que ta route soit parsemée de jasmin.
https://triskey.fr