Réception RC5 par interruption ultra concise

La librairie IRremote est trop grosse pour votre chip ? Voici une réception IR par interruption avec un code minuscule (et entièrement en Arduino...).

Il ne decode que le RC5 12 bits (code 556 pour les télécommandes programmables).

Ca tourne parfait même sur un ATtiny25 à 1 MHz.

unsigned long IRlastH;
unsigned long IRlastL;
byte IRirq;
boolean IRstartH;
boolean IRstartL;
boolean IRok;
boolean IRstate[26];
byte IRcurrentBit;

void interruptIR_FALLING()
{
  IRlastH = micros();
  detachInterrupt(IRirq);

  if (IRstartH)
  {
    if ((IRlastH - IRlastL) > 1200)
    {
      IRstate[IRcurrentBit++] = false;
    }
    IRstate[IRcurrentBit++] = false;
  }
  else
  {
    IRstartH = ((IRlastH - IRlastL) > 30000);
  }

  if (IRcurrentBit < 26)
  {
    attachInterrupt(IRirq, interruptIR_RISING, RISING);
  }
  else
  {
    IRok = true;
  }
}

void interruptIR_RISING()
{
  IRlastL = micros();
  detachInterrupt(IRirq);

  if (IRstartL)
  {
    if ((IRlastL - IRlastH) > 1200)
    {
      IRstate[IRcurrentBit++] = true;  
    }
    IRstate[IRcurrentBit++] = true;
  }
  IRstartL = IRstartH;
  
  if (IRcurrentBit < 26)
  {
    attachInterrupt(IRirq, interruptIR_FALLING, FALLING);
  }
  else
  {
    IRok = true;
  }
}

void IRdemarre(byte irq)
{
  pinMode(irq, INPUT);
  IRirq = irq - 2;
  detachInterrupt(IRirq);
  IRok = false;
  IRstartL = false;
  IRstartH = false;
  IRcurrentBit = 0;
  attachInterrupt(IRirq, interruptIR_RISING, RISING);
}

int IRdecode()
{
unsigned int IRresult = 0; 
unsigned int IRmask = 0x800;

  for (int i = 2; i < 26; i += 2)
  {
    if (!IRstate[i] && IRstate[i + 1])
    {
      IRresult |= IRmask;
    }
    IRmask = IRmask >> 1;
  }
  return IRresult & 0x7FF;                 // bit de basculement forcé à 0 (il est assez difficile de l'exploiter)
}

void setup()
{
}

void loop()
{
  for(;;)
  {
    if (IRok){
      IRdemarre(2)        // Pin 2 ou 3 (interruption)
    }
    // Placer ici le code de la boucle
    // ...
    // ...
    // ...
    if (IRok){
      switch (IRdecode())
      {
        case 1:
          // ...
          // ...
          break;
        // ...
        // ...
        // ...
        case 9:
          // ...
          // ...
          break;
      }
      delay(250);    // Valeur à ajuster pour l'ergonomie selon temps boucle 
    }
  }
}

JLB