首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neopixel条带动画切换问题

Neopixel条带动画切换问题
EN

Stack Overflow用户
提问于 2017-03-19 12:06:59
回答 1查看 336关注 0票数 1

我在床上放了一条Neopixels,用来做暗光。最近,我决定添加一个声音传感器,这样我就可以鼓掌一次来切换我正在使用的灯光动画。现在我遇到了让我的代码正常工作的问题。我可以把灯打开,但我不能再拍手把它们关掉。我怀疑的问题可能是,我只给出了在用于运行灯光动画的while循环结束时关闭灯光动画的条件,然而,我不知道我可以做些什么来解决这个问题。有人能帮帮我吗?

代码语言:javascript
复制
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
int soundSensor = 2;
int LED = 13;


void setup() 
{

// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  pinMode (soundSensor, INPUT);
  pinMode (LED, OUTPUT);
}

void loop()
{
  int toggle = 0;
  int statusSensor = digitalRead (soundSensor);

  if (statusSensor == 1 && toggle == 0)
  {
    toggle= 1;
    digitalWrite(LED, HIGH);
    //statusSensor = 0;
    statusSensor = digitalRead (soundSensor);
  }

    //NEOPIXEL CODE:
  while (toggle == 1)
  {
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED, LOW);
  delay(200);
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED, LOW);
  digitalWrite(LED,HIGH);
  colorWipe(strip.Color(255, 0, 0), 50);     // Red
  colorWipe(strip.Color(0, 255, 0), 50);     // Green
  colorWipe(strip.Color(255,255,255), 50);   //White
  colorWipe(strip.Color(255,255,255), 50);
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  rainbow(20);
  rainbowCycle(20);
  if(statusSensor == 1){
    toggle = 0;
  }
  }

  if (statusSensor == 1 && toggle == 1)
  {
    toggle = 0;
    digitalWrite(LED, LOW);
  }


}


//NEOPIXEL Functions:
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
EN

回答 1

Stack Overflow用户

发布于 2017-03-20 07:11:12

将切换设置为0时,不会向新像素条带写入任何颜色。所以它们将被留在它们所处的任何状态。您可以通过在将切换设置为零时将它们全部设置为“黑色”(即禁用)来修复此问题:

代码语言:javascript
复制
if(statusSensor == 1) {
    toggle = 0;
    for(uint16_t i=0; i<strip.numPixels(); i++) {
       strip.setPixelColor(strip.Color(0,0,0));
    }
    strip.show();
}

如果你只是想让它们立即出现,你不需要任何延迟,但也许你可以让它们淡出?

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

https://stackoverflow.com/questions/42882823

复制
相关文章

相似问题

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