Библиотека FastLed использует CRGB в качестве атрибута

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

//Number of leds powered
int led_state_1 = 0;
int led_state_2 = 0;
int led_state_3 = 0;

// This is an array of leds.  One item for each led in your strip.
CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
CRGB leds3[NUM_LEDS];

void CheckAndUpdateLed(CRGB LedArray, int led_state){
     resetLedStrip(LedArray);
     for(int whiteLed = 0; whiteLed < led_state; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      LedArray[whiteLed] = CRGB::White;
      // Show the leds (only one of which is set to white, from above)
      FastLED.show();
   }
}

Когда я меняю LedArray на leds1, он работает. Я вызываю функцию как CheckAndUpdateLed(leds1, led_state_1);


person marijn    schedule 14.04.2020    source источник
comment
Поскольку ваш массив leds1 является глобальным, нет необходимости передавать его в качестве аргумента. Каждая функция в вашем коде может просто получить к ней прямой доступ как leds1. Я думаю, у вас есть проблема с вызовом по значению и вызовом по ссылке, но нет необходимости это исправлять. Просто используйте leds1 и перестаньте пытаться передать его в качестве аргумента.   -  person Delta_G    schedule 14.04.2020
comment
@Delta_G Я хочу использовать одну и ту же функцию для светодиодов2 и светодиодов3, поэтому я пытаюсь передать ее в качестве аргумента   -  person marijn    schedule 15.04.2020
comment
Тогда не передавайте копию массива. Передайте указатель на него. Пройти CRGB*. Когда вы передаете такую ​​​​копию, копия обрабатывается, и когда функция заканчивается, ваш исходный массив не изменяется.   -  person Delta_G    schedule 15.04.2020
comment
@Delta_G правда сожалею об этом, у меня есть другое решение, теперь я его опубликовал   -  person marijn    schedule 15.04.2020


Ответы (1)


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

#define NUM_STRIPS 3
#define NUM_LEDS_PER_STRIP 15
CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];


int led_states[] = {0, 0, 0};    

void CheckAndUpdateLeds(){
      //resets the leds to black
      resetLedStrips();
      // This outer loop will go over each LED strip, one at a time
      for(int x = 0; x < NUM_STRIPS; x++) {
        // This inner loop will go over each led in the current strip, one at a time till the amount of light is the same as in the led_state
         for(int led = 0; led < led_states[x]; led = led + 1) {
          // Turn our current led on to white, then show the leds
          leds[x][led] = CRGB::White;
          FastLED.show();
        }
      }
    }

    void resetLedStrips(){
        for(int x = 0; x < NUM_STRIPS; x++) {
           for(int led = 0; led < NUM_LEDS_PER_STRIP; led = led + 1) {
             leds[x][led] = CRGB::Black;
           }
       }
    }
person marijn    schedule 15.04.2020