0

我有个问题。我正在使用 Arduino 控制我的 WS2812B,但我的呼吸效果有问题。我在代码中创建了一个类,如下所示:

String breathDirection = "Down";

void breath_effect()
{
fill_solid(leds, TOTAL_LEDS, primary);
float currentBrightness = FastLED.getBrightness();

if (currentBrightness <= 1)
{
  breathDirection = "Up";
}
else if (currentBrightness >= brightness)
{
  breathDirection = "Down";
}

float brightnessCorrection = static_cast<float>(brightness) / 200;
if (breathDirection == "Down")
{
  currentBrightness = currentBrightness - brightnessCorrection;
  FastLED.setBrightness(currentBrightness);
}
else if (breathDirection == "Up")
{
  Serial.println("Binnen");
  Serial.println(currentBrightness);
  currentBrightness = currentBrightness + brightnessCorrection;
  Serial.println(currentBrightness);
  FastLED.setBrightness(currentBrightness);
}
}

现在呼吸效果仅在brightness变量设置为 200 时有效。如果我将其设置为低于 200 的其他值,它会下降,但永远不会上升。currentBrightness 是每一轮相同的值。这里出了什么问题?

4

3 回答 3

0

您需要设置全局变量:

//全局范围:

const float _brightInterval = 1.0f;
const float _maxBright = 255.0f; //i'm not sure whats your max bright here
const float _minBright = 1.0f;

float _brightness = _maxBright;

而不是字符串,我会使用状态。它更快并且节省内存。

enum states
    {
        hold,
        down,
        up
    };
states _state;

然后在循环中做这样的事情:

switch (_state)
    {
    case states::down:
        _brightness -= _brightInterval;
        break;
    case states::up:
        _brightness += _brightInterval;
        break;
    case states::hold:
        _brightness -= _brightInterval / 10.0f; //hold makes it go down but in a lower rate.
    default:
        break;
    }

    if (_brightness >= _maxBright)
        _state = states::hold;
    else if (_brightness <= (_maxBright - 50.0f) && _state == states::hold)
        _state = states::down;
    else if (_brightness <= _minBright)
        _state = states::up;

FastLED.setBrightness(_brightness);

尝试更改这些值以达到您想要的效果。第二个 if 中的 (_maxBright - 50.0f) 是它开始加速向下的步骤。将其更改为可能 (_maxBright - 10.0f)

于 2020-03-24T17:27:09.240 回答
0

最好的办法是在纸上写一些有价值的例子,然后手动演练你的呼吸逻辑。我在第一次快速浏览时看到的一些问题:

if (currentBrightness <= 0)  ==>    if (currentBrightness == 0) // truncate float to uint8_t

所以这里我们只有在 0 时才有 up,​​如果它是 1,则跳过这种情况。恕我直言,逻辑必须是

     if (currentBrightness == 0 || brightness > currentBrightness)
      {
          breathDirection = "Up";
      } 
      else if (currentBrightness == 255 || currentBrightness >= brightness)
  ....

在这里使用浮点数没有任何意义,因为端口只接受 0 到 255 之间的值。如果传递浮点数,则通过将其转换为 uint8_t 将其截断。绘制状态图有助于处理这样的逻辑。除以 200 时,值 < 200 始终为 0(整数除法)

于 2020-03-24T17:29:34.863 回答
0

您可以尝试使用呼吸函数,它只是一种波型函数,例如圆波、三角波或高斯波。这是一个三角波示例(取自我的教程:Arduino Breathing LED Functions):

// RGB LED Triangle Wave Breathing LED

int led_pins[4] = {3,5,6};
int jj = 0; // 0 = red, 1 = green, 2 = blue
float smoothness_pts = 500;//larger=slower change in brightness

void setup() {
  Serial.begin(9600);
  for (int ii = 0;ii<sizeof(led_pins)/sizeof(int);ii++){
    pinMode(led_pins[ii],OUTPUT);
  }
}

void loop() {
  for (int ii=0;ii<smoothness_pts;ii++){
    float pwm_val = 255.0*(1.0 -  abs((2.0*(ii/smoothness_pts))-1.0));
    analogWrite(led_pins[jj],int(pwm_val));
    delay(5);
    Serial.println(int(pwm_val));
  }
}

您可以将 float 'pwm_val' 中的亮度参数设置为 1 - 255 之间的任何值(此处为 255.0,默认情况下(Arduino 上 PWM 的最大值))。这是打印到串行绘图仪的结果“呼吸”配置文件:

RGB LED三角呼吸功能

于 2020-04-10T16:52:58.740 回答