Alguém me ajuda com essa programação

Estou tentando desenvolver essa programação abaixo e estou usando um modulo controle remoto que envia código hexadecimal, meu problema é o seguinte:

Na parte do while (armazenavalor == 0xFF42BD && armazenavalor != 0xFF4AB5)
que fica mudando os leds em um loop o programa fica agarrado, eu criei um Statement if (armazenavalor == 0xFF4AB5) para poder desligar todos os leds e cancelar o loop do While mas acontece que quando a variável armazenavalor é igual a 0xFF42BD logicamente o arduino entra em loop ligando e desligando os leds na ordem porem quando eu envio o valor 0xFF4AB5 para tentar parar o loop e desligar os leds que estiverem acessos simplesmente não funciona ele continua em loop.

Alguém pode me ajudar?

Grato desde já

Código completo:

#include <IRremote.h>
int RECV_PIN = 11;
float armazenavalor;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()

{
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(10, HIGH); // if no remote command received keep relay state off
digitalWrite(9, HIGH); // if no remote command received keep relay state off
digitalWrite(8, HIGH); // if no remote command received keep relay state off
digitalWrite(7, HIGH); // if no remote command received keep relay state off
Serial.begin(9600);
irrecv.enableIRIn(); // Intitialize IR receiver
}

void loop()

{

if (irrecv.decode(&results))
{
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
armazenavalor = (results.value);

if (armazenavalor == 0xFF6897) //Enable PIN 10
{
delay(500);
digitalWrite(10, LOW); //Enable PIN 10
}
if (armazenavalor == 0xFF9867) //Enable PIN 9
{
delay(500);
digitalWrite(9, LOW); //Enable PIN 9
}
if (armazenavalor == 0xFFB04F) //Enable PIN 8
{
delay(500);
digitalWrite(8, LOW); //Enable PIN 8
}
if (armazenavalor == 0xFF629D) //Enable PIN 7 (PUMP)
{
delay(500);
digitalWrite(7, LOW); //Enable PIN 7 (PUMP)
}

if (armazenavalor == 0xFFA857) //Enable PIN 7 (PUMP)
{
delay(500);
digitalWrite(7, HIGH); //Enable PIN 7 (PUMP)
}

if (armazenavalor == 0xFF4AB5) //shutdown all leds
{
delay(500);
digitalWrite(10, HIGH); // Desable PIN 10
digitalWrite(9, HIGH); // Desable PIN 9
digitalWrite(8, HIGH); // Desable PIN 8
}

while (armazenavalor == 0xFF42BD && armazenavalor != 0xFF4AB5) //random led colours

{
digitalWrite(10, LOW); // Enable PIN 10
delay(2000);
digitalWrite(10, HIGH); // Desable PIN 10
digitalWrite(9, LOW); // Enable PIN 9
delay(2000);
digitalWrite(9, HIGH); // Desable PIN 9
digitalWrite(8, LOW); // Enable PIN 8
delay(2000);
digitalWrite(8, HIGH); // Desable PIN 8
}

irrecv.resume(); //Read next value
}
}

A tua variável armazenavalor não deve ser float... mas sim unsigned long.

Tens demasiados delays no teu código... enquanto o processador está a correr o delay, não está a ver se alguém está a mandar comandos.

Logo, tira todos os delays do código e vais ver que isso funciona normalmente.

Se quiseres fazer temporizações, usa a função millis();

Eu fiz desta forma mas não esta funcionando, quando envio o valor 0xFF42BD os leds nao acendem.

#include <IRremote.h>
int RECV_PIN = 11;
unsigned long armazenavalor;
unsigned long previousMillis = 0;
const long interval = 2000;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()

{
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(10, HIGH); // if no remote command received keep relay state off
digitalWrite(9, HIGH); // if no remote command received keep relay state off
digitalWrite(8, HIGH); // if no remote command received keep relay state off
digitalWrite(7, HIGH); // if no remote command received keep relay state off
Serial.begin(9600);
irrecv.enableIRIn(); // Intitialize IR receiver
}

void loop()

{
unsigned long currentMillis = millis();

if (irrecv.decode(&results))
{
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
armazenavalor = (results.value);

if (armazenavalor == 0xFF6897) //Enable PIN 10
{
delay(500);
digitalWrite(10, LOW); //Enable PIN 10
}
if (armazenavalor == 0xFF9867) //Enable PIN 9
{
delay(500);
digitalWrite(9, LOW); //Enable PIN 9
}
if (armazenavalor == 0xFFB04F) //Enable PIN 8
{
delay(500);
digitalWrite(8, LOW); //Enable PIN 8
}
if (armazenavalor == 0xFF629D) //Enable PIN 7 (PUMP)
{
delay(500);
digitalWrite(7, LOW); //Enable PIN 7 (PUMP)
}

if (armazenavalor == 0xFFA857) //Enable PIN 7 (PUMP)
{
delay(500);
digitalWrite(7, HIGH); //Enable PIN 7 (PUMP)
}

if (armazenavalor == 0xFF4AB5) //shutdown all leds
{
delay(500);
digitalWrite(10, HIGH); // Desable PIN 10
digitalWrite(9, HIGH); // Desable PIN 9
digitalWrite(8, HIGH); // Desable PIN 8
}

if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;

if (armazenavalor == 0xFF42BD && armazenavalor != 0xFF4AB5) //random led colours

{
digitalWrite(10, LOW); // Enable PIN 10
//delay(2000);
digitalWrite(10, HIGH); // Desable PIN 10
digitalWrite(9, LOW); // Enable PIN 9
//delay(2000);
digitalWrite(9, HIGH); // Desable PIN 9
digitalWrite(8, LOW); // Enable PIN 8
// delay(2000);
digitalWrite(8, HIGH); // Desable PIN 8
}
}

irrecv.resume(); //Read next value
}
}

O código está errado...

O millis serve para substituir cada um dos delays. Não foi isso que fizeste.
Olha para o exemplo, compreende o que faz e depois adapta. Não copies à espera que funcione miraculosamente

Eu comentei os delays para que deixassem de ter efeito //delay(2000); mas não funciona.

Lê de novo o meu comentário... Ou olha para aqui:

    if (currentMillis - previousMillis >= interval) //tu adicionaste isto....
    {
     previousMillis = currentMillis; //e adicionaste isto.... 
//MAS NÃO SABES O QUE ISTO ESTÁ A FAZER!!!!!!!
    
    if (armazenavalor == 0xFF42BD && armazenavalor != 0xFF4AB5) //random led colours
     
    {  
      digitalWrite(10, LOW); // Enable PIN 10
      //delay(2000);     
      digitalWrite(10, HIGH); // Desable PIN 10
      digitalWrite(9, LOW); // Enable PIN 9
      //delay(2000);
      digitalWrite(9, HIGH); // Desable PIN 9
      digitalWrite(8, LOW); // Enable PIN 8
     // delay(2000);
      digitalWrite(8, HIGH); // Desable PIN 8
    }
    }
unsigned char pisca = 0; 
unsigned char led = 10, stat = 0;
if (armazenavalor == 0xFF42BD && armazenavalor != 0xFF4AB5){ //random led colours
    {
     pisca =1; 
     }
else 
    {
     pisca = 0;
     led = 10;
     }

if (pisca == 1) {
     if (stat == 0 && (millis() - previousMillis() >= 2000)){    
        digitalWrite(led, LOW); // Enable PIN 10
        stat = 1;
        previousMillis = millis();
     }  
     if(stat == 1 && (millis - previousMillis() >= 2000) {
      stat = 0;
      digitalWrite(led, HIGH); // Desable PIN 10
      digitalWrite(led--, LOW); // Enable PIN 9
      previousMillis() = millis();
    }
    if (led == 7) led = 10;
    }//if pisca

Algo assim deve funcionar... a esta hora da noite, sinceramente duvido que funcione à primeira, mas anda perto.