Hej,
mam pytanie, chciałem zrobić sobie przełączanie efektów pilocikiem IR - biblioteka to FastLED.h.
Pilot działa, i po restarcie mogę wybrać dowolny zaprogramowany efekt, niestety podczas pracy tego efektu nie jestem w stanie go przerwać, wyłączyć diod i wybrać kolejnego do czasu jego ukończenia (tak mniemam że czasem pilot zadziała jak efekt dobiegnie końca).
Poniżej kod, jest ktoś w stanie podpowiedzieć/podpowiedzieć/nakierować co zrobić by to działało tak jak chcę ?
Oraz czy jest opcja, by Arduino pamiętało jaki był ostatnio wybrany efekt i po zaniku napięcia wróciło do niego ?
Oraz by efekty leciały cały czas w pętli a nie jeden przebieg i stop
mam pytanie, chciałem zrobić sobie przełączanie efektów pilocikiem IR - biblioteka to FastLED.h.
Pilot działa, i po restarcie mogę wybrać dowolny zaprogramowany efekt, niestety podczas pracy tego efektu nie jestem w stanie go przerwać, wyłączyć diod i wybrać kolejnego do czasu jego ukończenia (tak mniemam że czasem pilot zadziała jak efekt dobiegnie końca).
Poniżej kod, jest ktoś w stanie podpowiedzieć/podpowiedzieć/nakierować co zrobić by to działało tak jak chcę ?
Oraz czy jest opcja, by Arduino pamiętało jaki był ostatnio wybrany efekt i po zaniku napięcia wróciło do niego ?
Oraz by efekty leciały cały czas w pętli a nie jeden przebieg i stop
// Biblioteki
#include "FastLED.h"
#include <IRremote.h>
// Pin pilota
#define irPin 2
// Piny i stałe Ledów
#define NUM_LEDS 39
CRGB leds[NUM_LEDS];
#define PIN 3
// Odbiornik pilota i kodowanie
IRrecv irrecv(irPin);
decode_results results;
void setup()
{
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
irrecv.enableIRIn(); // uruchomienie odbiornika IR
}
// *** REPLACE FROM HERE ***
void loop() {
if (irrecv.decode(&results)) {
switch (results.value) {
case 0xFFA25D: //przycisk off
TwinkleRandom(10000, 100, false);
break;
case 0xFF629D: //przycisk nr1
SnowSparkle(0x10, 0x10, 0x10, 20, random(100,1000));
break;
case 0xFFE21D: //przycisk nr2
rainbowCycle(20);
break;
}
irrecv.resume();
}
}
void rainbowCycle(int SpeedDelay) {
byte *c;
uint16_t i, j;
for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< NUM_LEDS; i++) {
c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
setPixel(i, *c, *(c+1), *(c+2));
}
showStrip();
delay(SpeedDelay);
}
}
byte * Wheel(byte WheelPos) {
static byte c[3];
if(WheelPos < 85) {
c[0]=WheelPos * 3;
c[1]=255 - WheelPos * 3;
c[2]=0;
} else if(WheelPos < 170) {
WheelPos -= 85;
c[0]=255 - WheelPos * 3;
c[1]=0;
c[2]=WheelPos * 3;
} else {
WheelPos -= 170;
c[0]=0;
c[1]=WheelPos * 3;
c[2]=255 - WheelPos * 3;
}
return c;
}
void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
setAll(red,green,blue);
int Pixel = random(NUM_LEDS);
setPixel(Pixel,0xff,0xff,0xff);
showStrip();
delay(SparkleDelay);
setPixel(Pixel,red,green,blue);
showStrip();
delay(SpeedDelay);
}
void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
setAll(0,0,0);
for (int i=0; i<Count; i++) {
setPixel(random(NUM_LEDS),random(0,255),random(0,255),random(0,255));
showStrip();
delay(SpeedDelay);
if(OnlyOne) {
setAll(0,0,0);
}
}
delay(SpeedDelay);
}
// *** REPLACE TO HERE ***
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
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();
}