Hello,
I have a working code for a strip of neopixel leds. I've just got some new strips of 8 leds from Sparkfun, they don't work as expected: Only 6 firsts of a strip shine. It seems that the second led use a byte of the first, the third one use 2 bytes of the second one and so on... As a result, the 2 last leds don't shine... Did I miss something?
<edit2>
For your information, I've tried several sketches from the web, they all have the same problem... I guess about a hardware problem or a bad reference or something like that.
<edit2>
<edit>
#include "neo8Leds.h"
#define LEDS_PIN A0
#define LED_STATE_DURATION 300
NEO8_LEDS leds = NEO8_LEDS(LEDS_PIN);
byte ledsShadow = 0;
void toggle(byte led_num)
{
ledsShadow ^= 1 << led_num;
if(ledsShadow & (1 << led_num))
leds.switchOn(led_num);
else
leds.switchOff(led_num);
}
void setup()
{
leds.begin();
Serial.begin(9600);
Serial.println(F("Type [1..8] to toggle a led"));
}
void loop()
{
if(Serial.available())
{
byte incoming_char = Serial.read();
switch(incoming_char)
{
case '0':
leds.sleep();
ledsShadow = 0;
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
toggle(incoming_char - '1');
break;
default:
break;
}
}
}
#ifndef neo8Leds_h
#define neo8Leds_h
#include <Adafruit_NeoPixel.h>
#include <Arduino.h>
#define NEO8_LEDS_NB_LEDS 8
class NEO8_LEDS
{
public:
NEO8_LEDS(int pin_num);
void begin();
void sequencer();
void switchOff(byte led_num);
void switchOn(byte led_num);
void configColorOff(byte led_num, byte red, byte green, byte blue);
void configColorOn(byte led_num, byte red, byte green, byte blue);
void sleep();
//~ private:
int pinNum;
byte onRed[NEO8_LEDS_NB_LEDS];
byte onGreen[NEO8_LEDS_NB_LEDS];
byte onBlue[NEO8_LEDS_NB_LEDS];
byte offRed[NEO8_LEDS_NB_LEDS];
byte offGreen[NEO8_LEDS_NB_LEDS];
byte offBlue[NEO8_LEDS_NB_LEDS];
byte state;
byte previousState;
Adafruit_NeoPixel gateway;
};
#endif
#include "neo8Leds.h"
/*******************/
/* Private methods */
/*******************/
/******************/
/* Public methods */
/******************/
NEO8_LEDS::NEO8_LEDS(int pin_num)
{
pinNum = pin_num;
}
void NEO8_LEDS::sleep()
{
for(byte led_num=0; led_num < NEO8_LEDS_NB_LEDS; led_num++)
gateway.setPixelColor(led_num, 0, 0, 0);
gateway.show();
}
void NEO8_LEDS::begin()
{
state = 0;
previousState = 0;
//~ pinMode(pinNum, OUTPUT);
//~ memset(onRed, 64, NEO8_LEDS_NB_LEDS);
//~ memset(onGreen, 0, NEO8_LEDS_NB_LEDS);
//~ memset(onBlue, 0, NEO8_LEDS_NB_LEDS);
//~ memset(offRed, 0, NEO8_LEDS_NB_LEDS);
//~ memset(offGreen, 0, NEO8_LEDS_NB_LEDS);
//~ memset(offBlue, 0, NEO8_LEDS_NB_LEDS);
for(byte x=0; x < NEO8_LEDS_NB_LEDS; x++)
{
onRed[x] = 64;
onGreen[x] = 0;
onBlue[x] = 0;
offRed[x] = 0;
offGreen[x] = 0;
offBlue[x] = 0;
}
//~ gateway = Adafruit_NeoPixel(NEO8_LEDS_NB_LEDS, pinNum, NEO_GRB + NEO_KHZ800);
//~ gateway = Adafruit_NeoPixel(NEO8_LEDS_NB_LEDS, pinNum, NEO_RGBW + NEO_KHZ800);
gateway = Adafruit_NeoPixel(NEO8_LEDS_NB_LEDS, pinNum, NEO_RGB + NEO_KHZ800);
gateway.begin();
gateway.show();
}
void NEO8_LEDS::sequencer()
{
}
void NEO8_LEDS::switchOff(byte led_num)
{
gateway.setPixelColor(led_num, onRed[led_num], onGreen[led_num], onBlue[led_num]);
//~ gateway.setPixelColor(led_num, (long)(((long)offRed[led_num]<<16)| ((long)offGreen[led_num]<<8) | (long)offBlue[led_num]));
gateway.show();
Serial.print(F("led "));
Serial.print(led_num + 1);
Serial.println(F(" off"));
}
void NEO8_LEDS::switchOn(byte led_num)
{
gateway.setPixelColor(led_num, offRed[led_num], offGreen[led_num], offBlue[led_num]);
//~ gateway.setPixelColor(led_num, (long)(((long)onRed[led_num]<<16)| ((long)onGreen[led_num]<<8) | (long)onBlue[led_num]));
gateway.show();
Serial.print(F("led "));
Serial.print(led_num + 1);
Serial.println(F(" on"));
}
void NEO8_LEDS::configColorOff(byte led_num, byte red, byte green, byte blue)
{
offRed[led_num] = red;
offGreen[led_num] = green;
offBlue[led_num] = blue;
}
void NEO8_LEDS::configColorOn(byte led_num, byte red, byte green, byte blue)
{
onRed[led_num] = red;
onGreen[led_num] = green;
onBlue[led_num] = blue;
}
</edit>
Regards,
Pfeuh