FastLED не работает должным образом

Я новичок в работе и программировании с Arduino. Проект, над которым я работаю, представляет собой цифровые часы, в которых используется цепочка светодиодов WS2812, чтобы загорались правильные числа. Каждая цифра состоит из 7 светодиодов, а между второй и третьей цифрами есть два светодиода с двоеточием. Я использую библиотеку FastLED, чтобы попытаться запрограммировать код. Я могу заставить светодиоды загораться так, чтобы все четыре цифры были одним и тем же числом (четыре пятерки подряд). Однако, как только я пытаюсь отобразить несколько разных чисел, все быстро идет наперекосяк. Вот несколько фотографий моих текущих результатов:

55:55. Я могу создать это с любым числом от 0 до 9.

55:55. Я могу создать это с любым числом от 0 до 9.

Должно быть 12:34.

Должно быть 12:34.

Вот код, с которым я сейчас работаю:

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime now;

#define NUM_LEDS 30
#define LED_PIN 6

CRGB leds[NUM_LEDS];

void setup() {
  // put your setup code here, to run once:

  Serial.begin(57600);

  FastLED.addLeds<WS2812, LED_PIN>(leds, NUM_LEDS);

  FastLED.clear();
}

void loop() {
  // put your main code here, to run repeatedly:

  const int ZERO[]={0,1,2,4,5,6};
  const int ONE[]={2,6};
  const int TWO[]={0,1,3,5,6};
  const int THREE[]={1,2,3,5,6};
  const int FOUR[]={2,3,4,6};
  const int FIVE[]={1,2,3,4,5};
  const int SIX[]={0,1,2,3,4,5};
  const int SEVEN[]={2,5,6};
  const int EIGHT[]={0,1,2,3,4,5,6};
  const int NINE[]={2,3,4,5,6};

  
  for(int i=0; i<sizeof(ONE);i++){
        leds[ONE[i]]=CRGB::Red;
        FastLED.show();
      }

  for(int i=0; i<sizeof(TWO);i++){
        leds[TWO[i]+7]=CRGB::Red;
        FastLED.show();
     }

  for(int i=0; i<sizeof(THREE);i++){
        leds[THREE[i]+16]=CRGB::Red;
        FastLED.show();
      }

  for(int i=0; i<sizeof(FOUR);i++){
        leds[FOUR[i]+23]=CRGB::Red;
        FastLED.show();
      }

Кто-нибудь может объяснить, что происходит? Любая помощь будет принята с благодарностью. Дайте мне знать, если вам нужны разъяснения!

, 👍2

Обсуждение

что произойдет, если сначала выключить все светодиоды? ... попробуйте поставить FastLED.show(); после последнего цикла for, @jsotola

Я так пробовал и ничего не изменилось. У меня также есть `FastLED.clear();` в настройках, поэтому он очищается по крайней мере один раз при загрузке программы., @jbryan

Начните с написания скетча, который включает только один сегмент одной цифры, а все остальные выключает. Затем каждую секунду переходите к следующему сегменту. Вы можете найти проблему, будь то использование FastLED или аппаратного обеспечения. (Аппаратное, потому что похоже на проблему с мультиплексированием.), @the busybee


1 ответ


Лучший ответ:

2

Ваша проблема заключается в использовании вами sizeof(). Он делает не то, что вы думаете.

sizeof() дает вам объем памяти, который занимает переменная. Он не дает вам количество элементов в массиве.

Например:

const int ONE[]={2,6};

sizeof(ONE) не даст вам 2. Он даст вам 4. int имеет размер два байта (16 бит). Таким образом, массив из 2 целых чисел равен 2x2 = 4 байта.

Поэтому, когда вы перебираете 2-байтовый массив, но считаете от 0 до 3, вы переполняете свой массив и читаете из следующих битов памяти, которые оказываются первыми двумя элементами TWO массив в этом случае.

Чтобы получить количество элементов в массиве, вы должны разделить sizeof() на размер типа переменной, из которой состоит массив. Наиболее распространенный способ сделать это:

sizeof(ONE) / sizeof(ONE[0])

Обычно во время создания массива настраиваются некоторые макросы, чтобы вы могли легко обращаться к ним позже:

const int ONE[]={2,6};
#define ONE_SIZE (sizeof(ONE) / sizeof(ONE[0]))

Вам также следует рассмотреть возможность использования массива byte (или, что лучше, стандартного uint8_t), где размер одного элемента будет равен 1, а не 2, поскольку вы не не нужно хранить любое число > 255. По-прежнему полезно выполнять деление sizeof() даже с размером в 1 байт на случай, если вам когда-нибудь понадобится изменить тип переменной в будущем. Это также хорошая привычка.

,

Это НАСТОЛЬКО многое объясняет! Теперь это работает. Благодарю вас!, @jbryan