Absolute rubbish, they are just trying to sell you more stuff. I have extensively used these strips and found them to be very reliable.
Most of this has been under Python in my book :-
https://www.oreilly.com › library › view › raspberry-pi-for › 9781119796824
But I have also written some bit banging code for the Arduino to drive them.
// Bit banging a DotStar/APA102/SK9822
const int8_t numLeds = 26; // Change to how many LEDs you have
uint32_t ledArray[numLeds]; // buffer to hold LED data
uint16_t ledArray1[numLeds];
uint16_t ledArray2[numLeds];
int8_t dataPin = 13 ; // Change to the pin you want to use
int8_t clockPin = 12 ; // Change to the pin you want to use
uint8_t bright; // default brightness use function to change this
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
setBright(18); // brightness for LEDs
for(int i=0; i< numLeds; i++){ // initilise LED brightness
ledArray[i] = bright << 24;
}
//wipe(0, 0, 0); // turn all LEDs off
Serial.begin(9600);
delay(1000);
Serial.println("start of code");
setPixelColour(0, 0x10, 0x30, 0x60);
Serial.println(ledArray1[0] ,HEX);
Serial.println((ledArray2[0]),HEX);
}
void loop() {
wipe(0x20, 0x20, 0x20);
//Serial.println("loop");
setPixelColour(3, 5, 0, 0);
setPixelColour(6, 0, 5, 5);
delay(200);
wipe(0, 0, 0);
delay(800);
}
//////////// LED colour manipulation functions //////
void setBright(uint8_t val){ // set brightness from 0 to 31
if(val > 31) val = 31;
if(val < 0 ) val = 0;
bright = val | 0xE0;
}
void wipe(uint8_t r, uint8_t g, uint8_t b){ // set all colours the same and show
for(int i=0; i< numLeds; i++){
setPixelColour(i, r, g, b);
}
//Serial.println("set colours");
pixelsShow();
}
void setPixelColour(uint16_t num, uint8_t r, uint8_t g, uint8_t b){
if(num < numLeds && num >= 0){
ledArray1[num] = (bright<<8) | b;
ledArray2[num] |= (g<<8) | r;
// Serial.println(num);
}
}
//////////// Data transfer functions /////////
void pixelsShow(){ // send buffer to the hardware
uint32_t data = 0;
uint32_t mask = 0x80000000UL;
sendHeader();
// for(int i=0; i<numLeds; i++){
for(int i=0; i<numLeds; i++){
data = ledArray[i];
mask = 0x80000000UL;
for(int j=0; j<32; j++){ // output the LED data
//digitalWrite(clockPin, LOW);
PORTB = PORTB & 0xEF;
if(data & mask) {
//digitalWrite(dataPin, HIGH);
PORTB = PORTB | 0x20;
}
else {
//digitalWrite(dataPin, LOW);
PORTB = PORTB & 0xDF;
}
mask = mask >> 1;
//digitalWrite(clockPin, HIGH);
PORTB = PORTB | 0x10;
}
}
sendFooter();
//digitalWrite(dataPin, LOW);
PORTB = PORTB & 0xDF;
}
void sendHeader(){
//Serial.println("send header");
//digitalWrite(dataPin, LOW); // set data pin low
PORTB = PORTB & 0xDF;
for(int i = 0; i< 32; i++){
//digitalWrite(clockPin, LOW); // pulse the clock pin
PORTB = PORTB & 0xEF;
//digitalWrite(clockPin, HIGH);
PORTB = PORTB | 0x10;
}
}
void sendFooter(){
//digitalWrite(dataPin, HIGH);
PORTB = PORTB | 0x20;
//for(int i = 0; i< (33 + (numLeds>>1)); i++){
for(int i = 0; i< 1 + numLeds>>1; i++){
//digitalWrite(clockPin, LOW);
PORTB = PORTB & 0xEF;
//digitalWrite(clockPin, HIGH);
PORTB = PORTB | 0x10;
}
//digitalWrite(dataPin, LOW);
PORTB = PORTB & 0xDF;
}
Never had any problem on either platform.