Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

FastLED.h - przełączanie efektów pilotem IR

12 Nov 2017 10:44 936 8
  • Level 27  
    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 :)

    Code:
    // 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();
    }
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Level 17  
    "Oraz czy jest opcja, by Arduino pamiętało jaki był ostatnio wybrany efekt i po zaniku napięcia wróciło do niego ?" - Zapis do pamięci wybór https://www.arduino.cc/en/Reference/EEPROM
    "Oraz by efekty leciały cały czas w pętli a nie jeden przebieg i stop :)" -Zapętlić w funkcjach które ten efekt wykonują while(1){...} i dodać obsługę pilota w tych funkcjach by uzyskać możliwość opuszczenia pętli polecenie "break;" .Dotyczy to również przerwania danego efektu w dowolnej chwili i wskoczenie do funkcji "loop()"-(która notabene jest pętlą nieskończoną ).
  • Level 17  
    while(1){
    if (irreceiver.decode(&results)){
    .
    .
    .
    if(results.value == kod przycisku ) break;
    irreceiver.resume();
    }
    }

    Wcześniej jeszcze z pętli efektu .
  • Level 17  
    Tym który zostanie podany w warunku czyli nie musi być ten sam (według własnego widzimisię) .
    irreceiver.resume();- zeruje wybór .
  • Level 17  
    Ale gdzie dodane może za złym nawisem "}" bo pisze że nie w pętli lub case.
  • Level 27  
    Było:
    Code:
    void loop() {
    

    if (irrecv.decode(&results)) {

    switch (results.value) {

    case 0xFFA25D: //przycisk off
    TwinkleRandom(100, 100, false);
    break;

    case 0xFF629D: //przycisk nr1
    SnowSparkle(0x10, 0x10, 0x10, 20, random(100,1000));
    break;

    case 0xFFE21D: //przycisk nr2
    rainbowCycle(1);

    }
    irrecv.resume();
    }
    }


    A jest po poprawieniu:

    Code:
    void loop() {
    

    if (irrecv.decode(&results)) {

    switch (results.value) {

    case 0xFFA25D: //przycisk off
    TwinkleRandom(100, 100, false);
    break;

    case 0xFF629D: //przycisk nr1
    SnowSparkle(0x10, 0x10, 0x10, 20, random(100,1000));
    break;

    case 0xFFE21D: //przycisk nr2
    rainbowCycle(1);

    }
    irrecv.resume();
    if(results.value == 0xFF38C7 ) break;
    irreceiver.resume();
    }
    }