[Résolu] Renseignement pour commande infra rouge

Bonjour à tous

Je viens vers vous aujourd’hui car je me confronte à un petit problème.

Voila je suis en train de monter une maquette du star destroyer de la guerre des étoiles avec la lumière qui vas bien:

Des centaine de trous et autant de fibre…

Donc, plutôt que d insérer un inter dans son future socle, je me suis:“attend” avec un arduino tu pour le commander en IR!

Seulement voila je suis un gros noob et j’y connais rien…
Donc comme tout les gros noobs je cherche un bout de code sur le net…
OK j’ai trouvé! (merci a Dark Best du forum robotique-projet)

Donc je fait mon petit montage:

J’utilise un relais car je vais avoir une vingtaine de led à alimenter en 9 ou 12V (mais j’ai cru comprendre que 12V c’est limite pour la carte.

Tout marche impeccable!

Vous allez me dire il est ou sont problème à lui? :neutral_face:

Ben mon problème est que ça fonctionne avec n’importe quel bouton de la petite commande fournit dans le kit , mais aussi avec n’importe quel bouton de la télécommande de la TV et du décodeur…du coup vue qu’il va être exposer dans le salon ça risque d’être vite agaçant… :grin:

Du coup la question qui tue: Comment fait on pour adresser des touches au de code:

IR_remote_detector sketch
An IR remote receiver is connected to pin 2.
The LED on pin 13 toggles each time a button on the remote is pressed.
*/
#include <IRremote.h> //adds the library code to the sketch
const int irReceiverPin = 2; //pin the receiver is connected to
const int ledPin = 13; 
IRrecv irrecv(irReceiverPin); //create an IRrecv object
decode_results decodedSignal; //stores results from IR detector

void setup()
{
   pinMode(ledPin, OUTPUT);
   irrecv.enableIRIn();
}
boolean lightState = false;
unsigned long last = millis();

// Start the receiver object
//keep track of whether the LED is on
//remember when we last received an IR
void loop()
{
   if (irrecv.decode(&decodedSignal) == true) //this is true if a message has been received
   {
       if (millis() - last > 250) {
           //has it been 1/4 sec since last message
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
       }
       last = millis();
       irrecv.resume();
       // watch out for another message
   }
}

/*

Merci.

Cochon. Tu pourrais mettre ton code entre balises : Faire un Nouveau Sujet ou le corriger avec les Balises... - Français - Arduino Forum

Normal : si tu ne tiens pas compte du code de la touche ...

Regarde par ici : https://github.com/z3t0/Arduino-IRremote/blob/master/examples/IRrecvDemo/IRrecvDemo.ino

Utilise le code de l'exemple pour afficher le code de la touche qui t'intéresse.

Ensuite ajoute un test :

        if (results.value == 0xC148C837) { // un code au hasard
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
        }

Peux-tu éditer ton code pour le mettre entre la balises CODE ? C'est plus facile à lire. Merci

C'est cette ligne qui teste l’arrivée d'un message IR :
if (irrecv.decode(&decodedSignal) == true)(au passage tu vois ici ce que donne les balises dont je parle)

Pour faire en sorte que ta télécommande TV ne fasse pas marcher ton système, il faut que ton code reconnaisse les codes de la TV et n'exécute pas les commandes.

Dans ton code, tu utilises ceci

decode_results decodedSignal; //stores results from IR detector

Or la classe decode_results contient une méthode appelée decode_type :

class decode_results
{
	public:
		decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
		unsigned long          value;        // Decoded value [max 32-bits]
		int                    bits;         // Number of bits in decoded value
		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
		int                    rawlen;       // Number of records in rawbuf
		int                    overflow;     // true iff IR raw code too long
};

Donc ta variable decodedSignal.decode_type devrait contenir le type de code reçu. Voici la liste des types :

typedef
	enum {
		UNKNOWN      = -1,
		UNUSED       =  0,
		RC5,
		RC6,
		NEC,
		SONY,
		PANASONIC,
		JVC,
		SAMSUNG,
		WHYNTER,
		AIWA_RC_T501,
		LG,
		SANYO,
		MITSUBISHI,
		DISH,
		SHARP,
		DENON,
		PRONTO,
		LEGO_PF,
	}
decode_type_t;

Donc je dirais que tu devrais faire un test sur le type : si c'est UNKNOWN alors la commande vient de ta téléc du kit, si c'est (disons) SONY, c'est que ça vient de la téléc de TV.

Essaye :

void loop()
{
    if (irrecv.decode(&decodedSignal) == true) //this is true if a message has been received
    {
       if (decodedSignal.decode_type == UNKNOWN) {
        if (millis() - last > 250) {
            //has it been 1/4 sec since last message
            lightState = !lightState;
            //toggle the LED
            digitalWrite(ledPin, lightState);
        }
        last = millis();
        irrecv.resume();
        // watch out for another message
       }
    }
}

Si ça ne compile pas, c'est que decodedSignal est un pointeur : il faut alors utiliser decodedSignal->decode_type au lieu de decodedSignal.decode_type dans le test
Au pire, tu affiches decodedSignal.decode_type sur la console et tu verras la différence entre les télécommandes.

EDIT : Damned, grilled by hbachetti...

Merci et désolé pour les balise :slight_smile:

Seulement:

MAMAN!!!

J'ai rien compris....

J'ai trouvé le code du bouton qui m'interesse ici la touche 1 qui est FF30CF

comme ça je suis bien contant...

Dans mon code je remplace

    {
        if (millis() - last > 250) {
            //has it been 1/4 sec since last message
            lightState = !lightState;
            //toggle the LED
            digitalWrite(ledPin, lightState);
        }

par

  if (results.value == 0xC148C837) { //FF30CF
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
        }

Impossible à compiler...

@lesept

C'est plus du chinois mais du mandarin...

Si j'ai bien compris:

Le but de la manœuvre c'est d'isoler tout les codes de chaque télécommande susceptible d interférer avec mon montage?

Parce que mes télécommande c'est une orange et une universelle...

Je comprend rien bon sang!!!!

Merci pour vos réponse

Le but de la manœuvre c'est d'isoler tout les codes de chaque télécommande susceptible d interférer avec mon montage?

Non, il s'agit de prendre en compte uniquement le code de touche qui t'intéresse.

Bon, je vois ... Il ne s'agit pas de mettre FF30CF en commentaires :

  // puisque ta variable results s'appelle decodedSignal il suffisait de remplacer
  if (decodedSignal.value == 0xFF30CF) { // ton vrai code de touche

AHHHH! MIRACLE!

ça fonctionne! Merci beaucoup!

Pas simple l'arduino quand on y connait rien.

Me reste plus qu'a adapter pour un nano et ce sera bon!

Encore merci à vous 2!

Oui, hbachetti te propose de reconnaître le code qui t'intéresse dans ta télécommande du kit. Moi, je te suggère de reconnaître ceux de tes autres télécommandes (orange et universelle) et de ne pas y réagir.

Deux approches différentes... pour un résultat semblable.

EDIT : quand tu auras terminé, ce serait sympa de poster une vidéo ou des photos du résultat.. Le star destroyer avec ses lumières dans l'obscurité, avec la musique de la Guerre des étoiles si possible :slight_smile:

merci lesept oui comme tu dit 2 approches différente et sauf erreur de ma part la solution de hbachetti me parais bcp plus simple.

Avec ta méthode il aurais fallu que j’identifie tout les boutons de mes télécommandes et de les isoler dans mon code?

Pour la musique faudrait faire un code qui met en route un petit lecteur MP3^^

Oui une fois qu'il sera monté et peint je vous ferais un retour!

Encore merci!

diogene777:
Avec ta méthode il aurais fallu que j’identifie tout les boutons de mes télécommandes et de les isoler dans mon code?

Non, juste reconnaitre le type de télécommande, sa marque en fait : SONY, SAMSUNG, LG...

diogene777:
Pour la musique faudrait faire un code qui met en route un petit lecteur MP3^^

Juste une musique de fond sur la vidéo, mais ça le fait aussi si tu l'ajoutes à la maquette. Il existe un module MP3 pour Arduino, qui lit des fichiers sur une carte SD (8.90€).

Le lien que je t'indique pointe sur des exemples de réalisations avec des codes pour le faire fonctionner. Il y a une bibliothèque spécifique avec les fonctions qui simplifient la mise en oeuvre : begin, play, next, volumeUp, start, pause, etc.

Il faut aussi bien sûr un haut-parleur et ce qui va avec...

oula... vue comment je suis doué avec une led j imagine pas avec des séquences audio...lol

Pour ma gouverne:

Comment aurais je pu identifier le code de mes commandes no name?

Comment aurais je pu identifier le code de mes commandes no name?

C'est un peu le problème.
Noname et Orange risquent d'être confondus (UNKNOWN).

Mais tu peux afficher decodedSignal.decode_type pour voir.

Tout dépend de ce que tu cherches à faire :

  • allumer une LED avec une seule touche de la télécommande (dans ce cas, tu as déjà de qu'il faut)
  • allumer une LED avec n'importe quelle touche de la télécommande (il faut pouvoir distinguer les deux télécommandes)

Remarque :
Il y très peu de chances pour que le code 0xFF30CF soit émis par deux télécommandes différentes, sauf si elles sont de la même marque.