logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

FastLED.h - jak przełączać efekty pilotem IR w trakcie działania?

Bullseye 12 Lis 2017 10:44 1284 8
  • #1 16817440
    Bullseye
    Poziom 27  
    Posty: 1454
    Pomógł: 55
    Ocena: 89
    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 :)

    // 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();
    }
  • #2 16817894
    adasikp
    Poziom 17  
    Posty: 283
    Pomógł: 24
    Ocena: 60
    "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ą ).
  • #3 16818495
    Bullseye
    Poziom 27  
    Posty: 1454
    Pomógł: 55
    Ocena: 89
    Ok, pętla działa, zaraz dodam pamięć,
    nie mniej, nie mam pojęcia co zrobić by zatrzymać pętlę i po kliknięciu odpowiedniego guzika przeszło do innego efektu który też będzie w pętli :(
  • #4 16819253
    adasikp
    Poziom 17  
    Posty: 283
    Pomógł: 24
    Ocena: 60
    while(1){
    if (irreceiver.decode(&results)){
    .
    .
    .
    if(results.value == kod przycisku ) break;
    irreceiver.resume();
    }
    }

    Wcześniej jeszcze z pętli efektu .
  • #6 16819405
    adasikp
    Poziom 17  
    Posty: 283
    Pomógł: 24
    Ocena: 60
    Tym który zostanie podany w warunku czyli nie musi być ten sam (według własnego widzimisię) .
    irreceiver.resume();- zeruje wybór .
  • #8 16819487
    adasikp
    Poziom 17  
    Posty: 283
    Pomógł: 24
    Ocena: 60
    Ale gdzie dodane może za złym nawisem "}" bo pisze że nie w pętli lub case.
  • #9 16819502
    Bullseye
    Poziom 27  
    Posty: 1454
    Pomógł: 55
    Ocena: 89
    Było:
    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:

    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(); 
    }
    }

Podsumowanie tematu

✨ Użytkownik pyta o możliwość przełączania efektów LED za pomocą pilota IR w bibliotece FastLED.h, tak aby można było przerwać aktualny efekt i wybrać nowy w trakcie jego działania. Odpowiedzi sugerują użycie pętli while oraz obsługę pilota w funkcjach efektów, co pozwoli na przerwanie efektu i przejście do innego. Dodatkowo, użytkownik chce, aby Arduino zapamiętywało ostatnio wybrany efekt po zaniku napięcia. Wskazówki obejmują użycie pamięci EEPROM oraz odpowiednie struktury pętli, aby efekty mogły działać w nieskończonej pętli.
Wygenerowane przez model językowy.
REKLAMA