Цветомузыка + ИК пульт

Спасибо, но тут используют совсем другие библиотеки, я не смогу под них адаптировать весь скетч.

Покурил NecDecoder.h нашел на мой взгляд важные файлы:
NecDecoder.cpp

Спойлер

#include “NecDecoder.h”
/*
NEC пакет: 32 бита, 4 блока по 8 бит, LSB<-MSB
[START] [адрес] [~адрес] [команда] [~команда]
*/

void NecDecoder::tick(void) {
uint32_t time = micros() - _tmr; // получаем время последнего импульса
_tmr += time; // сбрасываем таймер (== (_tmr = micros() ))
if (time > 150000) _repeats = -1; // таймаут повторов
if (_start && time < _NEC_HIGH_MAX) { // чтение: дата
uint8_t mode = 2;
if (time > _NEC_LOW_MIN && time < _NEC_LOW_MAX) mode = 0; // LOW бит
else if (time > _NEC_HIGH_MIN && time < _NEC_HIGH_MAX) mode = 1; // HIGH бит
if (mode != 2) { // HIGH или LOW
_buffer = _buffer << 1 | mode; // пишем в буфер
if (mode) _parity = !_parity; // чётность
if (++_counter == 32) { // если приняли 32 бита
if (_parity) return; // чётность не совпала - пакет битый
if (((_buffer >> 8) & _buffer) & 0xFF00FF) return; // пакет битый
_packet = _buffer; // перемещаем пакет из буфера в дату
_decoded = true; // флаг успешного приема пакета
_repeats = 0; // обнуляем счётчик повторов
_start = false; // чтение окончено
return;
}
}
}
if (_repeats != -1 && time > _NEC_REPEAT_MIN && time < _NEC_REPEAT_MAX) { // чтение: повтор
if (_repeats > _NEC_SKIP_REPEAT) _repeat = true;
else _repeats++;
} else if (time > _NEC_START_MIN && time < _NEC_START_MAX) { // чтение: начало пакета
_buffer = _parity = _counter = 0; // сбрасываем всё
_start = true;
}
}

bool NecDecoder::available() {
if (_decoded || _repeat) {
_decoded = _repeat = false;
return true;
} return false;
}

bool NecDecoder::isDecoded() {
if (_decoded) {
_decoded = false;
return true;
} return false;
}

bool NecDecoder::isRepeated() {
if (_repeat) {
_repeat = false;
return true;
} return false;
}

uint32_t NecDecoder::readPacket() {
return _packet;
}

uint8_t NecDecoder::readAddress() {
return ((uint32_t)_packet >> 24);
}

uint8_t NecDecoder::readCommand() {
return ((uint32_t)_packet >> 8 & 0xFF);
}

uint8_t NecDecoder::readInvCommand() {
return ((uint32_t)_packet & 0xFF);
}

uint8_t NecDecoder::readInvAddress() {
return ((uint32_t)_packet >> 16 & 0xFF);
}

bool NecDecoder::addressIsValid() {
return true;
}

bool NecDecoder::commandIsValid() {
return true;
}

bool NecDecoder::packetIsValid() {
return true;
}

NecDecoder.h

Спойлер

/*
Лёгкая библиотека для декодирования ИК протокола NEC (Японский вариант)
Документация:
GitHub: GitHub - GyverLibs/NecDecoder: Лёгкая библиотека для декодирования ИК протокола NEC (Японский вариант)
Возможности:
- Библиотека не забирает никакие прерывания
- Отсчет времени на micros()
- Обработка команды повтора (удержание кнопки пульта)
- Обработка и чтение занимает 500б Flash
by Nich1con & AlexGyver, alex@alexgyver.ru
https://alexgyver.ru/
MIT License

Версии:
v1.0 - релиз
v1.1 - исправлены ошибки, добавлена возможность подключения обработчиков, добавлен контроль потока 
v2.0 - завёз очень много оптимизации, стабильноси, надёжности, упрощения и удобства (by AlexGyver)
v2.1 - добавил отправку (NecEncoder)

*/

#ifndef _NecDecoder_h
#define _NecDecoder_h
#include <Arduino.h>

#define _NEC_TOLERANCE 150 // допуск high/low, мкс
#define _NEC_TOLERANCE2 1500 // допуск start/repeat, мкс
#define _NEC_SKIP_REPEAT 2 // пропуск первых повторов, шт

// Тайминги NEC, мкс
#define _NEC_HIGH_BIT 2250
#define _NEC_LOW_BIT 1150
#define _NEC_START_BIT 14400
#define _NEC_REPEAT 12300

// =========================================================================
#define _NEC_HIGH_MIN (_NEC_HIGH_BIT - _NEC_TOLERANCE)
#define _NEC_HIGH_MAX (_NEC_HIGH_BIT + _NEC_TOLERANCE)
#define _NEC_LOW_MIN (_NEC_LOW_BIT - _NEC_TOLERANCE)
#define _NEC_LOW_MAX (_NEC_LOW_BIT + _NEC_TOLERANCE)

#define _NEC_START_MIN (_NEC_START_BIT - _NEC_TOLERANCE2)
#define _NEC_START_MAX (_NEC_START_BIT + _NEC_TOLERANCE2)
#define _NEC_REPEAT_MIN (_NEC_REPEAT - _NEC_TOLERANCE2)
#define _NEC_REPEAT_MAX (_NEC_REPEAT + _NEC_TOLERANCE2)

class NecDecoder {
public:
// приём
void tick(); // Вызывать при ОТРИЦАТЕЛЬНОМ (FALLING) фронте на пине ИК приемника в прерывании
bool available(); // Возвращает true, если корректный пакет прочитан или повторён (isDecoded() + isRepeated())
uint32_t readPacket(); // Прочитать пакет целиком (адрес + ~адрес + команда + ~команда)
uint8_t readAddress(); // Прочитать адрес
uint8_t readCommand(); // Прочитать команду
bool isDecoded(); // Возвращает true, если пакет успешно декодирован
bool isRepeated(); // Возвращает true, если принят флаг повтора команды

// =======================
// сервис
uint8_t readInvAddress();			// Прочитать только байт с инвертированным адресом
uint8_t readInvCommand();			// Прочитать только байт с инвертированной командой

// совместимость 1.x
bool addressIsValid();				// Вернет true если адрес прошел проверку
bool commandIsValid();				// Вернет true если команда прошла проверку
bool packetIsValid();				// Вернет true если весь пакет прошел проверку

private:
volatile uint32_t _packet = 0; // Буфер последнего принятого пакета (4 байта)
volatile uint32_t _buffer = 0; // Буфер текущего принимаемого пакета (4 байта)
volatile uint32_t _tmr = 0; // Время предыдущего нисходящего фронта (us)
volatile int8_t _counter = 32; // Счетчик бит в принимаемом пакете
volatile int8_t _repeats = 0; // счётчик повторов
volatile bool _start = false; // старт флаг
volatile bool _decoded = false; // Флаг готовности данных к чтению (пакет принят и декодирован)
volatile bool _repeat = false; // Флаг повтора (пульт отправил то же самое, что и в прошлый раз)
volatile bool _parity = false; // Флаг контроля четности
};
#endif

NecEncoder.h

Спойлер

#ifndef _NecEncoder_h
#define _NecEncoder_h
#include <Arduino.h>

// отправка
class NecEncoder {
public:
NecEncoder(uint8_t pin, uint8_t del = 10) : _pin(pin), _del(del) {
pinMode(pin, OUTPUT);
}

void send(uint8_t addr, uint8_t cmd) {
    pulse38(9000);
    delayMicroseconds(4500);
    sendData(addr);
    sendData(~addr);
    sendData(cmd);
    sendData(~cmd);
    pulse38(562);
}

private:
void pulse38(int dur) {
dur = (dur / 13) & ~1; // кол-во пакетов по 13мкс + округляем нечетного
bool flag = 1;
for (int i = 0; i < dur; i++) {
digitalWrite(_pin, flag);
flag = !flag;
delayMicroseconds(_del);
}
}

void sendData(uint8_t data) {
    int i = 8;
    while (i--) {
        pulse38(562);
        if (data & (1 << 7)) delayMicroseconds(1687);
        else delayMicroseconds(562);
        data <<= 1;
    }
}

const uint8_t _pin, _del;

};
#endif

Нашел флаг “_start” он уст.после старт пакета и сбрасывается после приема данных или ошибки приема.
Могу ли я зациклить это место

    if (ir.available()) {
    // вывести команду (8 бит)
    Serial.print("0x");
    Serial.println(ir.readCommand(), HEX);
  } 

если _start = true;
Пожалуйста, если кому не в падлу, напишите строки для меня.

Да.Лёвкин.Угадал и получил 1000 баллов.

Куда? ))

Але, народ. Не уже ли ни кто не поможет?

Да загуглите уж Вы что-нибудь о совместной работе NeoPixel и IRRemote.
Это всё многократно разжевано и в инете полно примеров их совмещения.