IRremote и обработка удержания кнопки пульта ДУ

По многочисленным просьбам, пример как изменять яркость светодиодов удержанием кнопки на пульте дистанционного управления

 

код из видео


#include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote

#define RECV_PIN 11 // IR приемник
#define OUT1 9// выхода на мосфеты
#define OUT2 10
 

#define POWER_KEY 0x40BF30CF // коды пульта ДУ
#define KEY1 0x40BF7887 // v-
#define KEY2 0x40BFF807 // v+
#define KEY3 0xC03FC03F
#define KEY4 0xC03F40BF

byte analogData1, analogData2 = 0; // значения аналогово выхода
uint32_t val; 

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn();  
//Serial.begin(9600);
}


void loop() {
  if (irrecv.decode(&results)) { // если пришел пакет  
    if (results.value != 0xFFFFFFFF){ // и этот пакет не FF
      val = results.value; // сохраняем правельный пакет в переменную     
    }                 // если пришел FF, соответственно пропускаем.
    
    /// сверяем значение из переменной val.. если пришла команда повтора (пакет с FF)
    /// в переменной останется прошлый, правельный, пакет и код выполнится повторно. 
    if (val == KEY1){      
       if (analogData1 != 0)analogData1--; // если шим не равно 0 отнимаем 1 
       analogWrite(OUT1, analogData1);    // устанавливаем значение в выход     
    }    
     if (val == KEY2){ // и это вторая кнопка     
       if (analogData1 < 255) analogData1++; // если шим меньше 255 прибовляем 1 
       analogWrite(OUT1, analogData1);  // устанавливаем значение 
    }
 
    if (val == KEY4){      
       if (analogData2 != 0)analogData2--;  
       analogWrite(OUT2, analogData2);      
    }    
     if (val == KEY3){      
       if (analogData2 < 255) analogData2++;  
       analogWrite(OUT2, analogData2);  
    }
      
     ///
    if (results.value == POWER_KEY) {  
      if (analogData1 != 0 && analogData2 != 0){ // если ШИМ неравно 0
        analogWrite(OUT1, 0); // выключаем
        analogWrite(OUT2, 0);
        analogData1 = 0;
        analogData2 = 0;
      }
      else {
        analogWrite(OUT1, 255); // включаем
        analogWrite(OUT2, 255); 
        analogData1 = 255;
        analogData2 = 255;
      }          
    }  
        
/*Serial.println(val, HEX); //// ТЕСТЫ!
Serial.println(results.value, HEX); 
Serial.println(analogData1); 
Serial.println(analogData2);
Serial.println();
*/  
  irrecv.resume(); 
  }
}