Je cherche basiquement a faire s'allumer une LED pendant une périodes sans avoir a utiliser delay() qui bloque le programme.
Dans mon programme ci-dessous ma variable temps ne ce réinitialise jamais et ne commence pas quand je le souhaite.
Je peut voir dans le port série que le temps ne cesse de s’écouler.
/*
Programme de reception IR
Entree PIN 4
Sorties PIN 10 / 11 /12
*/
#include <IRremote.h>
int RECV_PIN = 4; //pin de reception du capteur IR
int led2;
int led3;
unsigned long prevtime = 0;
IRrecv recep (RECV_PIN); // variable de reception IR
decode_results resul; // resultat de la recpetion en HEX
void setup() {
Serial.begin(9600); // ouverture du port serie
recep.enableIRIn(); //Autorise la reception du signal IR dans la variable choisie
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
}
void loop() {
if (recep.decode(&resul)){
//Serial.println(resul.value,HEX); // valeur hexa du bouton dans le port serie
if (resul.value == 0xFF30CF){ // Un apuis sur 1 alume une led pendant 1 seconde
(Serial.println("touche1"));
/* digitalWrite (10,1);
delay(1000);
digitalWrite (10,0); */
digitalWrite (10,1);
prevtime = millis()/1000; // debut du compteur en secondes
Serial.println (prevtime);
if (prevtime >= 1){
digitalWrite (10,0);
prevtime=0;
}
}
if (resul.value == 0xFF18E7 && led2 ==0){ // Un apuis sur 2 alume la led un deuxieme apuis l'eteind
(Serial.println("touche2"));
digitalWrite (11,1);
led2=1;
}
else if (resul.value == 0xFF18E7 && led2 ==1){
(Serial.println("touche2"));
digitalWrite (11,0);
led2=0;
}
delay(50); // evite les redondances
//recep.enableIRIn(); // je ne sais pas osef
recep.resume(); // Permet d'apuyer encore sur la telecomande sans cree une boucle infini
}
}
Je voudrais faire comme la partie avec le delay() mis en comentaire mais sans que ça me bloque le programe.
Je voudrais alumer une led pendant x secondes en apuyant sur bouton 1 et pouvoir me servir de bouton 2 pendant que la led est allumé
La fonction millis() me semble la plus aproprier mais je suis incabable de la controler (debut , pause , fin ,reset)
if (resul.value == 0xFF30CF){ // Un apuis sur 1 alume une led pendant 1 seconde
(Serial.println("touche1"));
prevtime = millis(); // debut du compteur en secondes
Serial.println (prevtime);
if (millis() -prevtime < 1000){
digitalWrite (10, HIGH);
}else{
digitalWrite (10, LOW);
}
b3b3rt:
La fonction millis() me semble la plus aproprier mais je suis incabable de la controler (debut , pause , fin ,reset)
Je pense que tu n'as pas compris comment fonctionne millis(). On ne contrôle rien. millis() retourne simplement une mesure du temps écoulé depuis la mise en route de la carte. Tu si tu veux mesurer un temps relatif à un événement qui serait ton T0 il faut mémoriser la valeur de millis() à T0 dans une variable (disons milliT0) et travailler ensuite en faisant à chaque instant la différence entre millis() et milliT0.
Merci beaucoup voila grace a votre aide comment j'ai résolut mon problème
void loop() {
if (temps > 1000){
digitalWrite(10,0);
}
if (recep.decode(&resul)){
if (resul.value == 0xFF30CF){ // Un apuis sur 1 alume une led pendant 1 seconde
top_chrono();
digitalWrite(10,1);
}
if (resul.value == 0xFF18E7 && led2 ==0){ // Un apuis sur 2 alume la led un deuxieme apuis l'eteind
(Serial.println("touche2"));
digitalWrite (11,1);
led2=1;
}
else if (resul.value == 0xFF18E7 && led2 ==1){
(Serial.println("touche2"));
digitalWrite (11,0);
led2=0;
}
delay(50); // evite les redondances
recep.resume(); // Permet d'apuyer encore sur la telecomande sans cree une boucle infini
}
Stop();
}
void top_chrono(){
start = millis();
}
void Stop(){
arret = millis();
temps = arret - start;
}
merci beaucoup infobarquee tu m'as fait réfléchir dans le bon sens et m'as donne les outils nécessaire pour pouvoir réaliser ça