IR Remote

Bonjour

J’utilise un programme ARDUINO qui fonctionne très bien pour recevoir et décoder le code d'une touche quelconque de la télécommande (SAGEM, protocole NEC).
Pour les valeur des chiffres de 0 à 9 le programme saute vers « routines 0 à 9.
Par contre je ne sais pas écrire mon code Arduino pour recevoir un nombre de n chiffres.

Objectif :

  • intégrer dans mon programme des tests dynamiques des interfaces composant le robot en réponse à un nombre correspondant au numéro du programme à exécuter.
  • envoyer une succession de chiffres pour former un nombre valider par une touche autre que numérique (Touche OK).

Exemple :

  • Nombre 100 à 110 test de la propulsion (Avant, Arrière, Tourne à Gauche, etc..)
  • Nombre 120 à 130 calibration des moteur
  • Nombre 140 à …. Test de différents autres périphériques
  • Etc…

Pour ma part il s'agit de mémoriser successivement les chiffres reçu qui vont former le nombre reçu. En fonction du nombre reçu (ex: 1234 +touche OK), le programme se branche sur un programme de test numéro pTest1234 (dans ce cas.
Pouvez-vous me guider pour cette réalisation.
D'avance merci pour votre aide.
Cordialement

IRremote_Kit_Test_01.ino (3.3 KB)

Bonjour,

Il faut que tu traites key comme un caractère (tu le traites comme un caractère dans loop(), mais tu lui affectes un chifre dans translateIR()
Ca donne ça (par exemple)

/*
   IRremote_Kit_Test_01.ino

 Ce sketch permet de lancer des tests embarqués en réponse
 à un commande (nombre) recu par voie IR 

 Status Sketch :  NOK

 */

/*-----( Import needed libraries )-----*/

#include "IRremote.h"

/*-----( Declare Constants )-----*/
int receiver = A3; // pin 1 of IR receiver to Arduino digital pin A3

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'

/*-----( Declare Variables )-----*/
char key = 0;         //  bouton active
int number = 0;      //  nombre en construction
int cmd = 0;          // cmd = nombre final equivaut au numero de test


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Raw Data + Button Decode Test");
  irrecv.enableIRIn(); // Start the receiver

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    // donnees recus
    Serial.println(results.value, HEX);   // UN Comment to see raw values
    translateIR();
    Serial.print("key : "); Serial.println(key, DEC); Serial.println();  // UN Comment to see raw values
    //
    if (isDigit(key))
    {
      number = number * 10 +(key - '0') ;  // on accumule le nombre
      Serial.print("number : "); Serial.println(number); Serial.println();
    }
    else if (key == 'O')    // validation du nombre
    {
      cmd = number;
      Serial.print("cmd : "); Serial.println(cmd);
      key = 0; number = 0;     // reinitialise le nombre a 0 pour etre pret pour la sequence suivante
    }
    //
    irrecv.resume(); // receive the next value
  }
}
/* --(end main loop )-- */


/*-----( Declare User-written Functions )-----*/



void translateIR() // takes action based on IR code received
{
  switch (results.value)            // describing SAGEM IR codes
  {
    case 0x4036B04F:
      Serial.println(" OK             ");      
      key='O';
      break;

    case 0x403600FF:
      Serial.println(" 0              ");
      key = '0';
      pTest0();
      break;

    case 0x4036807F:
      Serial.println(" 1              ");
      key = '1';
      break;

    case 0x403640BF:
      Serial.println(" 2              ");
      key = '2';
      break;

    case 0x4036C03F:
      Serial.println(" 3              ");
      key = '3';
      break;

    case 0x403620DF:
      Serial.println(" 4              ");
      key = '4';
      break;

    case 0x4036A05F:
      Serial.println(" 5              ");
      key = '5';
      break;

    case 0x4036609F:
      Serial.println(" 6              ");
      key = '6';
      break;

    case 0x4036E01F:
      Serial.println(" 7              ");
      key = '7';
      break;

    case 0x403610EF:
      Serial.println(" 8              ");
      key = '8';
      break;

    case 0x4036906F:
      Serial.println(" 9              ");
      key = '9';
      pTest9();
      break;

    default:
      Serial.println(" other button   ");
      key='N';              // touche inconnue
      break;

  }

  delay(500);

} //END translateIR


/* --- programmes de Test --- */ 
void pTest0()
{
  Serial.println("Programme de Test num 0  : ");
  delay(2000);
}

void pTest9()
{
  Serial.println("Programme de Test num 9");
  delay(4000);
}

void pTest10()
{
  Serial.println("Programme de Test num 10");
  delay(5000);
}
/* ( THE END ) */

Le plus simple est de memoriser dans un tableau chaque chiffre correspondant au code de touche reçu et le code de la touche OK
genre si tu recois 0xA01 ou C01(en protocole IR RC5) tu met le caractere "1" dans ton tableau etc
Ensuite tu concatene tout ca en une seule chaine "1234" le dernier element du tableau etant le code de la touche OK
Apres ca tu peux faire un

switch(code)

case "1234" {
... ton code ...
}
case "5678" {
... ton code ...
}

etc