télécommande

bonsoir tous le monde,

je m'en reviens vers vous pour une question!

le programme que j ais pour ma télécommande fonctionne a merveille sauf pour une fonction

qui ne réagis pas quand j appuis sur cette touche!??

je m 'explique!

quand j'appuis sur une touche la led s'allume bien pendant le temps donner,quand j appuis sur l'autre touche

cela fonctionne très bien également mais j 'ais rajouter dans mon code une ligne qui quand j appuis sur

la troisième touche devrais éteindre la led verte ou rouge !!

mais rien ne se passe les leds reste allumer le temps que je leur est donnez!! :slightly_frowning_face:

une idée?

voici le code:

#include <IRremote.h>

int IR = 11; // Récepteur IR en broche 11
const byte LED3  = 3; // led rouge en broche 3
const byte LED4  = 4; // led verte en broche 4
IRrecv RCEP(IR);

decode_results RIR; //

void setup()
{
  Serial.begin(9600); // permet de vérifier sur le moniteur série si le code de la touche est le bon
  // sinon cette ligne n'est pas nécessaire
  RCEP.enableIRIn(); // Commencement de la réception
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}

void loop()
{
  if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
  {
    Serial.println(RIR.value, DEC); // vérification du code de la touche actionnée sur le moniteur série
    // sinon cette ligne n'est pas nécessaire

    if (RIR.value == 0x40bf00ff) // si touche 0 actionnée CETTE LIGNE NE FONCTIONNE PAS!SA 

   N'ARRETE PAS LA LED 3 OU 4 de S' ALLUMER!!

    {
      digitalWrite(LED3, LOW); // Les LED s'éteignent
      digitalWrite(LED4, LOW);
    }

    if (RIR.value == 0xfb9) // si touche 1 actionnée
    {
      digitalWrite(LED3, HIGH); // La LED verte s'allume
      delay (20000);
      digitalWrite(LED3, LOW);

    }
    if (RIR.value == 0x40bf50af) //telecomande differente
    {
      digitalWrite(LED3, HIGH);
      delay (20000);
      digitalWrite(LED3, LOW);

    }
    if (RIR.value == 0x40bf906f) //telecommande differente
    {
      digitalWrite(LED4, HIGH);
      delay (20000);
      digitalWrite(LED4, LOW);

    }

    if (RIR.value == 0x7ba) // si touche 2 actionnée
    {
      digitalWrite(LED4, HIGH); // La LED Rouge s'allume
      delay (20000);
      digitalWrite(LED4, LOW);

    }
    RCEP.resume(); // Réception de la prochaine valeur

  }
}

je vous est mis un commentaire sur la ligne qui ne fonctionne pas!

Dans ton serial.print change DEC en HEX et vérifie si le code de ta touche est bien 0x40bf00ff car je ne vois pas de problème dans ton code

bonsoir lesept,je viens d'arrivé du taf ! :slight_smile:

oui effectivement a part ce que tu m a indiqué j 'ais regardé sa tard la nuit dernière et

moi non plus je ne comprenais pas ce qui pouvais ne pas marcher!! :confused:

j'ais consulter pas mal sur ce forum et j 'avais peur de devoir refaire le programme avec millis!!

dont je ne me sens pas capable du tout !! :grin:

j'essaye sa et vous retiens au courant! :wink:

retour sur l'essais!

et malheureusement sa ne fonctionne pas !

des que j'appuis sur une touche la led rouge s'allume et j'appuis tous de suite apres sur l'autre touche pour éteindre cette led mais elle ne s'éteint pas!!

elle continue de s'allumer jusqu'a la fin du delais! :frowning:

Pas la peine, tu peux utiliser ton code actuel et le débuguer. Tu as mis un serial.print : dis nous ce qu'il indique lorsque tu le fais fonctionner. Mets deux lignes :

    Serial.println(RIR.value, DEC); // vérification du code de la touche actionnée sur le moniteur série
    Serial.println(RIR.value, HEX); // vérification du code de la touche actionnée sur le moniteur série
    Serial.println(); // vérification du code de la touche actionnée sur le moniteur série

comme ça on verra les codes.

Selon la bibliothèque utilisée, decode_results est une classe:

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
};

et value est un unsigned long.

Tu peux donc modifier ton code pour créer une variable

unsigned long resultat = RIR.value;

et faire tous tes tests sur cette variable.

je vienS de vérifié dans le moniteur série comment reagis le microcontrôleur,

et la je m’aperçois que des que appuis pour allumer une led j'ais bien le code de la touche

mais des que je veut appuyé sur l'autre pour éteindre la led led avant la fin du delais le code ne s'affiche pas

dans le moniteur serie!!!

et des que le delay est terminer et que la led s'etteind tous seule ,la des que j'appuis sur la touche le code

s'inscrit bien dans le moniteur!!

on dirait que des que une led est allumer je ne peux plus rien faire d'autre ??!!

une idée??

C'est normal : la fonction delay est bloquante. Le microcontrôleur s'arrête et ne reçoit donc pas le code que tu lui envoies pendant ce delay. Si tu veux une lecture de codes plus rapide, il faut diminuer l'argument du delay, et la LED s'allumera moins longtemps.

je ne comprend pas se que tu veut me faire faire,,? :frowning:

quand j'ouvre le moniteur serie les touches selectionner pour allumer la led verte ou rouge s' affiche!!

la touche pour éteindre les leds s'affiche aussi mais des que une des deux led a fini sont delais,,?

sinon le code ne s'affiche pas ! donc ses pour sa que je n'arrive pas a l’éteindre ces fichus leds!! >:(

oui mais il me faut se temps la minimum!

car en faite les leds n'existe pas! je commande 4 mosfet qui eux commande 4 relais 24volt! :slight_smile:

pour inversement de polarité pour un verin electrique,

j'ais fabriquer un portail chez moi avec ouverture a distance avec une cellule ir de télé!

et tous fonctionne bien ! mais pour une sécurité je voulais rajouter une autre commande au cas ou il y aurais un obsatacle a l'ouverture comme sa je pourrais la stopper!

j'ais oublié de te dire que les le temps impartis est le temps qu'il me faut pour que mon portail

arrive a mes interupteur de fin course ou vert ou fermé!

la ed verte est remplacer par deux mosfet et la led verte par deux autres!

Je vais te demander comme je le demande souvent à d'autres : il faut bien définir son besoin. ça peut être fait par un logigramme ou par une liste ou un diagramme d'états, peu importe mais il faut définir tout précisément, sous peine de ramer lors du codage.

Voici un exemple de diagramme d'états :

Un autre :

Bien sûr tu n'es pas obligé, mais ça aide vraiment à comprendre les blocages ou identifier les problèmes de codage.

Pour l'instant, j'ai du mal à suivre ce qui se passe ou ne se passe pas quand tu appuies sur une touche, car je ne suis pas avec toi pour voir de quelle touche et quelle télécommande tu parles. Pour que je puisse t'aider efficacement, soit on part d'un diagramme bien fait, soit tu me décris un exemple d'utilisation de manière très précise, du genre :

  • Je veux ça
  • Je fais ceci
  • il se passe cela
    en décrivant très précisément les 'ça', 'ceci' et 'cela'. Plusieurs exemples aideront encore mieux.

Il faut aussi que tu débugues ton code : mets des Serial.print au début de tes if pour voir où tu passes. Exemple :

    if (RIR.value == 0x40bf50af) //telecomande differente
    {
      Serial.println("Télécommande X, touche Y");
      digitalWrite(LED3, HIGH);
      delay (20000);
      digitalWrite(LED3, LOW);

    }

Enfin, passe en 115200 bauds, on se traîne ... :slight_smile:
Serial.begin(115200); (et pareil dans la console bien sûr)

Et publie la dernière version du code.

je n'est jamais fais ! a part des algorithmes de dépannage vue mon metier :grinning:

je vais essayer de faire claire!

" quand j"appuis sur la touche1 de la telecomande

action sur deux mosfets commandant les relais de puissances

le verin reste actionner jusqu’à a venir en buter sur l’interrupteur de fin course (ouvert)

" quand j'appuis sur la touche 2 de la telecommande

action sur deux autres mosfet commandant les deux autres relais (polarité changer)

le verin reste actionner jusqu’à venir en buter sur l’interrupteur de fin course (fermer)

" quand j'appuis sur la touche 3 de la telecommande

stop la sortie ou rentrer du verin a n’importe qu'elle moment

Quels sont les codes de ces trois touches ?
Faut il prendre en compte le cas où tu appuies sur la touche 1 et sans attendre tu appuies sur la touche 2 (par exemple).?

comment faire pour publier le tableau du moniteur serie?

non desoler de ne pas avoir été plus précis! :slight_smile:

j'appuis sur la touche 1 (puis je la relache) et le sicle ce lance

j'appuis sur la touche 2(puis je la relache) et le second sicle se lance

j'appuis sur la touche 3 (puis je la relache) et j' interrompe le sicle 1 ou 2 a n'importe quelle moment

(la touche trois n'existe que sur une telecomande pour l'instant sur la deuxieme je n'est que deux touche)

[code

#include <IRremote.h>

int IR = 11; // Récepteur IR en broche 11
const byte LED3  = 3; // led rouge en broche 3
const byte LED4  = 4; // led verte en broche 4
IRrecv RCEP(IR);

decode_results RIR; //

void setup()
{
  
  Serial.begin(115200); // permet de vérifier sur le moniteur série si le code de la touche est le bon
  // sinon cette ligne n'est pas nécessaire
  RCEP.enableIRIn(); // Commencement de la réception
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}

void loop()
{
  if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
  {
    Serial.println(RIR.value, HEX); // vérification du code de la touche actionnée sur le moniteur série
    // sinon cette ligne n'est pas nécessaire
    if (RIR.value == 0x40bf00ff) // si touche 0 actionnée
    {
      Serial.println("Télécommande X, touche 3");
      digitalWrite(LED3, LOW); // Les LED s'éteignent
      digitalWrite(LED4, LOW);
    }

    if (RIR.value == 0xfb9) // si touche 1 actionnée
    {
      Serial.println("Télécommande Y, touche 1");
      digitalWrite(LED3, HIGH); // La LED verte s'allume
      delay (20000);
      digitalWrite(LED3, LOW);

    }
    if (RIR.value == 0x40bf50af) //telecomande differente
    {
      Serial.println("Télécommande X, touche 1");
      digitalWrite(LED3, HIGH);
      delay (20000);
      digitalWrite(LED3, LOW);

    }
    if (RIR.value == 0x40bf906f) //telecommande differente
    {
      Serial.println("Télécommande X, touche 2");
      digitalWrite(LED4, HIGH);
      delay (20000);
      digitalWrite(LED4, LOW);

    }

    if (RIR.value == 0x7ba) // si touche 2 actionnée
    {
      Serial.println("Télécommande y, touche 2");
      digitalWrite(LED4, HIGH); // La LED Rouge s'allume
      delay (20000);
      digitalWrite(LED4, LOW);

    }
    RCEP.resume(); // Réception de la prochaine valeur

  }
}

][/code]

OK, j'ai mis un peu de temps avant de comprendre, désolé.

Je pense qu'il faut voir ton problème comme une succession d'états. Le système peut être dans 4 états :

  • Etat 0 : attente d'une touche
  • Etat 1 : action suite à la touche 1. On y reste pendant une certaine durée, sauf si la touche 3 est appuyée, puis retour à l'état 0
  • Etat 2 : action suite à la touche 2. On y reste pendant une certaine durée, sauf si la touche 3 est appuyée, puis retour à l'état 0
  • Etat 3 : suite à l'appui sur la touche 3, interruption des états 1 et 2, puis retour à l'état 0

J'ai essayé de coder ça :

#include <IRremote.h>

int IR = 11; // Récepteur IR en broche 11
const byte LED3  = 3; // led rouge en broche 3
const byte LED4  = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //

/*
   On définit 4 états :
   état 0 : attente d'une touche
   état 1 : LED verte allumée, rouge éteinte, durée 2 sec puis retour à 0
   état 2 : LED rouge allumée, verte étaeinte, durée 3 sec  puis retour à 0
   état 3 : on éteint les LED, retour à état 0
*/
int etat = 0;
unsigned long dureeEtat1 = 2000;
unsigned long dureeEtat2 = 3000;
unsigned long chrono1 = 0;
unsigned long chrono2 = 0;

void setup() {
  Serial.begin(115200);
  RCEP.enableIRIn(); // Commencement de la réception
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}

void loop() {
  switch (etat) {
    case 0:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        unsigned long valeur = RIR.value;
        if (RIR.value == 0xfb9 || RIR.value == 0x40bf50af) {
          etat = 1;
          digitalWrite(LED3, HIGH);
          chrono1 = millis();
        }
        if (RIR.value == 0x40bf906f || RIR.value == 0x7ba) {
          etat = 2;
          digitalWrite(LED4, HIGH);
          chrono2 = millis();
        }
        if (RIR.value == 0x40bf00ff) etat = 3;
      }
      break;
    case 1:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        if (RIR.value == 0x40bf00ff) etat = 3;
      }
      else if (millis() - chrono1 > dureeEtat1) {
        digitalWrite(LED3, LOW); // Les LED s'éteignent
        digitalWrite(LED4, LOW);
        etat = 0;
      }
      break;
    case 2:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        if (RIR.value == 0x40bf00ff) etat = 3;
      }
      else if (millis() - chrono2 > dureeEtat2) {
        digitalWrite(LED3, LOW); // Les LED s'éteignent
        digitalWrite(LED4, LOW);
        etat = 0;
      }
      break;
    case 3: // Interruption des commandes 1 et 2 uniquement
      digitalWrite(LED3, LOW); // Les LED s'éteignent
      digitalWrite(LED4, LOW);
      etat = 0;
      break;
    default:
      Serial.println("Probleme : etat non reconnu.");
      etat = 0;
      break;
  }
  RCEP.resume(); // Réception de la prochaine valeur
}

J'ai mis une durée différente pour les états 1 et 2, mais c'est réglable via les paramètres. Teste le et dis-moi ce que ça donne.

Pour un système simple comme celui-ci, j'ai fait un code "linéaire", c'est à dire avec des if et un switch/case. Mais si tu veux ajouter des états, des conditions, etc, il serait plus facile d'utiliser une machine à états (state machine), il y a pleins de bibliothèques Arduino qui mettent ça en oeuvre assez simplement.

bonjour lesept

je viens d'arriver :wink:

oui effectivement ses plus logique de la facon la :wink: j'essaye ce code et regarde se que sa donne et te retien au ju

tout suite!.

retour sur le code! , et sa ne fonctionne pas,aucune led ne s'allume!

du coup j'ais ouvert le moniteur serie et appuyer sur les touches mais rien se s'affiche aucun code! :confused:

j'ais vérifier les codes des touches et ils sont exacte!

tu en penses quoi ,?

J'en pense que j'ai pas de bol :confused:

Normalement, il attend que tu appuies sur une touche. Les LEDs ne s'allument que si tu appuies sur une touche.
On va debuguer et ajouter des Serial.print un peu partout : Essaye ça

#include <IRremote.h>

int IR = 11; // Récepteur IR en broche 11
const byte LED3  = 3; // led rouge en broche 3
const byte LED4  = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //

/*
   On définit 4 états :
   état 0 : attente d'une touche
   état 1 : LED verte allumée, rouge éteinte, durée 2 sec puis retour à 0
   état 2 : LED rouge allumée, verte étaeinte, durée 3 sec  puis retour à 0
   état 3 : on éteint les LED, retour à état 0
*/
int etat = 0;
unsigned long dureeEtat1 = 2000;
unsigned long dureeEtat2 = 3000;
unsigned long chrono1 = 0;
unsigned long chrono2 = 0;

void setup() {
  Serial.begin(115200);
  RCEP.enableIRIn(); // Commencement de la réception
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}

void loop() {
Serial.print("Etat : ");
Serial.println(etat);

  switch (etat) {
    case 0:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
        if (valeur == 0xfb9 || valeur == 0x40bf50af) {
          etat = 1;
          digitalWrite(LED3, HIGH);
          chrono1 = millis();
        } else
        if (valeur == 0x40bf906f || valeur == 0x7ba) {
          etat = 2;
          digitalWrite(LED4, HIGH);
          chrono2 = millis();
        } else
        if (valeur == 0x40bf00ff) etat = 3;
      } else Serial.println ("Touche non reconnue");
      break;
    case 1:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
        if (valeur == 0x40bf00ff) etat = 3;
      }
      else if (millis() - chrono1 > dureeEtat1) {
        digitalWrite(LED3, LOW); // Les LED s'éteignent
        digitalWrite(LED4, LOW);
        etat = 0;
      }
      break;
    case 2:
      if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
      {
        unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
        if (valeur == 0x40bf00ff) etat = 3;
      }
      else if (millis() - chrono2 > dureeEtat2) {
        digitalWrite(LED3, LOW); // Les LED s'éteignent
        digitalWrite(LED4, LOW);
        etat = 0;
      }
      break;
    case 3: // Interruption des commandes 1 et 2 uniquement
Serial.println("Extinection LEDs ");
      digitalWrite(LED3, LOW); // Les LED s'éteignent
      digitalWrite(LED4, LOW);
      etat = 0;
      break;
    default:
      Serial.println("Probleme : etat non reconnu.");
      etat = 0;
      break;
  }
  RCEP.resume(); // Réception de la prochaine valeur
}