je souhaite avoir un programme pour gérer le fonctionnement d'un lampadaire de la manière suivante :
si un mouvement est détecté alors une led s'allume selon le scénario suivant : LED à 100% de luminosité pendant 10 secondes, ensuite LED à 50% pendant 5 secondes, ensuite LED éteinte.
Dans un second temps, je souhaite que si il y a une nouvelle détection de mouvement on relance le cycle complet d'allumage de la LED. (que le système soit redéclenchable).
Je bloque sur deux points, l'utilisation d'une temporisation non bloquante et le fait qu'un nouveau mouvement relance le cycle d'allumage.
Quelqu'un peut-il m'apporter une solution et des explications ?
Merci d'avance.
Le plus rapide serait que tu nous montre sur quoi tu bloque.
pour faire une attente non bloquante dans la loop
il faut par exemple mémoriser le temps de référence dans une variable en appelant la fonction millis, cela peut être fait dans le setup ou sous condition dans la loop.
puis dans la loop tester si le temps courant(appel encore une fois à millis) est supérieur au temps de référence, plus le temps d'attente.
si le test est positif, tu fais ce que tu dois faire.
Pour relancer l'attente automatiquement, tu affectes ta variable de temps de référence avec le temps courant donné encore une fois par millis
Mon programme actuel avec la non gestion du redéclenchement et des temporisations bloquantes :
#define PIR 2
#define LED 3
void setup()
{
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(PIR) == HIGH) // si mouvement détecté
{
digitalWrite(LED, HIGH); // allumer LED
delay(10000); // pendant 10 secondes
analogWrite(LED, 50); // après 10 secondes, allume LED avec une luminosité plus faible
delay(5000); // pendant 5 secondes
}
else
{
digitalWrite(LED, LOW); // si pas de mouvement, LLED éteinte
}
}
J'essaye avec la fonction millis() mais je n'arrive pas au résultat souhaité
je t'ai fait un truc à l'arrache en wokwi.
Cela va un peu plus loin que l'utilisation de millis, mais c'est compliqué de partir de ton exemple sans passer par une pseudo machine à état comme te l'a indiqué @Jambe.
Le but est que cela te mette le pied à l'étrier pour appliquer le tutoriel de @J-M-L