想用按键中断产生一个随机数点亮WS2812灯环

2018-05-011.5万
AI 快速预览详细 收起
本文讨论了使用Arduino按键中断生成随机数点亮WS2812灯环时遇到的问题。代码示例展示了如何设置NeoPixel库、定义中断处理函数以及主循环中的灯环控制逻辑。问题在于stateChange函数中的delay(5000)导致多次中断响应叠加,从而同时点亮多个灯。解决方案是移除该延迟,确保每次中断只执行一次。
请教大家一个Arduino问题,想用按键中断产生一个随机数点亮WS2812灯环,但每次都同时点亮多个是哪里问题。

#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 16
Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);
int delayval = 1000;
volatile int state = LOW;

void setup() {
  // put your setup code here, to run once:
  strip.begin();
  strip.show();
  attachInterrupt(1, stateChange, CHANGE);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
for(int i=0; i<16; i++)
    {
      for(int a=0; a<16; a++)
      {
        if(a == i) strip.setPixelColor(a, 5, 15, 0);
        else strip.setPixelColor(a,0);
        strip.show();
        }
        delay(1000);
      }
  }

void stateChange()
{
      int r = random(15);
      strip.setPixelColor(r, 5, 25, 0);

      strip.show();
      Serial.println(r);
      delay(5000);
}


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
gada888
gada888
挺好的想法
二哈哈哈哈
二哈哈哈哈
因为你设置的是双边沿触发中断,相当于你按下会产生中断点亮一个灯,放开的时候也会产生中断,点亮一个灯。建议你将中断设置为,上升沿或下降沿触发,另外中断函数里面最好不要使用延时函数,里面内容尽量简短
- 没有更多了 -