Что случилось? Моделирование FastLED и WS2812B работает, физическая сборка - нет

Я новичок в кодировании Arduino и FastLED. Когда дело доходит до кодирования, я полный новичок, однако я смотрел учебные пособия YouTube, чтобы помочь своим знаниям. Я успешно запустил свой код на Wokwi, однако, когда я загружаю свой код на Arduino, он загружается без ошибок, но WS2812B не запускает код правильно и, похоже, зависает после первого шаблона.

Светодиодная лента работает только с моим кодом Adafruit, используя очень простой набор шаблонов, которые я создал (отличается от приведенного ниже кода).

Любая помощь будет очень признательна! Приведенный ниже код - это то, что я написал в Wokwi, и симуляция работает безупречно. Единственное изменение при загрузке в мой Arduino: NUM_LEDS 135

#include <FastLED.h>
#define NUM_LEDS  16
#define LED_PIN   5
#define BRIGHTNESS  255
#define caseCount 7
CRGB source1[NUM_LEDS];
CRGB source2[NUM_LEDS];
CRGB output[NUM_LEDS];

DEFINE_GRADIENT_PALETTE (christmasBlue_gp) {
  0, 0, 0, 255,
  64, 0, 0, 135,
  127, 255, 255, 255,
  191, 0, 0, 135,
  255, 0, 0, 255
};
CRGBPalette16 bluePal = christmasBlue_gp;

uint8_t blendAmount = 0;
uint8_t patternCounter = 0;
uint8_t source1Pattern = 0;
uint8_t source2Pattern = 1;
bool useSource1 = false;

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(output, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
}

void loop() {

  EVERY_N_MILLISECONDS(5) {
    blend(source1, source2, output, NUM_LEDS, blendAmount);
    if (useSource1) {
      if (blendAmount < 255) blendAmount++;
      } else {
      if (blendAmount > 0) blendAmount--;
      }
  }

  EVERY_N_SECONDS(5) {
    nextPattern();
  }
  runPattern(source1Pattern, source1);
  runPattern(source2Pattern, source2);
  FastLED.show();
}

void nextPattern() {
  patternCounter = (patternCounter + 1) % caseCount;
  if (useSource1) source1Pattern = patternCounter;
  else source2Pattern = patternCounter;
  useSource1 = !useSource1;
  }

void runPattern(uint8_t pattern, CRGB *LEDArray) {
  switch (pattern) {
    case 0:
      movingDots(LEDArray);
      break;
    case 1:
      whiteFill(LEDArray);
      break;
    case 2:
      greenFill(LEDArray);
      break;
    case 3:
      whiteFill(LEDArray);
      break;
    case 4:
      redFill(LEDArray);
      break;
    case 5:
      greenBlueTwinkle(LEDArray);
      break;
    case 6:
      greenRedSplit(LEDArray);
      break;
  }
}

void movingDots(CRGB *LEDarray) {
  uint16_t posBeat = beatsin16(30, 0, NUM_LEDS -1, 0, 0);
  uint16_t posBeat2 = beatsin16(60, 0, NUM_LEDS -1, 0, 0);
  uint16_t posBeat3 = beatsin16(25, 0, NUM_LEDS -1, 0, 127);
  uint16_t posBeat4 = beatsin16(45, 0, NUM_LEDS -1, 0, 127);
  LEDarray[(posBeat + posBeat2) / 2] = CHSV(0, 255, 255);
  LEDarray[(posBeat3 + posBeat4) / 2] = CHSV(120, 255, 255);
  LEDarray[(posBeat3 + posBeat2) / 2] = CHSV(120, 255, 255);
  LEDarray[(posBeat2 + posBeat4) / 2] = CHSV(0, 255, 255);
  LEDarray[(posBeat2 + posBeat4 + posBeat) / 3] = CHSV(0, 0, 255);
  fadeToBlackBy(LEDarray, NUM_LEDS, 1);
}

void whiteFill(CRGB *LEDarray) {
  fill_solid(LEDarray, NUM_LEDS, CRGB::White);
}

void greenFill(CRGB *LEDarray) {
  fill_solid(LEDarray, NUM_LEDS, CRGB::Green);
}

void redFill(CRGB *LEDarray) {
  fill_solid(LEDarray, NUM_LEDS, CRGB::Red);
}

void greenBlueTwinkle(CRGB *LEDarray) {
  EVERY_N_MILLISECONDS(50){
    LEDarray[random8(0, NUM_LEDS-1)] = ColorFromPalette(bluePal, random8(), 255, LINEARBLEND);
    }
  fadeToBlackBy(LEDarray, NUM_LEDS, 1);
  FastLED.show();
}

void greenRedSplit(CRGB *LEDarray) {
  for(int i = 0; i < NUM_LEDS; i++) {
    LEDarray[i] = CHSV(0, 255, 255);
    LEDarray[(NUM_LEDS-1-i)] = CHSV(120, 255, 255);
    FastLED.show();
    delay(100);
    LEDarray[i] = CHSV(0, 255, 255);
  }

  for(int i = NUM_LEDS - 1; i >= 0; i--) {
    LEDarray[i] = CHSV(120, 255, 255);
    LEDarray[(NUM_LEDS-1-i)] = CHSV(0, 255, 255);
    FastLED.show();
    delay(100);
    LEDarray[i] = CHSV(120, 255, 255);
  }
}

, 👍6

Обсуждение

Работает ли это, скажем, с NUM_LEDS 15? Вполне может быть проблема с памятью., @ocrdu

Хороший вопрос и предложение. Мне придется попробовать это, когда я вернусь домой, я на работе, а мой Chromebook не поддерживает IDE Arduino., @Joey W

Возможно также, что ваш источник питания недостаточно мощный (см. Ответ @st2000). Вы можете попробовать уменьшить яркость, чтобы снизить энергопотребление, и посмотреть, сделает ли это его работу более надежной., @StarCat

Я уменьшил яркость до 100, что не решило проблему. Тем не менее, я еще больше разбил код. Возможно, причиной было предположение Ocrdu о проблеме с памятью. Я удалил 3 части из смеси, так что осталось всего 4 корпуса, работающих на всех 135 светодиодах. Мой код "void greenRedSplit (CRGB * LEDArray)", похоже, замораживал Arduino каждый раз, когда он "запускался"., @Joey W


1 ответ


3

Подумайте, что произойдет, если ваш источник питания окажется недостаточно мощным. В зависимости от количества WS2812B, которое вы освещаете одновременно, вы можете превысить номинальный ток вашего источника питания. Используя следующую цитату из этого источника:

... подумайте, сколько тока будет тянуть ваша светодиодная лента. Когда каждый отдельный светодиод включен на полную яркость, каждая прорывная плата может тянуть за собой 60 мА (20 мА на цветной канал).

Мы можем рассчитать, что для строки из 15 WS2812, установленной на полную яркость, потребуется 15 x 60 мА или почти 1 Ампер мощности. Люди обычно используют источник питания, который может выдерживать в два раза большую ожидаемую токовую нагрузку. Таким образом, в этом случае вам понадобится источник питания, который может питать не менее 2 ампер

Также подумайте о том, чтобы не использовать линейный регулятор напряжения Arduino для больших токовых нагрузок. Он не только имеет ограничения по току, но и не так эффективен, как импульсный источник питания. Вместо этого используйте источник питания с правильным напряжением и номинальным током для больших токовых нагрузок.

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

,

Отличная мысль, поскольку я бы не обратил на это внимания, если бы не видео, которые я смотрел. Я убедился, что у меня достаточно мощности, чтобы запустить полоску на полностью ярко-белом режиме перед кодированием., @Joey W

Еще одна мысль - вам следует избегать использования линейного регулятора мощности Arduino для питания больших нагрузок. Он не только имеет ограничения по току, но и не так эффективен, как импульсный источник питания., @st2000

Было бы очень показательно, если бы вы выполнили тест, описанный в этом ответе. Любой результат был бы интересен. Работает ли это или не работает., @st2000