Converting code to work with WS2801 RGB LEDs

Hello,

I am attempting to use the code below for strands of WS2801 LEDs and I'm not sure how to modify the code to work for my LED strand type.

#include <Encoder.h>
#include <Adafruit_NeoPixel.h>

const int NUM_LEDS = 50;            // number of leds in strip
const int LED_PIN = 5;             // pin for led strip
const int BRIGHTNESS = 255;        // brightness of all leds
const int WHEEL_SIZE = 256;        // how many entries in the color wheel
const boolean MOVE_LIGHT = false;  // move one light around or keep all lights on
const int ENCODER_PIN_1 = 2;
const int ENCODER_PIN_2 = 3;
const int ENCODER_BUTTON = 4;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_RGB + NEO_KHZ800);
Encoder encoder(ENCODER_PIN_1, ENCODER_PIN_2);
int mode = 0;
long lastPush = 0;
int autoPosition = 0;

void initializeToBlack() {
  for (int i =0; i < NUM_LEDS; i++) {
   strip.setPixelColor(i, 0);
  }  
}

void setup() {
  Serial.begin(9600);
  pinMode(ENCODER_BUTTON, INPUT);
  digitalWrite(ENCODER_BUTTON, HIGH); //turn pullup resistor on

  strip.begin();
  initializeToBlack();
  strip.show();   
}

long normalize(long value, long radix) {
  long rval = value % radix;
  if (rval < 0) return radix + rval;
  else return rval; 
}

void loop() {
  int button= digitalRead(ENCODER_BUTTON);
  if (button == 0) {
    if ((millis() - lastPush) > 250) {
      lastPush = millis();
      mode++;
      if (mode > 4) mode = 0;
    }
  }
  long knobValue = encoder.read() / 2;

  long ledPosition = normalize(knobValue, NUM_LEDS);
  long colorValue = normalize(knobValue * 5, WHEEL_SIZE);
  long sleepValue = abs(knobValue) % 500;
  
  switch(mode) {
  // off
  case 0: initializeToBlack();
          break;
  // knob moves led
  case 1: initializeToBlack();
          strip.setPixelColor(ledPosition, colorWheel(BRIGHTNESS, colorValue));
          break;
  // all on, knob makes rainbow
  case 2: for (int i =0; i < NUM_LEDS; i++) {
            strip.setPixelColor(i, colorWheel(BRIGHTNESS, colorValue));
          }
          break;
  // one auto moving light, knob adjusts speed
  case 3: 
          delay(sleepValue);
          initializeToBlack();
          
          strip.setPixelColor(autoPosition, colorWheel(BRIGHTNESS, autoPosition * (WHEEL_SIZE / NUM_LEDS)));
          autoPosition++;
          if (autoPosition >= NUM_LEDS) {
            autoPosition = 0;         
          }
          break;
  // slug of rainbow auto moving lights, knob adjusts speed
  case 4:
          const int SLUG_SIZE = 15;
          
          delay(sleepValue);
          initializeToBlack();
          
          for (int i = 0; i < SLUG_SIZE; i++) {
            strip.setPixelColor((i + autoPosition) % NUM_LEDS, colorWheel(BRIGHTNESS, i * (WHEEL_SIZE / SLUG_SIZE)));
          }
          
          autoPosition++;
          if (autoPosition >= NUM_LEDS) {
            autoPosition = 0;         
          }
          break;
  }
  strip.show();
}

// given a wheel position in 0-255 range
// return a rainbow color adjusted by intensity 0 to 1.0
uint32_t colorWheel(float intensity, byte wheelPos)
{
  const int WHEEL_THIRD = (WHEEL_SIZE - 1) / 3;
  
  if (intensity < 0.0 ) intensity = 0.0;
  if (intensity > 1.0) intensity = 1.0;

  // as wheelPos progresses from 0 to 255 once, colorIndex should progress from 0 to 255 3 times
  // find out position in current third of wheel then multiple by 3 to get full color value
  byte colorIndex = (wheelPos % WHEEL_THIRD) * 3;
  
  int fadeColor = (255 - colorIndex) * intensity;  // color going down
  int increaseColor = colorIndex * intensity;    // color going up
  
  switch (wheelPos / WHEEL_THIRD) {
    case 0:    // first third of the wheel, red fading, no green, blue increasing
      return Adafruit_NeoPixel::Color(fadeColor, 0, increaseColor);
      break;
    case 1:    // second third of the wheel no red, green increasing, blue fading
      return Adafruit_NeoPixel::Color(0, increaseColor, fadeColor);
      break;
  
    case 2:    // last third of the wheel, red increasing, green fading, no blue
      return Adafruit_NeoPixel::Color(increaseColor, fadeColor, 0);
      break;
  }
}

The NeoPixel library does not support the WS2801 LEDs so I've added the following code to the Adafruit_WS2801.cpp file:

uint32_t Adafruit_WS2801::Color(uint8_t r, uint8_t g, uint8_t b) {[color=#2e8b57][/color]
  return ((uint32_t)r << 16) | ((uint32_t)g <<  8) | b;[color=#2e8b57][/color]
}

Then, I added this code to the Adafruit_WS2801.h file:

uint32_t[color=#2e8b57][/color]
    Color(uint8_t r, uint8_t g, uint8_t b);

Now when I compile my project code I get the following error:
cannot call member function 'uint32_t Adafruit_WS2801::Color(uint8_t, uint8_t, uint8_t)' without object
Do I have to declare the method 'static' so it belongs to the Class and not an instance or would that defeat the goal of my intended functionality?

Try:

FastLED.h

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.