Странное поведение со светодиодной лентой WS2812B RGB

Я попытался использовать светодиодную ленту RGB, следуя инструкциям. Я подключил вывод напряжения к выводу 5 В Arduino UNO, вывод заземления к выводу GRN и использовал вывод 5 для DIN.

Я использовал это изображение в качестве ссылки:

Я попробовал две разные библиотеки, с первой, FAST LED, я использовал этот код:

#include <FastLED.h>

#define LED_PIN     5
#define NUM_LEDS    15
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
    delay( 3000 ); // задержка безопасности при включении питания
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness(  BRIGHTNESS );

    currentPalette = RainbowColors_p;
    currentBlending = LINEARBLEND;
}


void loop()
{
    ChangePalettePeriodically();

    static uint8_t startIndex = 0;
    startIndex = startIndex + 1; /* motion speed */

    FillLEDsFromPaletteColors( startIndex);

    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
}

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
    uint8_t brightness = 255;

    for( int i = 0; i < NUM_LEDS; i++) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
}

void ChangePalettePeriodically()
{
    uint8_t secondHand = (millis() / 1000) % 60;
    static uint8_t lastSecond = 99;

    if( lastSecond != secondHand) {
        lastSecond = secondHand;
        if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = LINEARBLEND; }
        if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }
        if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = LINEARBLEND; }
        if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = LINEARBLEND; }
        if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = LINEARBLEND; }
        if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }
        if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = LINEARBLEND; }
        if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 50)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND;  }
        if( secondHand == 55)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }
    }
}

void SetupTotallyRandomPalette()
{
    for( int i = 0; i < 16; i++) {
        currentPalette[i] = CHSV( random8(), 255, random8());
    }
}

void SetupBlackAndWhiteStripedPalette()
{
    fill_solid( currentPalette, 16, CRGB::Black);
    currentPalette[0] = CRGB::White;
    currentPalette[4] = CRGB::White;
    currentPalette[8] = CRGB::White;
    currentPalette[12] = CRGB::White;

}

// Эта функция устанавливает палитру фиолетовых и зеленых полос.
void SetupPurpleAndGreenPalette()
{
    CRGB purple = CHSV( HUE_PURPLE, 255, 255);
    CRGB green  = CHSV( HUE_GREEN, 255, 255);
    CRGB black  = CRGB::Black;

    currentPalette = CRGBPalette16(
                                   green,  green,  black,  black,
                                   purple, purple, black,  black,
                                   green,  green,  black,  black,
                                   purple, purple, black,  black );
}

const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
    CRGB::Red,
    CRGB::Gray, 
    CRGB::Blue,
    CRGB::Black,

    CRGB::Red,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Black,

    CRGB::Red,
    CRGB::Red,
    CRGB::Gray,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Blue,
    CRGB::Black,
    CRGB::Black
};

и со второй библиотекой Adafruit_Neopixel

#include <Adafruit_NeoPixel.h>
#define PIN 5
#define NUM_LEDS 15
// Параметр 1 = количество пикселей в полосе
// Параметр 2 = номер вывода (большинство допустимо)
// Параметр 3 = флаги типа пикселя, суммируйте по мере необходимости:
// NEO_KHZ800 Битовый поток 800 кГц (большинство продуктов NeoPixel со светодиодами WS2812)
// NEO_KHZ400 400 кГц (классические 'v1' (не v2) пиксели FLORA, драйверы WS2811)
// Пиксели NEO_GRB подключены к битовому потоку GRB (большинство продуктов NeoPixel)
// Пиксели NEO_RGB подключаются к битовому потоку RGB (пиксели v1 FLORA, а не v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Инициализируем все пиксели выключенными
}

// *** ЗАМЕНИТЬ ЗДЕСЬ ***
void loop() { 
  RGBLoop();
}

void RGBLoop(){
  for(int j = 0; j < 3; j++ ) { 
    // Исчезновение
    for(int k = 0; k < 256; k++) { 
      switch(j) { 
        case 0: setAll(k,0,0); break;
        case 1: setAll(0,k,0); break;
        case 2: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
    // Исчезать
    for(int k = 255; k >= 0; k--) { 
      switch(j) { 
        case 0: setAll(k,0,0); break;
        case 1: setAll(0,k,0); break;
        case 2: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}
// *** ЗАМЕНИТЬ ЗДЕСЬ ***

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // НеоПиксель
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // НеоПиксель
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

Не знаю почему, но только некоторые светодиоды в полосках светятся, и только синим светом. Как я могу решить эту проблему? Я также пытался изменить контакт Din, используя 4, 5 и 6, но ничего не изменилось.

Дополнение

Я обнаружил, что все мои светодиоды сломаны... Я купил новую полосу, и теперь у меня есть прототип, который отлично работает, используя любой из приведенных выше кодов. Спасибо за помощь

, 👍0

Обсуждение

Какова длина полосы? Сколько светодиодов? Вы рассчитали, какой ток он может потреблять? Как вы питаете свой Arduino?, @Edgar Bonet

@EdgarBonet на полосе 15 светодиодов, и я определил количество в глобальных переменных. Я питаю Arduino с помощью USB-кабеля. Спасибо за ваш ответ, @michoprogrammer

15 светодиодов, все на полной яркости, требуется 15 x 3 x 20 мА = 900 мА. USB может подавать только 500 мА. Попробуйте поместить Serial.print в setup() и посмотрите, сбрасывается ли Arduino., @CrossRoads

Serial.print без параметров на входе?, @michoprogrammer

Серийный.начать(9600); Serial.println ("сброс");, @CrossRoads

@CrossRoadsЯ пытался, но ничего не изменилось. У вас есть другие предложения?, @michoprogrammer


2 ответа


1

В первом скетче, который вы используете

#define LED_TYPE    WS2811

Пока у вас WS2812

Каждый тип светодиодных лент имеет разное время синхронизации, поэтому может случиться так, что некоторые светодиоды будут мигать, включаться или выключаться, чего не должно быть, если выбрана неправильная модель.

Возможно, первые светодиоды работают лучше, чем более поздние.

,

Спецификация WS2811 https://cdn-shop.adafruit.com/datasheets/WS2811.pdf и спецификация WS2812 https://cdn-shop.adafruit.com/datasheets/WS2812.pdf WS2812 имеет встроенные светодиоды и может работать на чуть более высокая скорость., @CrossRoads

Я попробовал то, что вы предложили, но ничего не изменилось., @michoprogrammer


1

Почему вы уверены, что замена светодиодной ленты была правильным решением? Я предлагаю запустить светодиодную ленту от Arduino + 5V, что является вероятной проблемой (слишком много потребляемого тока), и с использованием другой светодиодной ленты вам просто повезло, что она теперь работает.

Попробуйте использовать отдельный источник питания для светодиодов, но соедините заземление вместе. Если у вас нет другого блока питания на 5 В, способного обеспечить ток не менее 1 А, попробуйте ограничить яркость и/или количество светодиодов в программном обеспечении, чтобы проверить, работает ли он, и если да, то попробуйте с оригинальная лента.

,

«Почему вы уверены, что замена светодиодной ленты была решением проблемы?» Я купил точно такую же модель, такую же светодиодную ленту RGB, и теперь она работает отлично. Я также пробовал с батареей 5V, и со старой полосой результат был таким же, работали только четыре светодиода., @michoprogrammer