aide pour gestion d'une telecommande

Bonjour

Je débute avec la programmation.

je souhaite réaliser un controleur de volume audio a base du chip TI PGA2311. J'ai trouvé pas mal de doc sur internet, et je suis proche du but. Le résultat auquel j'arrive n'est pourtant pas exactement celui de mes rêves, et je n'arrive pas à le régler:

La commande du reglage du niveau se fait soit par 2 boutons poussoirs (un pour augmenter le volime, l'autre pour le baisser), mais également par une télécommande infra rouge.
J'ai récupéré les codes d'une telco universelle pour télé;

Pour l'instant, je teste mon application avec une diode: le niveau de luminosité reflète le futur volume sonore.

Avec les boutons poussoirs, tout se passe bien, j'appui unefois dessus, le volume augmente de 1, je reste appuyé dessus, le volumee s'incrémente rapidement.

Avec la telco, le volume augmente de 1 lorsque j'appui sur la commande (ou baisse de 1), mais je n'arrive pas à faire incrémenter le volume en restant appuyé dessus. Je dois à chaque fois ré appuyé pour faire varier le volume de 1.

La fonction de gestion de cette telco n'est pas dans la boucle "voidloop()", ce qui explique le phénomène, lmais tous mes essais pour l'intégrer ne fonctionne pas. J'ai testé d'autres methodes trouvés sur le net, sans succès.

Il doit pourtant y avoir une astuce qui m'échappe, pouvez vous me mettre sur la voie?

Merci

Voici le code (sous arduino uno v3)

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

int RECV_PIN = 11;
const int POT = 9;// assignation pin potar
const int BUTTON_UP = 7;//assignation pin bouton incrementation
const int BUTTON_DOWN = 8;//assignation pin bouton decrementation

IRrecv irrecv(RECV_PIN);
decode_results results;

int val_BU = 0;// sauve etat bouton incrementation
int old_val_BU = 0;// sauve etat precedent bouton incrementation
int niveau = 0;// fixe niveau a l'allumage
unsigned long startTime_BU = 0;//depart chronometre bouton incrementation

int val_BD = 0;// sauve etat bouton decrementation
int old_val_BD = 0;// sauve etat precedent bouton decrementation
unsigned long startTime_BD = 0;//depart chronometre bouton decrementation

void setup() {
  
  Serial.begin(9600);
 pinMode(POT,OUTPUT); // fixe pin potar en sortie
 pinMode(BUTTON_UP,INPUT);//fixe pin bouton incrementation en entrée
 pinMode(BUTTON_DOWN,INPUT);//fixe pin bouton decrementation en entrée
 irrecv.enableIRIn(); // Start the receiver
}

void loop(){

  
  if (irrecv.decode(&results)) 
  {
    translateIR();
    irrecv.resume();
  }
  {
  val_BU = digitalRead(BUTTON_UP);// lit et sauve l'entree bouton incrementation
  if((val_BU==HIGH)&&(old_val_BU==LOW))// teste l'entrée
  { 
    niveau++;// si vrai alors incrementation du niveau de 1
    startTime_BU=millis();//départ chronometre bouton incrementation
   
  delay(20);//delai anti rebond
  }
 
if((val_BU==HIGH)&&(old_val_BU==HIGH))//teste si bouton resté enfoncé
{if((millis()-startTime_BU)>1000)//teste durée d'appui
{
niveau++;// si vrai alors incrementation du niveau de 1
delay(100);//delai d'incrementation auto si bouton reste enfoncé
if(niveau>255){
  niveau=255;// atteinte niveau max
  }
  
  }
  }
  old_val_BU=val_BU; //sauve état du bouton incrementation
    analogWrite(POT,niveau);//ecrit valeur du niveau en sorti pin potar
    }
    {// objet identique pour partie decrementation
  val_BD = digitalRead(BUTTON_DOWN);
  if((val_BD==HIGH)&&(old_val_BD==LOW))
  { 
    niveau--;
    startTime_BD=millis();
   
  delay(20);
  }
 
if((val_BD==HIGH)&&(old_val_BD==HIGH))
{if((millis()-startTime_BD)>1000){
niveau--;
delay(100);
if(niveau<0){
  niveau=0;
  }
  
  }
  }
  old_val_BD=val_BD;
  
    analogWrite(POT,niveau);
    }
  }
  void translateIR()
 
  {
    if((results.value)==0xAF54EB1)
   {
  niveau++;
  if(niveau>255){niveau=255;}
  delay(25);
  }
 if((results.value)== 0xAF5CE31)
  {niveau--;
  if(niveau<1) {niveau=0;}
  delay(25);
  }
  Serial.println(niveau);
}[code]

Salut
J'ai un peu joué avec IRremote.
Quand tu appuies sur une touche, tu reçois une fois le code de la télécommande, puis le code 0xFFFFFF tant que tu restes appuyé.
Tu peux regarder cet exemple simple :
http://david.hautbois.free.fr/wordpress/index.php/259-piloter-des-led-a-partir-dune-telecommande-tv

Merci pour cet exemple. Je ne connaissais pas la fonction "boolean", que je vais tester.

J'avais bien noté que la répétition renvoyait le code FFFFFFF' mais je ne suis pas arrivé a le valoriser...

Sinon le reste est très simple, je vais m'en inspirer.

Bonjour

Finalement je m'en suis sorti en modifiant le protocole d'émission de ma télécommande universelle. En utilisant le protocole Philips, une fonction renvoie deux codes en alternance, mais répète le dernier lorsqu'on reste appuyé sur la touche. Celà évite de gérer la fonction "répétition" et son code valable pour toutes les commandes (0xFFFFFFF).
Merci au lien trouvé sur le blog de tahitibob, vers le magazine "Hackable magazine", qui m'a donné la voie !