【发布时间】:2023-04-10 21:03:01
【问题描述】:
我买了一个 WS2812B 灯带。我正在尝试用红外遥控器控制它。它全部由 arduino uno 控制。
我知道 LED 工作,我知道远程工作。我正在尝试在遥控器上预编程一些动画。
下面的代码是据我所知。我可以显示一个动画,但我必须等到它结束才能将其更改为另一个。
当我按下按钮选择另一个动画时,是否可以中断这个(因为某些动画是无限的)?
#include <IRremote.h>
#include "FastLED.h"
#define NUM_LEDS 232
CRGB leds[NUM_LEDS];
#define PIN 7
const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
void setup(){
FastLED.addLeds<WS2812B, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
Serial.begin(9600);
irrecv.enableIRIn();
irrecv.blink13(true);
}
//switch case for remote
void loop(){
if (irrecv.decode(&results)){
if (results.value == 0XFFFFFFFF)
results.value = key_value;
switch(results.value){
case 0xFF30CF:
Serial.println("1");
RGBLoop();
break ;
case 0xFF18E7:
Serial.println("2");
red();
break ;
case 0xFF7A85:
Serial.println("3");
break ;
}
key_value = results.value;
irrecv.resume();
}
}
void RGBLoop(){
while(key_value==key_value){
for(int j = 0; j < 6; j++ ) {
// Fade IN
for(int k = 0; k < 256; k++) {
switch(j) {
case 0: setAll(k,0,0); break;
case 2: setAll(k,k,0); break;
case 3: setAll(0,k,0); break;
case 4: setAll(0,k,k); break;
case 5: setAll(0,0,k); break;
}
showStrip();
delay(3);
}
// Fade OUT
for(int k = 255; k >= 0; k--) {
switch(j) {
case 0: setAll(k,0,0); break;
case 2: setAll(k,k,0); break;
case 3: setAll(0,k,0); break;
case 4: setAll(0,k,k); break;
case 5: setAll(0,0,k); break;
}
showStrip();
delay(3);
}
}
}
}
void red(){
irrecv.resume();
setAll(0,255,255);
showStrip();
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }
老实说,我上网的大部分内容。这是我第一次编写 arduino。但到目前为止我喜欢它
【问题讨论】:
-
您必须重写这些动画,以免它们被阻塞。与其从头到尾遍历整个过程而不将控制权返回给程序的其余部分,而是需要编写这些函数,以便每次调用它们时计算经过的时间,看看是否是时间迈出一步,迈出一小步,然后走出去。与其调用一次来实现它,不如设置一个标志并从循环中调用它,这样它就会被一遍又一遍地调用。一千张海报已经完成了大约一千次。
-
谷歌你的动画名称和“非阻塞”这个词,也许你的 LED 灯条的名称,你可能会得到一些例子。
-
是的。这是可能的。
标签: arduino arduino-uno fastled