Через WebSocket передаю на ардуину строку с последовательностью цветов для каждого светодиода. Сейчас цвета передаются в hex формате с 6 символами, но планирую переписать на 3 символьный hex.
Получаемые данные обрабатываются так:
char data[length - 2];
for (int x = 2; x < length; x++) { // первые 2 символа отсекаем т.к. там тип события и разделитель
data[x - 2] = (char) payload[x];
}
Далее в зависимости от типа события вызывается соответствующая функция:
switch (payload[0]) {
.......
case 'C': // Color Array: c|FFFFFF000000..
eventColorArray(data);
break;
.......
}
Функция обработки события:
void eventColorArray(char* data) {
for (byte i = 0; i < LEDS_COUNT / 2; i += 1) {
char hex[6];
for (int j = 0; j < 6; j++) { // первые 2 символа отсекаем т.к. там тип события и разделитель
hex[j] = (char) data[j + (6 * i)];
}
unsigned long rgb = (unsigned long) strtol(hex, NULL, 16);
byte r = abs(0 + (rgb >> 16) & 0xFF);
byte g = abs(0 + (rgb >> 8) & 0xFF);
byte b = abs(0 + (rgb >> 0) & 0xFF);
strip.setPixelColor(i*2, strip.Color(g, r, b));
strip.setPixelColor(i*2+1, strip.Color(g, r, b));
}
strip.show();
}
Все это работает более менее стабильно до ±10 fps. Дальше начинается накапливаемая задержка.
Часть проблемы возможно в слабом интернете, ибо в ленте 234 светодиода, это одна из причин почему решил слать 3х символьный hex вместо 6 символьного. Но также возможно более опытные люди подскажут как оптимизировать функцию "заливки ленты".