首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >褪色Adafruit neopixels

褪色Adafruit neopixels
EN

Stack Overflow用户
提问于 2021-01-05 18:39:10
回答 1查看 2.8K关注 0票数 0

我想为我的走廊设计一个运动控制的夜光。在我的项目中

  • Arduino Uno
  • PIR传感器
  • WS2812b RGBW光带
  • 5V功率库驱动LED

在对我的灯条进行了修补之后,我设法让Red打开并褪色到一种低红色,然后延迟,并最终淡出到它们关闭的地方。据我所知,Neopixel库的最大光强为255。然而,当我们谈论夜光时,我估计小于20的值足以照亮我的走廊。(我应该注意到,我看到了许多建议,在LED条前面放置一个电阻器,在电源上安装一个电容器--这会影响强度吗?)因此,灯不会平滑地褪色/关闭,而是在关闭前通过较低的强度因此,我的问题是,如果你知道有什么办法创造一个更顺利的褪色?下面是我目前的代码。请注意,我必须在底部插入具体的线条才能真正关闭leds,因为将亮度设置为"0“显然并没有起到什么作用--我在这里遗漏了什么吗?

理想情况下,我希望能够规定LED需要多长时间才能淡入/熄灭。

提前感谢

代码语言:javascript
复制
#include <Adafruit_NeoPixel.h>

#define LED_PIN     6

#define LED_COUNT  30 // How many NeoPixels are attached to the Arduino?
#define High_Intensity 20
#define Low_Intensity 1

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel. Avoid connecting
// on a live circuit... if you must, connect GND first.

void setup() {
  strip.begin();
  strip.show(); // initialize all pixels to "off"
}

void loop() {
  brighten();
  darken();
}

// 0 to 255
void brighten() {
  uint16_t i, j;

  for (j = Low_Intensity; j < High_Intensity; j++) {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, j, 0, 0);
    }
    strip.show();
    delay(50);
  }
  delay(500);
}

// 255 to 0
void darken() {
  Serial.begin(9600);
  uint16_t i, j;

  for (j = High_Intensity; j > 1; j--) { 
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, j, 0, 0);
    }
    strip.show();
    delay(100);
    Serial.println(j);
  }
  // Turn leds back off
  for(int i=0; i<60; i++)  {
  strip.setPixelColor(i, 0);
  strip.show();}
  delay(5000);
}
EN

回答 1

Stack Overflow用户

发布于 2021-01-05 22:36:32

关于主题以外的部分(我不打算详述)

电源引线之间的电容将保护Neopixels控制器免受突然电压变化的影响,这是因为每个像素都使用PWM驱动leds。

电阻器终止通信线路,从而减少电线中的反射。

既提高了性能,又降低了像素损坏的风险。因此,你应该使用它们。确保你用在正确的引脚上。网上有很多关于如何正确控制Neopixel字符串的信息。

(我应该注意到,我看到了许多建议,在LED条前面放置一个电阻,在电源上设置一个电容器--这会影响强度吗?)

这不会影响强度!强度仅由像素的pwm信号和提供的电流控制。

规划-明智:

据我所知,

的最大光强值为255。

是的亮度由3个值控制,红色,绿色和蓝色的范围从0(关闭)到255 (最大亮度)。这是led彩色通道的工作周期。这使你在整个亮度范围内的亮度分辨率为256。(8位)。

,我的问题是,如果你知道有什么办法创造一个更顺利的褪色?

这造成了一个问题。如果你想在一个较低的亮度范围内工作,你只有非常有限的步骤可以淡出。

那么,如果我们减少提供leds的电流呢?由于控制和led电源电压通常通过同一钢轨供电,因此无法在保持8位分辨率的同时使整个带钢变暗。

若要控制衰落时间,请更改每个值更新之间的延迟时间。记住人类视觉的有限的活力和持久性。任何出现<30 Any的可见亮度变化都会导致一个明显的步骤。

下面的

是目前为止我的代码。请注意,我必须在底部插入具体的线条才能真正关闭leds,因为将亮度设置为"0“显然并没有起到什么作用--我在这里遗漏了什么吗?

代码语言:javascript
复制
for (j = High_Intensity; j > 1; j--) 

在使条带变暗的循环中,您可以在j > 1时运行循环。所以你设置的最后一个亮度值是2,它显然不是0

代码语言:javascript
复制
for (j = High_Intensity; j > -1; j--)

应该能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65584699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档