Проблема переключение режимов с RCSwitch

Den01
Offline
Зарегистрирован: 13.07.2020

Доброго времени суток. 

Ребята, есть вопрос(для меня пока не решённый).

Суть какова. Пытаюсь реализовать переключение режимов ws2812b с помощью радио пульта(имеется пульт на n количество кнопок, каждая кнопка - свой режим). Кое что, как на мой взгляд, вроде работает, а именно включение режима по заданной кнопке с пульта. Всё "крутиться", моргает... НО переключиться на другой режим не могу( Только reset и нажатие кнопки другого режима... Логику понимаю, что нужно задать условие на сравнение или ещё кое что, но пока не могу сам решить.

Не пинайте сильно, я только пытаюсь реализовывать кое какие штучки под себя. Буду очень признателен за любые навеянные мысли по поводу решения моей проблемы(особенно наглядно!). За ранее спасибо!

Вот собственно и код

#include "FastLED.h"
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

#define BUTTON_1          12469761  
#define BUTTON_2          12469765  
#define BUTTON_3          12469768  

#define NUM_LEDS 60 
CRGB leds[NUM_LEDS];
#define PIN_LED 10 

void setup()
{
  Serial.begin(9600);
  FastLED.addLeds<WS2811, PIN_LED, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  mySwitch.enableReceive(1);  // Receiver on inerrupt 1 => that is pin #3
}

// *** REPLACE FROM HERE ***
void loop() { 
  if (mySwitch.available()) {    
    int value = mySwitch.getReceivedValue();
      
    switch(value) {
    
    case BUTTON_1  : {
                // RGBLoop - no parameters
                Serial.println("RGBLoop");
                RGBLoop();
                break;
    }

    case BUTTON_2  : {
                // FadeInOut - Color (red, green. blue)
                Serial.println("FadeInOut");
                FadeInOut(0xff, 0x00, 0x00); // red
                FadeInOut(0xff, 0xff, 0xff); // white 
                FadeInOut(0x00, 0x00, 0xff); // blue
                break;
    }
              
    case BUTTON_3  : {
                // Strobe - Color (red, green, blue), number of flashes, flash speed, end pause
                Serial.println("Strobe");
                Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
                break;
    } 
  }
}
}

// *************************
// ** LEDEffect Functions **
// *************************

void RGBLoop(){
  for(int j = 0; j < 3; j++ ) { 
    // Fade IN
    for(int k = 0; k < 256; k++) { 
      switch(j) { 
        case 0: setAll(k,0,0); break;
        case 1: setAll(0,k,0); break;
        case 2: 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 1: setAll(0,k,0); break;
        case 2: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}

void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;
      
  for(int k = 0; k < 256; k=k+1) { 
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
     
  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    showStrip();
    delay(FlashDelay);
    setAll(0,0,0);
    showStrip();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}

// ***************************************
// ** FastLed/NeoPixel Common Functions **
// ***************************************

// Apply LED color changes
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

// Set a LED color (not yet visible)
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
}

// Set all LEDs to a given color and apply it (visible)
void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

А автор кода что говорит?

sadman41
Offline
Зарегистрирован: 19.10.2016

В примерах к библиотеке есть пример Simple-ReciveDemo или типа того. Внимательно изучите его loop(), там найдете то, чего не хватает в вашем скетче.

Den01
Offline
Зарегистрирован: 13.07.2020

sadman41 Это - mySwitch.resetAvailable(); ?

b707
Offline
Зарегистрирован: 26.05.2017

Den01 - это вам только кажется, что вы понимаете логику. А на самом деле вы даже не подозреваете, в чем проблема. Тут не помогут никакие условия. Все эффекты в вашей программе написаны так, что их нельзя переключить, пока эффект не дойдет до конца. Они, что называется, написаны в "блокирующем режиме" - то есть полностью занимают все время контроллера, не позволяя ему принимать сигналы с пульта. Эффекты надо переписывать, другого пути нет

Den01
Offline
Зарегистрирован: 13.07.2020

b707 спасибо за пояснение.