Recepteur IR

Bonjour, je suis bloqué actuellement pour maintenir une led allumer tant qu'on appuie sur le bouton (désiré) de la télécommande,

void recev ()
{
 if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    Serial.println(recus);
    switch(results.value) {
    case PLAY:
      digitalWrite(S_PLAY, HIGH);
      delay(50);
      digitalWrite(S_PLAY, LOW);
      break;
    case STOP:
      digitalWrite(S_STOP, HIGH);
      delay(50);
      digitalWrite(S_STOP, LOW);
      break;
    case NEXT:
      digitalWrite(S_NEXT, HIGH);
      delay(1);
      digitalWrite(S_NEXT, LOW);
      delay(1);
      break;
    case PREVIEW:
      digitalWrite(S_PREVIEW, HIGH);
      delay(50);
      digitalWrite(S_PREVIEW, LOW);
      delay(100);
      break;
    case VOL_PLUS:
      Vol_Plus = false;
      break;
    case VOL_MOIN:
      Vol_MOIN = false;
      break;
    case EJECT:
      digitalWrite(S_STOP, HIGH);
      delay(1000);
      digitalWrite(S_STOP, LOW);
      delay(100);
      break;
    case AUTRE1:
      digitalWrite(S_AUTRE1, HIGH);
      delay(50);
      digitalWrite(S_AUTRE1, LOW);
      delay(100);
      break;
    case AUTRE2:
      digitalWrite(S_AUTRE2, HIGH);
      delay(50);
      digitalWrite(S_AUTRE2, LOW);
      delay(100);
      break;
    case PAUSE:
      digitalWrite(S_PAUSE, HIGH);
      delay(50);
      digitalWrite(S_PAUSE, LOW);
      delay(100);
      break;
    case SELECTION:
      digitalWrite(S_SELECTION, HIGH);
      delay(50);
      digitalWrite(S_SELECTION, LOW);
      delay(100);
      break;

    }
    
    irrecv.resume(); // Receive the next value
  }
}

actuellement j'appuie et la sortie s'allume puis s’éteint en fonction du delay(), si je reste appuyer la led clignote mais je veux absolument qu'elle reste allumé tant que j'appuie ! merci pour votre aide !

Les télécommandes n'envoient pas le code en continu. mais à un rythme de quelques Hertz. Il faut donc que ton programme allume la sortie à l'apparition du code et qu'il l'éteigne si ce même code ne réapparaît pas au bout d'un certain temps. On ne voit qu'une portion de ton code, mais je dirais qu'il va falloir casser pas mal de chose pour obtenir le fonctionnement désiré.

merci pour la réponse, voici le code complet mais un peu bordel !!!

#include <IRremote.h>


//____________________________________DEFINITION DES ENTREES DE LA TELECOMMANDES____________________________________________________
#define NEXT       0xE144E300
#define PREVIEW    0xE1441300
#define PLAY       0xE144CE00
#define PAUSE      0xE1442F00
#define STOP       0xE144EF00
#define SELECTION  0x807D58A7

#define AUTRE1     0xE1440700
#define AUTRE2     0xE1444700
#define VOL_PLUS   0xE1448F00
#define VOL_MOIN   0xE1444F00
#define EJECT      0xE144F300

//____________________________________DEFINITION DES SORTIES MICROCONTROLEURS ATMEGA 328______________________________________________
int S_NEXT         = 2;
int S_PREVIEW      = 3;
int S_PLAY         = 4;
int S_PAUSE        = 5;
int S_STOP         = 6;
int S_SELECTION    = 7;
int S_AUTRE1       = 8;
int S_AUTRE2       = 9;
int S_VOL_PLUS    = 10;
int S_VOL_MOIN    = 11;

//____________________________________________________________________________________________________________________________________
int RECV_PIN      = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(S_NEXT, OUTPUT);
  pinMode(S_PREVIEW, OUTPUT);
  pinMode(S_PLAY, OUTPUT);
  pinMode(S_PAUSE, OUTPUT);
  pinMode(S_STOP, OUTPUT);
  pinMode(S_SELECTION, OUTPUT);
  pinMode(S_AUTRE1, OUTPUT);
  pinMode(S_AUTRE2, OUTPUT);
  pinMode(S_VOL_PLUS, OUTPUT);
  pinMode(S_VOL_MOIN, OUTPUT);
}

void loop()
{
  recev ();

  
}

void recev ()
{
 while (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch(results.value) {
    case PLAY:
      digitalWrite(S_PLAY, HIGH);
      delay(50);
      digitalWrite(S_PLAY, LOW);
      break;
    case STOP:
      digitalWrite(S_STOP, HIGH);
      delay(50);
      digitalWrite(S_STOP, LOW);
      break;
    case NEXT:
      digitalWrite(S_NEXT, HIGH);
      delay(50);
      digitalWrite(S_NEXT, LOW);
      delay(100);
      break;
    case PREVIEW:
      digitalWrite(S_PREVIEW, HIGH);
      delay(50);
      digitalWrite(S_PREVIEW, LOW);
      delay(100);
      break;
    case VOL_PLUS:
      Vol_Plus = false;
      break;
    case VOL_MOIN:
      Vol_MOIN = false;
      break;
    case EJECT:
      digitalWrite(S_STOP, HIGH);
      delay(1000);
      digitalWrite(S_STOP, LOW);
      delay(100);
      break;
    case AUTRE1:
      digitalWrite(S_AUTRE1, HIGH);
      delay(50);
      digitalWrite(S_AUTRE1, LOW);
      delay(100);
      break;
    case AUTRE2:
      digitalWrite(S_AUTRE2, HIGH);
      delay(50);
      digitalWrite(S_AUTRE2, LOW);
      delay(100);
      break;
    case PAUSE:
      digitalWrite(S_PAUSE, HIGH);
      delay(50);
      digitalWrite(S_PAUSE, LOW);
      delay(100);
      break;
    case SELECTION:
      digitalWrite(S_SELECTION, HIGH);
      delay(50);
      digitalWrite(S_SELECTION, LOW);
      delay(100);
      break;

    }
    irrecv.resume(); // Receive the next value
  }
}

bonjour, je dirai que c'est normal puisque tu mets en HIGH puis delay(50) puis LOW pour chaque case. pourquoi vouloir maintenir le bouton? tu pourrais faire en sorte que tant qu'un autre bouton n'est pas enfoncé, l'état HIGH est conservé sur le bouton appuyé en premier. en plus ca évite de décharger la pile de la télécommande et économise ses contacts.

autre solution changer l'état par une seconde pression sur le même bouton.

pour tout vous dire j'utilise deux sorties de l'arduino pour faire varier + ou - le son avec un pont en H , j'ai un potentiomètre motorisé de type ALPS, il s'alimente en + 5V, donc quand je fait l'appuie sur le bouton "plus" ou "moin" il faut que j'ai du +5V linéaire et non de 0 à +5V en variation.

et c'est la que je bloque ! sinon pour les autres commandes pas de problème !

merci pour votre aide !

Pourquoi ne pas utiliser un potentiomètre numérique dans ce cas?
En plus tu pourras ajouter une fonction “mute” facilement.

je ne veux pas de potentiomètres numériques, donc ce que je demande est donc pas possible ??????? merci tous

Si c'est possible, les 2 premières réponses que tu as eu te proposent des manières pour résoudre ton problème.

Bonjour, alors j'ai trouver plus ou moins une solution mais au bout de 550 ms j'ai un petit passage à 0v et de nouveau 5v, avez vous une idée pour compléter ? :%

void loop()
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value, HEX);
    if (results.value == NEXT ) 
    {
      digitalWrite(S_NEXT, HIGH);
    }
    irrecv.resume();
  }
  if(!irrecv.decode(&results) && (millis() - temps) >550)
  {
    digitalWrite(S_NEXT, LOW);
    temps = millis(); //on stocke la nouvelle heure
  }
}

Il faut adapter ce 550 à la fréquence de répétition du code envoyé par ta télécommande.
Si tu as un moyen de mesure, le plus simple serait de mesurer la récurrence des envois de la télécommande.
Sinon, tu l’augmentes un peu la valeur et tu regardes s’il n’y a plus de temps mort.