Создание блоков из 10 светодиодов

#arduino

#arduino #arduino-c

Вопрос:

Я хочу 10 красных светодиодов и следующие 10 белых светодиодов, и это повторяется до тех пор, пока я не дойду до конца светодиодной цепочки.

Это худший код, но он работает.

Как правильно это сделать? Это должно быть очень просто, но я не могу понять это

 void Brabant() {
  for (int i = 0; i < NUM_LEDS; i = i   20) {
    if (i < NUM_LEDS) {
      leds[i] = CRGB::Red;
      leds[i   1] = CRGB::Red;
      leds[i   2] = CRGB::Red;
      leds[i   3] = CRGB::Red;
      leds[i   4] = CRGB::Red;
      leds[i   5] = CRGB::Red;
      leds[i   6] = CRGB::Red;
      leds[i   7] = CRGB::Red;
      leds[i   8] = CRGB::Red;
      leds[i   9] = CRGB::Red;
      FastLED.show();
    }
  }
  for (int i = 10; i < NUM_LEDS; i = i   20) {
    if (i < NUM_LEDS) {
      leds[i] = CRGB::White;
      leds[i   1] = CRGB::White;
      leds[i   2] = CRGB::White;
      leds[i   3] = CRGB::White;
      leds[i   4] = CRGB::White;
      leds[i   5] = CRGB::White;
      leds[i   6] = CRGB::White;
      leds[i   7] = CRGB::White;
      leds[i   8] = CRGB::White;
      leds[i   9] = CRGB::White;
      FastLED.show();
    }
  }
}
  

Ответ №1:

Вы могли бы заменить:

 leds[i] = CRGB::White;
leds[i   1] = CRGB::White;
leds[i   2] = CRGB::White;
leds[i   3] = CRGB::White;
leds[i   4] = CRGB::White;
leds[i   5] = CRGB::White;
leds[i   6] = CRGB::White;
leds[i   7] = CRGB::White;
leds[i   8] = CRGB::White;
leds[i   9] = CRGB::White;
  

с:

 for (int j = 0; j < 10; j  ) {
  leds[i   j] = CRGB::White;
}
  

Кроме того, вам нужно изменить свой i < NUM_LEDS на что-то более безопасное; цикл после него может выходить на 10 светодиодов дальше i и, следовательно, дальше NUM_LEDS .

Ответ №2:

Вы могли бы использовать что-то вроде этого (все еще не «хорошо выглядящий, но, возможно, немного лучше)

 for (int i = 0; i < NUM_LEDS; i = i   20) {
    if (i < NUM_LEDS) {
        for (int a = 0; a < 10; a  ) {
            leds[i a] = CRGB::Red;
        }

        FastLED.show();
    }
}
for (int i = 10; i < NUM_LEDS; i = i   20) {
    if (i < NUM_LEDS) {
        for (int a = 0; a < 10; a  ) {
            leds[i a] = CRGB::White;
        }
        FastLED.show();
    }
}
  

Убедитесь, что светодиоды [i a] никогда не становятся больше длины массива светодиодов

Может быть, что-то подобное тоже сработает (но не уверен, я не знаю библиотеку FastLED)

 for (int i = 0; i < (NUM_LEDS-20); i = i   20) { //(NUM_LEDS-20) so that i a 10 never gets bigger than NUM_LEDS
    if (i < NUM_LEDS) {
        for (int a = 0; a < 10; a  ) {
            leds[i a] = CRGB::Red;
            leds[i a 10] = CRGB::White;
        }

        FastLED.show();
    }
}