Go Down

Topic: Télécommande IR blink (Read 181 times) previous topic - next topic

JS7777

Bonsoir à tous,

J'ai un Arduino Uno avec un récepteur tsop4838 qui permet d'éteindre ou d'allumer une led avec une télécommande.


Voilà le code :

Code: [Select]

#include <IRremote.h>

int bright;
int before;
int out=3; //connecter led sur broche 3

int RECV_PIN = 11; //connecteur sortie signal du recepteurIR sur broche 11

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup(){
  irrecv.enableIRIn(); // start the receiver
  before=0; //LED is turned off
  bright=255; //brightness value is at maximum (255)
  pinMode(out,OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {

  if (results.value==0x875){ //Code to turn the LED ON/OFF
    if(before==0){ // if the LED was turned off, then we turn it on
      digitalWrite(out,HIGH);
      before=1; //LED is now turned on
      delay(1000);
    }
    else{
      digitalWrite(out,LOW); //if the LED was turned on, then we turn it off
      before=0;
      bright=255;
      delay(1000);
     
    }}
 
 
   
  irrecv.resume();
}}




Ce code marche correctement.

Maintenant j'aimerai que la led clignote quand j'appuie sur le bouton 1 de ma télécommande et que la led s'éteigne quand j'appuie sur le bouton 2 de ma télécommande.

J'ai essayer avec for int i / while etc... mais j'arrive pas à éteindre la led.

Si vous pouvez m'aider.

Merci d'avance

Cdt

dfgh

hello
dans ton prg, il n'y a qu'un seul code de touche
veux tu tester ce code
un appui pour allumer/clignoter et un deuxième appui pour éteindre

Code: [Select]
#include <IRremote.h>

int bright;
int etat;
int out=3; //connecter led sur broche 3
unsigned long deb=0;
unsigned long fin=0;
int RECV_PIN = 11; //connecteur sortie signal du recepteurIR sur broche 11

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn(); // start the receiver
  etat=0; //LED is turned off
  bright=255; //brightness value is at maximum (255)
  pinMode(out,OUTPUT);pinMode(8,INPUT);
}

void loop()
{
  if (irrecv.decode(&results))
  {
  if (results.value==0x875)
  {
    etat=!etat;deb = millis();
   }
   }   
   if (etat)
      { fin=millis();
      if (fin-deb>1000){digitalWrite(out,(!digitalRead(out)));deb = millis();}
      }   
    else
    {
      digitalWrite(out,LOW);
      etat=0;
      bright=255;
    }
  irrecv.resume();
}

JS7777

Bonjour,

Merci

Je teste ça ce soir.

JS7777

Bonsoir,

J'ai testé le code, cela ne marche pas : Rien ne s'allume.

Cdt

dfgh

hello
le code fonctionne
je n'ai pas de télécommande pour tester
alors je suis obligé de tester une autre version que celle que je t'ai postée.
les modifs sont en debut de la loop

voici donc la version qui fonctionne

ma led témoin est la led 13
et pour tester, je shunt l'entrée 8 alternativement à GND puis à +5V pour simuler une impulsion

Code: [Select]
#include <IRremote.h>
int bright;
int etat;
int out=13; //connecter led sur broche 3
unsigned long deb=0;
unsigned long fin=0;
int RECV_PIN = 11; //connecteur sortie signal du recepteurIR sur broche 11

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn(); // start the receiver
  etat=0; //LED is turned off
  bright=255; //brightness value is at maximum (255)
  pinMode(out,OUTPUT);pinMode(8,INPUT);
}

void loop()
{
// if (irrecv.decode(&results))
  {
//  if (results.value==0x875)
if (digitalRead(8))
  {
    etat=!etat;deb = millis();
   }
   }   
   if (etat)
      { fin=millis();
      if (fin-deb>1000){digitalWrite(out,(!digitalRead(out)));deb = millis();}
      }   
    else
    {
      digitalWrite(out,LOW);
      etat=0;
      bright=255;
    }
  irrecv.resume();
}

JS7777

Bonsoir,

Ce code là marche bien. Mais il y a un delais quand la led s'allume quand on met la broche 8 à gnd.

PS : j'ai changer de télécommande car je n'ai pas l'autre sur moi :


Bouton 1

Appui court : FF6897
Appui long : FFFFFFFF



Par contre l'autre code j'arrive pas à résoudre le problème.


Cdt

JS7777

Jai encore essayé, j'ai vérifié le code mais la led ne s'allume pas du tout.

Cdt

kamill

#7
Mar 23, 2017, 01:41 pm Last Edit: Mar 23, 2017, 01:51 pm by kamill
Bonjour,

Il faut que tu positionne un flag sur reception des touches et que tu traites le clignotement en fin de loop
Code: [Select]
void loop() {
  static bool clig = false; // flag indiquant si on doit clignoter
  if (irrecv.decode(&results)) {
    if (results.value == 0x875) { //Code to turn the LED ON/OFF
      clig = true;
    }
    else {
      clig = false;
    }
    irrecv.resume();
  }

  if (clig)
  {
    // clignotement de la led
    static unsigned long millisLastClig = 0;
    unsigned long millisCur = millis();
    if (millisCur - millisLastClig > 500)
    {
      digitalWrite(out, !digitalRead(out));   // inverse l'allumage de la led
      millisLastClig = millisCur;
    }
  }
  else
  {
    // extinction de la led
    digitalWrite(out, LOW);
  }
}

JS7777

Merci pour ta réponse

Ce code marche mais il bug.

Il faut que j'appuie plusieurs fois sur le bouton 1 de ma télécommande sinon la led s'allume et s'éteint aussitôt.

Ce problème vient de ça :

Bouton 1

Appui court : FF6897 et FFFFFFFF de temps en temps
Appui long :  FF6897 puis FFFFFFFF


Donc le else de ce code vérifie si il c'est autre que 0xFF6897 donc comme il y a FFFFFFFF cela produit le bug cité plus haut.


Code: [Select]
if (irrecv.decode(&results)) {
    if (results.value == 0xFF6897) { //Code to turn the LED ON/OFF
      clig = true;
    }
    else {//if (results.value == 0xFF9867){
      clig = false;
    }
    irrecv.resume();
  }



Je suis actuellement en train de chercher de résoudre le problème.


Cdt

kamill

Il suffit de ne rien faire quand le code vaut FFFFFFFF

JS7777

voilà ce que j'ai fait :

Code: [Select]
int be;

Code: [Select]
if (irrecv.decode(&results)) {
    if (results.value == 0xFF6897 && be==0) { //Code to turn the LED ON/OFF
     
      clig = true;
      be = 1;
    }
   
    else if (results.value == 0xFF6897 && be==1){
       
      clig = false;
      be = 0;
    }



Cela marche nickel !


Merci encore !

kamill

Oui, tu démarre et arrête le clignotement avec la même touche.
Tu n'avais pas besoin d'un indicateur supplémentaire tu pouvais utiliser clig.

JS7777

Oui, c'est vrai.

Voilà le code complet avec cette modif:

Code: [Select]
#include <IRremote.h>

int bright;
int etat;
int out=3; // Led sur broche 3

unsigned long deb=0;
unsigned long fin=0;
int RECV_PIN = 11; //connecteur sortie signal du recepteur IR sur broche 11

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn(); // start the receiver
  etat=0; //LED is turned off
  bright=255; //brightness value is at maximum (255)
  pinMode(out,OUTPUT);
}

void loop() {
  static bool clig = false; // flag indiquant si on doit clignoter
 
  if (irrecv.decode(&results)) {
    if (results.value == 0xFF6897 && clig==false) { // ICI LE CODE HEX EST A CHANGER EN FONCTION DU CODE DE VOTRE BOUTON DE TELECOMMANDE
     
      clig = true;
     
    }
   
    else if (results.value == 0xFF6897 && clig==true){ // ICI LE CODE HEX EST A CHANGER EN FONCTION DU CODE DE VOTRE BOUTON DE TELECOMMANDE
       
      clig = false;
     
    }
   
    irrecv.resume();
  }

  if (clig)
  {
    // clignotement de la led
    static unsigned long millisLastClig = 0;
    unsigned long millisCur = millis();
    if (millisCur - millisLastClig > 200)
    {
      digitalWrite(out, !digitalRead(out));// inverse l'allumage de la led
      //delay(50);
      //digitalWrite(out, !digitalRead(out));
      millisLastClig = millisCur;
    }
  }
  else
  {
    // extinction de la led
    digitalWrite(out, LOW);
  }
}

kamill


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy