FastLED не работает должным образом
Я новичок в работе и программировании с Arduino. Проект, над которым я работаю, представляет собой цифровые часы, в которых используется цепочка светодиодов WS2812
, чтобы загорались правильные числа. Каждая цифра состоит из 7 светодиодов, а между второй и третьей цифрами есть два светодиода с двоеточием. Я использую библиотеку FastLED
, чтобы попытаться запрограммировать код. Я могу заставить светодиоды загораться так, чтобы все четыре цифры были одним и тем же числом (четыре пятерки подряд). Однако, как только я пытаюсь отобразить несколько разных чисел, все быстро идет наперекосяк. Вот несколько фотографий моих текущих результатов:
55:55. Я могу создать это с любым числом от 0 до 9.
Должно быть 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();
}
Кто-нибудь может объяснить, что происходит? Любая помощь будет принята с благодарностью. Дайте мне знать, если вам нужны разъяснения!
@jbryan, 👍2
Обсуждение1 ответ
Лучший ответ:
Ваша проблема заключается в использовании вами 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
- Улучшенное циклическое переключение цветов RGB.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- Мой код Arduino компилируется, когда я не вижу в нем ничего плохого
- Не удалось преобразовать «digitalWrite(8u, 1u)» из «void» в «bool»
- Как управлять 6 серводвигателями с помощью платы Arduino Mega?
что произойдет, если сначала выключить все светодиоды? ... попробуйте поставить
FastLED.show();
после последнего циклаfor
, @jsotolaЯ так пробовал и ничего не изменилось. У меня также есть
`
FastLED.clear();`
в настройках, поэтому он очищается по крайней мере один раз при загрузке программы., @jbryanНачните с написания скетча, который включает только один сегмент одной цифры, а все остальные выключает. Затем каждую секунду переходите к следующему сегменту. Вы можете найти проблему, будь то использование FastLED или аппаратного обеспечения. (Аппаратное, потому что похоже на проблему с мультиплексированием.), @the busybee