
Сообщение от
MAKC
Проблемы:
- непонятно почему мне пришлось изменить порядок чтения цветов. Исходный порядок закомментирован. Рабочий порядок представлен. Если кто-то объяснит почему так? я что-то не понимаю или в лайтпаке такая особенность или еще какая вариант буду очень благодарен.
на странице FastSPI есть вот такая фраза
sometimes the strips from china wire oddly, and it may be something like:
struct CRGB { unsigned char b; unsigned char r; unsigned char g; }
что по русски значит примерно следующее:
некоторые китайские ленты сделаны криво и порядок цветов может отличаться.
Судя по косяку с подписями к пинам Data и Clock это и есть объяснение проблемы.
После проверки оказалось, что действительно вместо
strip.setPixelColor(i, Color(red, green, blue));
надо писать
strip.setPixelColor(i, Color(blue, red, green));
Правильный скетч следующий, но делайте поправку на реализацию своей ленточки.
Надеюсь, что у вас ленточка окажется с меньшим количеством косяков 
Код:
#include <SPI.h>
#include <WS2801.h>
unsigned long blank = 0;
int zones = 20;
int dataPin = 2;
int clockPin = 3;
WS2801 strip = WS2801(zones, dataPin, clockPin);
int leds = zones * 3;
void setup()
{
strip.begin();
strip.show();
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > leds)
{
if (Serial.read() == 255) //проверка префикса
{
for (int i = 0; i < zones; i++)
{
// прочитать данные о цветах из порта в массив
byte red = Serial.read();
byte green = Serial.read();
byte blue = Serial.read();
// так должно быть по правильному
//strip.setPixelColor(i, Color(red, green, blue));
// но на китайской ленточке перепутан порядок цветов, поэтому так
strip.setPixelColor(i, Color(blue, red, green));
}
blank = 0;
}
}
else
{
if (blank > 100000)
{
blank = 0;
for (int i = 0; i < zones; i++)
{
strip.setPixelColor(i, Color(0, 0, 0));
}
}
blank++;
}
strip.show();
}
// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}
Эх и китайцы