Controle IR - Botão pressionado - Como fazer?

Fala galera! tudo bem?

Veja se alguém ja se deparou com esse problema. Não consegui uma solução...

Estou utilizando a biblioteca IRremote para recebimento de sinal IR vindo do controle da televisão e do aparelho de DVD.

Não estou conseguindo utilizar uma função para botão do controle remoto pressionado.

Quando mantenho o botão pressionado do controle remoto, o primeiro envio é de acordo com o seu valor HEX, mas a partir disso, enquanto se mantém o botão pressionado, o valor se altera continuamente para 0xFFFFFFFF

Por exemplo, na saída serial:

20DF40BF - HEX do botão
FFFFFFFF - Enquanto se mantem pressionado...
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
...

Preciso programar para, quando, se mantém o botão pressionado, uma variável é somada até se soltar esse botão, igual funciona em uma televisão, quando aumentamos o volume mantendo o botão pressionado, a barra sobe até soltarmos.

Da forma que está, posso até tratar o valor 0xFFFFFFFF, mas estou com dificuldades para fazer o software entender quando se solta o botão...

Imaginei que um laço while com o valor HEX ia funcionar, mas foi tudo por agua abaixo!

Alguém teria uma sugestão?

Testei vários controles que tenho, todos tem esse comportamento quando se mantém o botão pressionado.

Se essa biblioteca se comporta assim, ou é uma questão dos mados que mandam aquele código pressionando e segurando a mesma tecla, não sei de quem é a culpa, mas o tratamento é fácil. por exemplo:

if (dado_recebidos == 20DF40BF) {
    contador ++;
    while (dado_recebidos == FFFFFFFF) {
      contador ++;
      // se estivermos aumentando o brilho de um led, por exemplo: 
      analogWrite (led,contador);
    }
  }

Acho que isso resolve o problema.
Saudações

Esse comportamento é absolutamente normal é o código de repetição da maior parte de comandos IR.
Uma forma de fazer isto é por exemplo guardar numa variável tipo "lastCode" esta variável apenas é atualizada quando a leitura atual é diferente da leitura anterior guardada em lastCode e quando a leitura atual é diferente de 0xFFFFFFFF, se a leitura atual for igual a 0xFFFFFFFF o código deve usar o valor guardado em lastCode. Desta forma não interessa quantas vezes seja repetido ele nunca vai perder o comando que pretende repetir até o botão premido ser diferente!

Tudo bom?

Engraçado, que esse while para verificação do botão apertado, não funciona.

Quando uso o while na biblioteca, ele fica preso no laço while, mesmo apertando uma única vez.

O seu código faz todo sentido, obrigado. Vou tentar alguma coisa e se tiver sucesso posto.

Entendi... o 0xFFFFFFFF notei ser comum para todos controles, mas confesso que fiquei com duvida, se é um erro da biblioteca.

Além de implementar o que você disse, preciso ler o primeiro HEX para diferenciar o botão, pois todos no final acabam enviando 0xFFFFFFFF..

Vou tentar implementa algo, obrigado

Neste caso não vejo a funcionar porque dado_recebidos não está a editar para eventualmente deixar de ser verdade. While não é uma boa solução neste caso.

Sim precisa á mesma de ler os HEX sim. Mas neste caso nunca guarda FFFFFFFF, quando for esse o resultado descarta e executa como sendo o que já está guardado na variável lastCode.

Algo tipo:

if(leituraActual == 0xFFFFFFFFF){
   leituraActual = lastCode;
}
else
lastCode = leituraActual

Pensei em travar uma variavel, de acordo com o HEX. Por exemplo:

if(leituraActual == 0xHEX_DA_TECLA_A){
    teclaA == 1;
}

if(leituraActual == 0xFFFFFFFFF && teclaA == 1){
   leituraActual = lastCode;
}
else
lastCode = leituraActual
teclaA = 0;

Algo desse tipo...

E usar uma variável por tecla? Porque não utilizar um switch case onde seria um case por cada tecla que possa ser premida?

Perfeito! Vou tentar algo, funcionando, posto o codigo!

Obrigado,