@technotrasher,
Что касается fastled, то ее основал вполне разбирающийся человек, но он умер и сейчас проект тоже в виде зомби существует, на поддержке других контрибьюторов. Следовательно вам нужно принять некоторые меры чтобы код не работал странно.
1. Яркость не должна дергаться постоянно, т.е. FastLED.setBrightness(50); выставляется однократно, дальше не трогайте
2. Метод show() не должен дергаться постоянно, в идеале его вызывать по таймеру, в главном цикле, т.е. допустим каждые 1/50 секунды, получив при этом 50 кадров в секунду. Вызов должен быть один, т.е. единая точка отображения кадра. Если этого не сделать, то могут быть либо мерцания, либо другие загадочные эффекты с яркостью.
3. Следует учитывать, что и выставление яркости и ограничение по току работают совместно. Ограничение по току не позволит поднять яркость выше какого-то лимита, к примеру, если вы выставите 1А ограничение по току, то яркость можно будет менять в пределах от 0...90 (верхнее значение с потолка, для понимания идеи), а дальше от 90+ до 255 она уже не будет меняться, а будет зафиксирована ограничением тока. Также следует учитывать, что коррекция гаммы влияет на то, как отображаются цвета на минимальной глобальной яркости (0...10), либо когда составляющая V в CHSV низкая при высокой глобальной, либо когда составляющие CRGB малых значений по всем цветовым каналам... Суть влияния - неравномерность зажигания отдельных каналов цвета, если выбрана неверная коррекция. Объясение: допустим красный будет загораться начиная с 1, синий начиная с 10, а зеленый начиная с 3, тогда выставив белый (все каналы включены) но на 1 глобальной яркости вы увидите лишь красный, остальных цветов просто не будет, начиная с 3 у вас уже бдет подмешан зеленый к красному, но красный будет на уровне 3, а зеленый на минимальном уровне, и лишь начиная с 10 у вас уже будет все 3 составляющие, но синий на минимальном уровне - итоговый цвет будет отдаленно напоминать белый, скорее оранжевый, даже ближе к красному. Ну и только на относительно больших яркостях эти расхождения нивелируются и где-то на 50 яркости вы увидите относительно белый цвет, хотя в реальности это будет 50, 47, 40 по каналам.
* К примерам в вики и документации по фастлед нужно относиться критически, т.к. их писали не те же люди, которые создавали библиотеку))). По крайней мере недавний пример с бегущей точкой явно написан рукожопами (лень искать тему) и так делать не нужно.
Исходя из того, что я написал выше, ваш код можно изменить так:
#define NUM_LEDS 180
#include "FastLED.h"
#define LED_PIN 12
CRGB leds[NUM_LEDS];
byte rainbow_steps;
byte RAINBOW_PERIOD = 4;
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); //.setCorrection(0xFFB0D0); // она вам нужна???
FastLED.setBrightness(50); // ок, ограничили глобальную яркость в 50
}
void loop() {
EVERY_N_MILLIS(30){
rainbow_steps -= 1; // counter меняется от 0 до 255 (тип данных byte)
}
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CHSV((rainbow_steps + i) * RAINBOW_PERIOD, 255, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
}
EVERY_N_MILLIS(20){
FastLED.show();
}
}
* Писал с головы, без проверки, могут быть мелкие неточности.