Instructions switch / case avec des données hexadécimales

Afin de faire fonctionner un séquenceur de lumières à led, le récepteur IR renvoie des données correspondantes aux touches de la télécommande. Cette partie fonctionne à présent.
J'utilise les instructions "switch / Led" avec les données hexadécimales.
Cette ligne de code : " unsigned long data = IrReceiver.decodedIRData;"
crée le défaut suivant " Compilation error : cannot convert 'IRData' to 'long unsigned int ' in initialization".
Je ne comprends pas comment faire la conversion .
Voici le programme

/*Déclaration, initialisation des variables et instanciation des objets */
#include <IRremote.h>
#define IR_RECEIVE_PIN 2        //Broche numérique liée au récepteur IR

int pinray[] = { 10, 11, 12 };  //Tableau des broches LED
int intervalle = 1000;          // Intervalle de temps (1 seconde)
unsigned long prev;             // Variable de temps
int k = HIGH;                   //variable pour le marche-arrêt du séquenceur
int i = 0;
int j = 0;
int vitesse=0;
unsigned long data=0;
 

/*2-Fonction setup*/

void setup() {
  
  for (int i = 0; i < 4; i++)
    Serial.print(i);

  pinMode(pinray[i], OUTPUT);  //Programmation des broches numériques des LED en sorties
  prev = millis();             // Mémoriser le compteur de temps actuel
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);//Demarrage processus de reception
}
void loop() {
 
  if (k == LOW) {                          //si k==LOW le séquenceur démarre
    if ((millis() - prev) > intervalle) {  //Ecoulement du retard ’intervalle’
      prev = millis();
      /*3-Programme permettant d'allumer et d'éteindre les LED du séquenceur*/
      switch (j) {
        case 0:
          digitalWrite(pinray[1], LOW);
          digitalWrite(pinray[0], HIGH);
          break;
        case 1:
          digitalWrite(pinray[0], LOW);
          digitalWrite(pinray[1], HIGH);
          break;
        case 2:
          digitalWrite(pinray[1], LOW);
          digitalWrite(pinray[2], HIGH);
          break;
        case 3:
          digitalWrite(pinray[2], LOW);
          digitalWrite(pinray[1], HIGH);
          /*Serial.print(pinray[1]);*/
      }
      j++;
      if (j > 3) { j = 0; }
    }
  }
  /*4-Programme permettant de démarrer ou d'arrêter le séquenceur si la touche ">||" est
appuyée */

  if (IrReceiver.decode()) {  // Si une touche de la télécommande est appuyée
  
 unsigned long data = IrReceiver.decodedIRData;

    switch (data)  {
      case 0xBF40FF00:  // Si la touche ">||" est appuyée
        k = !k;
        
        
        if (k == HIGH)  //Eteindre toutes les LED avant d'arrêter le séquenceur
          for (int i = 0; i < 4; i++)
            digitalWrite(pinray[i], LOW);
        break;
      case 0xBC43FF00:  // Si la touche ">>|" est appuyée
        /*5-Programme permettant de gérer l'accélération de la vitesse*/
        vitesse++;
        if (vitesse == 1)
          intervalle = 500;
        else if (vitesse == 2)
          intervalle = 250;
        else
          intervalle = 100;
        if (vitesse > 3)
          vitesse = 3;
        break;
      case 0xBB44FF00:  // Si la touche "<<" est appuyée
        /*6-Programme permettant de gérer le ralentissement de la vitesse*/
        vitesse--;
        if (vitesse == 3)
          intervalle = 100;
        else if (vitesse == 2)
          intervalle = 250;
        else if (vitesse == 1)
          intervalle = 500;
        else
          intervalle = 1000;
        if (vitesse < 0)
          vitesse = 0;
        break;
        
    }
    IrReceiver.resume();  //Réinitialiser le processus de réception
    
  }
  }
 

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

quand vous écrivez IrReceiver.decodedIRData vous accédez au membre decodedIRData de l'instance IrReceiver

IrReceiver est déclaré ici

c'est donc une instance de la classe IRrecv (déclarée ici) et decodedIRData est bien une variable de cette instance déclarée ainsi

son type est donc IRData qui est défini comme cela

c'est donc une structure

quand vous essayez de faire unsigned long data = IrReceiver.decodedIRData vous essayez de mettre dans un entier toute la structure ➜ ça ne fait aucun sens. Il faudrait accéder à un des champs de la structure, par exemple faire le switch() sur IrReceiver.decodedIRData.command

(attention si vous copiez d'anciens code, la bibliothèque a évolué sans doute depuis - regardez les nouveaux exemples)

Un grand merci pour m'avoir aidé. J'ai du choisir cet instruction : " unsigned long data = IrReceiver.decodedIRData.decodedRawData" du fait des 32bits. Le séquenceur fonctionne parfaitement bien. On trouve beaucoup d'informations dans les exemples . C'est très dense. Je ne comprends pas pour l'instant à quoi servent toutes ces informations, c'est vraiment pour les initiés. Merci encore.

IRRawDataType Est effectivement un uint32_t - mais vous pourriez vous contenter pour le switch de command

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.