Switch case, -réduire le nombre

Bonjour,
Je viens de réaliser un petit programme pour activer une alarme avec un télécommande IR de 21 boutons. Une fois que j'ai récupéré les valeurs je les ais toutes mises dans un switch (en décimal, si vous avez une bonne idée pour la mettre en HEXA je suis preneur).

J'en ais seulement fait 22 donc ça allais mais c'était légèrement long.

J'imagine avec une plus grosse télécommande ce serais infernal, il doit y avoir une solution plus simple !:slight_smile: Pouvez vous m'aidez ?

Soyez indulgent je commence avec Arduino depuis 1 semaine et je suis vraiment pas une flèche en C++

Tous les case ne sont pas utilisés, et je pourrais les supprimer mais je risque de compléter avec certaines fonctionnalités

Ci-dessous le code

#include <IRremote.h>
#include <IRremoteInt.h>

#define Receivepin 11
#define buzzer 4
#define intrus 5

int alarm=LOW;
int password=LOW;
IRrecv irdata(Receivepin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irdata.enableIRIn(); // Start the receiver
  pinMode(buzzer, OUTPUT);
  pinMode(intrus, INPUT);
}

void loop()
{
  alarmfunc();
  if (irdata.decode(&results))
    {
      remote();
      irdata.resume(); // Receive the next value
    }
    
}

void remote(){
  switch (results.value) {
    case 4294967295: // For the hexa FFFFFF value
    Serial.println(" ");
    break;
    case 16753245:
    Serial.println("CH-");
    break;
    case 16736925:
    Serial.println("CH");
    break;
    case 16769565:
    Serial.println("CH+");
    break;
    case 16720605:
    Serial.println("Prev");
    break;
    case 16712445:
    Serial.println("Next");
    break;
    case 16761405:
    Serial.println("Play/Pause");
    break;
    case 16769055:
    Serial.println("Vol-");
    break;
    case 16754775:
    Serial.println("Vol+");
    break;
    case 16748655 :
    Serial.println("Eq");
    break;
    case 16738455:
    Serial.println("0");
    break; 
    case 16750695:
    Serial.println("100+");
    break;
    case 16756815:
    Serial.println("200+");
    break;
    case 16724175:
    Serial.println("1");
    //alarm=HIGH;
    password=LOW;
    alarmini();
    break;
    case 16718055:
    Serial.println("2");
    password=HIGH;
    //Serial.println("TESTlow");
    alarmini();
    break;
    case 16743045:
    Serial.println("3");
    digitalWrite (buzzer,HIGH);
    break;
    case 16716015:
    Serial.println("4");
    digitalWrite (buzzer,LOW);
    break;
    case 16726215:
    Serial.println("5");
    break;
    case 16734885 :
    Serial.println("6");
    break;
    case 16728765:
    Serial.println("7");
    break;
    case 16730805:
    Serial.println("8");
    break;
    case 16732845 :
    Serial.println("9");
    break;
    default:
    Serial.println("ERROR");
    break;
  }
}

void alarmfunc(void){
  if (alarm==LOW){
    if ((digitalRead(intrus)==LOW)){
      digitalWrite(buzzer,LOW);
      //Serial.println("SAFE");
    }
  }
  if (alarm==HIGH){
    if ((digitalRead(intrus)==HIGH)){
      digitalWrite(buzzer,HIGH);
      Serial.println("ALERT");
    }
  }
}

void alarmini(void){
    if (password==LOW){
    if (digitalRead (intrus)==LOW){
      Serial.println("Alarm ON");
      alarm=HIGH;
    }
    if(digitalRead(intrus)==HIGH) {
    Serial.println("Error there is someone inside we can't initialize the alarm");
    alarm=LOW;
  }
  }
  if (password==HIGH){
    Serial.println("Alarm OFF");
    digitalWrite (buzzer, LOW);
    alarm=LOW;
    
  }
  
}

Je me permet de faire remonter le topic si il y a un moyen d'avoir un peu d'aide :smiley:

Salut

Une petite réponse, meme si je ne vais pas t'aider completement.

Déjà, pour mettre des valeurs en hexa dans ton case, il suffit de les préfixer de 0x :
Exemple :

switch (results.value) {
    case 0xFFFFFFFF: // For the hexa FFFFFF value
    Serial.println(" ");
    break;
    case 0xFFA25D: // Correspond à 16753245 en décimal 
    Serial.println("CH-");
    break;
....

Ensuite, je ne comprend pas vraiment ta question, qu'est ce qui est "long" : l'écriture de ton switch, ou l'execution de ton programme ?

Bonjour,

Dans ton programme tu as deux fonctions faites lors de la réception des touches:

  • affichage
  • action sur certaines touches
    Pour l'affichage, comme c'est toujours la même chose pour toutes les touches, tu peux utiliser des tableau et les parcourir pour afficher le texte correspondant
    Pour les actions, comme elles sont diverses, un switch est ce qui convient
const unsigned long codes[]={4294967295,16753245,16736925}; // ... compléter avec toutes les touches
const char * txt[]={" ","CH-","CH","CH+"};                   // ... à complèter
const int nbTouches=sizeof codes/sizeof codes[0];

void remote(){
  // affichage de la touche
  for (int i=0; i<nbTouches; i++)
  {
    if (codes[i]==results.value)
    {
      Serial.println(txt[i]);
      break;
    }
  }
      
  switch (results.value) {
    case 16724175:  // "1"
    //alarm=HIGH;
    password=LOW;
    alarmini();
    break;
    case 16718055:  // 2
    password=HIGH;
    //Serial.println("TESTlow");
    alarmini();
    break;
    case 16743045: // 3
    digitalWrite (buzzer,HIGH);
    break;
    case 16716015:  // 4
    digitalWrite (buzzer,LOW);
    break;
  }
}

Merci ! , vous m'avez bien éclairé tous les deux !:smiley: