[completo] IrRemote send ma su tutti i pin

Ciao,

ultimamente ho avuo la necessità di pilotare parecchi apparati via telecomando. Il grosso problema è che la IrRemote usa un pin fisso (e necessariamente PWM) per creare il segnale modulato alla specifica frequenza.

Quindi ho implementato il tutto in SW, i valori sono er una portante a 38KHz o giù di lì. Tu passi un array di PARI elementi (ogni elemento è la durata us del segnale, alto, basso, alto, etc…), certo non sarà precisissimo (uso delayMicroseconds, qualcuno conosce di meglio?) ma funziona in modo dignitoso.

ecco la funzione (ATTENZIONE; disattiva gli interrupt per un bel pò, quindi non lamentatevi se vedete cose strane succedere):

void sendRaw(uint16_t* array, uint16_t sizeMess, byte pin){
  noInterrupts();
  
  uint8_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  volatile uint8_t *out = portOutputRegister(port);

  boolean up = false;
  for (uint16_t count = 0; count < sizeMess; count++){
    up = !up;
    if (up){
      uint16_t volte = array[count]/(DELAY_US*2);
      for(uint16_t i=0; i<volte;i++){
        *out |= bit; //HIGH
        delayMicroseconds(DELAY_US);
        *out &= ~bit; // LOW
        delayMicroseconds(DELAY_US);
      }
    }else{
      *out &= ~bit; // force LOW
      delayMicroseconds(array[count]);
    }
  }
  
  interrupts();
}

ah, per modulare a 38KHz, se non erro, uso un

unsigned long DELAY_US = 7;