problème code infrarouge

Bonjour,
Je suis en 4eme et je dois faire une maquette de maison en techno... Le truc, c'est qu'une simple maquette manque un peu de réalisme : j'aimerais donc contrôler des LEDs et d'autre choses divers et variés avec une Arduino .
Mon idée étais de gérer tout ça avec une télécommande infrarouge, mais je suis coincé au niveau du code...
Pourriez vous m'aider à trouver LA bonne fonction ?

Problème : j'arrive à recevoir les signaux de la télécommande mais pas à faire une fonction du genre
Si l'Arduino reçoit ce "code", alors elle allume la LED . ( Je sais ça paraît bête mais étant novice dans la programmation, je galère depuis 3 heures sans résultat )

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 3;
int led = 5 ;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;




void setup()
{
  pinMode(led, OUTPUT);
 Serial.begin(9600);
 monRecepteurInfraRouge.enableIRIn();
 monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value ==  0xFF30CF)
     {
     digitalWrite ( led, HIGH ) ;
     }
  
  
  delay(500);
 
monRecepteurInfraRouge.resume() ;

  }
  delay (1);
}

Merci d'avance :slight_smile:

Bonjour,

Pour voir si tu reçoit bien le code que tu attends ajoute un Serial.print() après monRecepteurInfraRouge.decode()

Bonjour,
J'ai deja vérifier et je confirme, je reçois bien le code... mais impossible d'allumer une LED par exemple... Je suis nul en code :confused: :cry:

Pourtant ta fonction digitalWrite ( led, HIGH ) ; devrait allumer la led. Il faut voir comment elle est cablée

Comment on met un plan fritzzing ?

Je suis content en tout cas que tu me dise qu'en théorie ça marche

MERCI :slight_smile:

Il faut l'afficher sous forme d'image. Voir ici pour inclure une image

Quand je dis que ça doit marcher, c'est l'allumage de la led qui doit marcher, mais elle n'est jamais éteinte dans ton programme.

Bonjour,
alors comme j'ai pas réussi à mettre d'image... no comment

J'ai décidé de me casser la tête à faire un code ... et en seulement 3 heures ( no comment ) , voici mon code

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode ( 8, OUTPUT ) ;
 Serial.begin(9600);
 monRecepteurInfraRouge.enableIRIn();
 monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF30CF ){
     digitalWrite ( 8, HIGH );
    
    }

   

    if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF18E7  )
    {
     digitalWrite ( 8, LOW );
    
  
    }
    
    monRecepteurInfraRouge.resume();
  }
  delay(1);
}
}

en claire si j'appuie sur le bouton 1 la LED s'allume, si j'appuie sur le 2 elle s'éteint ...
sauf que j'ai pas 36 boutons sur ma télécommande, je me demande donc si il y a un moyen d'appuyer sur le bouton 1 : sa s'allume : on reappuis : sa s'éteint

Si il y a une commande magique pour ça merci de me la dire... je galère

Merci d'avance

Utilise un flag (une variable type boolean par exemple ) !
Exemple:

Tu appuies sur ton bouton 1 avec le flag à False :
Ca allume ta led , puis tu passes le flag à True

Et quand tu ré-appuies sur ton bouton avec le flag à True :
Ca éteint la led et tu repasses le flag à False

boolean Flag = true;

If( appuibouton == HIGH && Flag == true)
{
  //allume ta led
Flag = false ;
}


If( appuibouton == HIGH && Flag == false)
{
  //eteint ta led
Flag = true;
}

Bonjour,
Je viens de tester et je pensait que ça allait marcher car sur papier ça sonne bien... Et ben non :cry:
je peux allumer la LED... mais pas l'éteindre, bonjour la facture d'électricité xD
Si quelqu'un sait ce qui cloche voila le code

#include <IRremote.h>

boolean Flag = true ;

const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode ( 9, OUTPUT ) ;
 Serial.begin(9600);
 monRecepteurInfraRouge.enableIRIn();
 monRecepteurInfraRouge.blink13(true);
}



void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF30CF && Flag == true  ){
     digitalWrite ( 9, HIGH );

     Flag = false ;
    
    }

   delay (400) ;



    if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF30CF && Flag == false  )
    {
     digitalWrite ( 9, LOW );

    Flag = true ;
  
    }
    
 monRecepteurInfraRouge.resume();
  }
  delay(1);
}
}

Merci encore d'avance

Dans la loop tu restestes Flag après l'avoir modifier.
Essaies comme ça

#include <IRremote.h>

boolean Flag = true ;

const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode ( 9, OUTPUT ) ;
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF30CF)
    {
      if (Flag == true)
      {
        digitalWrite (9, HIGH);
        Flag = false;
      }
      else
      {
        digitalWrite (9, LOW);
        Flag = true;
      }
      monRecepteurInfraRouge.resume();
    }
    delay(1);
  }
}

nop, toujours pas... je penses que l'arduino continue à croire qu'elle reçoit le bouton 1 car elle l'a déja reçu avant et qu'elle garde ça en mémoire... ou c'est peut être autre chose... mystère et boule de gomme : /

Quoi qu'il en soit c'est galère...

si il y a un pro du code qui passe par la et qui nous dit la formule magique ce serait cool ; )

Merci d'avance

Ca devrait fonctionner. Tu devrais mettre un Serial.println pour afficher ce que tu reçois

 if (monRecepteurInfraRouge.decode(&messageRecu))
 {
   Serial.println(messageRecu.value,HEX);

Eureka ! ! !
le problème était tout bête !

il fallait juste mettre le monRecepteurInfraRouge.resume(); après l'acolade... il était dans la fonction if

je suis trops content =D en appuyant sur un bouton j'allume une led... je sais c'est inutile xD

voila le nouveau code

#include <IRremote.h>

boolean Flag = true ;

const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode ( 9, OUTPUT ) ;
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if ( messageRecu.value == 0xFF30CF)
    {
      if (Flag == true)
      {
        digitalWrite (9, HIGH);
        Flag = false;
      }
      else
      {
        digitalWrite (9, LOW);
        Flag = true;
      }
  
    }
     monRecepteurInfraRouge.resume();
    delay(1);
  }
}

Merci encore... j'ai appris plein de choses en galérant =D

Oui, effectivement tu devais recevoir continuellement le même code.

Bonjour,
Moi qui me croyais au bout de mes peines... Et ben non !
une LED ça marche... plusieurs ça fait la grève ^^

Mon problème... ben ça marche plus :confused:

La fonction if / if else n'est pas faite pour ça faut croire

Une idée sur LA fonction qu'il faut utiliser ?

CODE :

#include <IRremote.h>

boolean Boutton1 = true ;
boolean Boutton2 = true ;
boolean Boutton3 = true ;
boolean Boutton4 = true ;
boolean Boutton5 = true ;


const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{

  pinMode ( 8, OUTPUT ) ;
  pinMode ( 9, OUTPUT ) ;
  pinMode ( 10, OUTPUT ) ;
  pinMode ( 11, OUTPUT ) ;
  pinMode ( 12, OUTPUT ) ;
  
  
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    // BOUTTON 1
  }
    if ( messageRecu.value == 0xFF30CF)
    {
      if (Boutton1 == true)
      {
        digitalWrite (8, HIGH);
        Boutton1 = false;
      }
      else
      {
        digitalWrite (8, LOW);
        Boutton1 = true;
      }
      }

// BOUTTON 2
       else  if ( messageRecu.value == 0xFF18E7
)
    {
      if (Boutton2 == true)
      {
        digitalWrite (9, HIGH);
        Boutton2 = false;
      }
      else
      {
        digitalWrite (9, LOW);
        Boutton2 = true;
      }
      }
   
//BOUTTON 3

   else  if ( messageRecu.value == 0xFF7A85)
    {
      if (Boutton3 == true)
      {
        digitalWrite (10, HIGH);
        Boutton3 = false;
      }
      else
      {
        digitalWrite (10, LOW);
        Boutton3 = true;
      }
  }
 //BOUTTON 4
  
 else if ( messageRecu.value == 0xFF10EF)
      if (Boutton4 == true)
      {
        digitalWrite (11, HIGH);
        Boutton4 = false;
      }
      else
      {
        digitalWrite (11, LOW);
        Boutton4 = true;
      }
      

        //BOUTTON 5
        
     else   if ( messageRecu.value == 0xFF38C7)
    {
      if (Boutton5 == true)
      {
        digitalWrite (12, HIGH);
        Boutton5 = false;
      }
      else
      {
        digitalWrite (12, LOW);
        Boutton5 = true;
      }

  
      
    }
     monRecepteurInfraRouge.resume();
    delay(1);
  }

MERCI

P.S.: Je suis débutant... ne m'en voulez pas si je passe à côté de LA fonction =D

Tu nous fais une belle salade d'accolades là , tu peux te passer des if/else en utilisant juste des if , si ça marche avec un bouton , tu copie/colles l'ensemble ...

Avec switch case, cela sera sympa...

switch case

L'accolade } après le 1er if de loop est mal placée. Elle doit être à la fin.
Pour vérifier l'imbrication des blocs de condition formates ton texte avec CTRL T
Code corrigé:

#include <IRremote.h>

boolean Boutton1 = true ;
boolean Boutton2 = true ;
boolean Boutton3 = true ;
boolean Boutton4 = true ;
boolean Boutton5 = true ;


const char DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{

  pinMode ( 8, OUTPUT ) ;
  pinMode ( 9, OUTPUT ) ;
  pinMode ( 10, OUTPUT ) ;
  pinMode ( 11, OUTPUT ) ;
  pinMode ( 12, OUTPUT ) ;


  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    // BOUTTON 1
    if ( messageRecu.value == 0xFF30CF)
    {
      if (Boutton1 == true)
      {
        digitalWrite (8, HIGH);
        Boutton1 = false;
      }
      else
      {
        digitalWrite (8, LOW);
        Boutton1 = true;
      }
    }

    // BOUTTON 2
    else  if ( messageRecu.value == 0xFF18E7)
    {
      if (Boutton2 == true)
      {
        digitalWrite (9, HIGH);
        Boutton2 = false;
      }
      else
      {
        digitalWrite (9, LOW);
        Boutton2 = true;
      }
    }

    //BOUTTON 3

    else  if ( messageRecu.value == 0xFF7A85)
    {
      if (Boutton3 == true)
      {
        digitalWrite (10, HIGH);
        Boutton3 = false;
      }
      else
      {
        digitalWrite (10, LOW);
        Boutton3 = true;
      }
    }
    //BOUTTON 4

    else if ( messageRecu.value == 0xFF10EF)
      if (Boutton4 == true)
      {
        digitalWrite (11, HIGH);
        Boutton4 = false;
      }
      else
      {
        digitalWrite (11, LOW);
        Boutton4 = true;
      }


    //BOUTTON 5

    else   if ( messageRecu.value == 0xFF38C7)
    {
      if (Boutton5 == true)
      {
        digitalWrite (12, HIGH);
        Boutton5 = false;
      }
      else
      {
        digitalWrite (12, LOW);
        Boutton5 = true;
      }
    }
    monRecepteurInfraRouge.resume();
  }
  delay(1);
}

ok je teste ça demain matin...

Merci

Avec switch case, cela sera sympa...

switch case

+1

Ton post ma donner envie d'essayer mon kit IR. Je vais te montrer une autre façon de faire avec se fameux switch case.
Pour commencer, je défini les touches de la télécommande

#include <IRremote.h>

#define Boutton1 0xFF30CF
#define Boutton2 0xFF18E7
#define Bouton3 ......

Ensuite je créer des boolean pour connaitre l'état des led a la différence de toi qui enregistre l'etat du boutton

boolean runLed1 = false;//Etat de la led qui changera en fonction de l'appui du boutton1
boolean runLed2 = false;//... piloter par le Boutton2
boolean runLed3 = false;//...  piloter par le Boutton3
...
//je déclare mes variables constante
const byte led1 = 8;//pin de connexion 
const byte led2 = 9;
...
const byte DIN_RECEPTEUR_INFRAROUGE = 2;

dans void loop tu met tout en place :slight_smile:

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu)){
   switch (messageRecu.value) {
     
     case Boutton1:  //si le boutton1 est appuyé 
      runLed1 = !runLed1; //sa permet de changer la valeur de la boolean as l'inverse de ce quel est
      digitalWrite (led1, runLed1);//on applique le changement
      break;

     case Boutton2:
      runLed2 = !runLed2;
      digitalWrite (led2, runLed2);
      break;

    case Boutton3:
     runLed3 = !runLed3;
     break;
      .....
}
monRecepteurInfraRouge.resume();
}
     
}