Проблема переключение режимов с RCSwitch
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Ребята, есть вопрос(для меня пока не решённый).
Суть какова. Пытаюсь реализовать переключение режимов 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(); }
А автор кода что говорит?
В примерах к библиотеке есть пример Simple-ReciveDemo или типа того. Внимательно изучите его loop(), там найдете то, чего не хватает в вашем скетче.
sadman41 Это - mySwitch.resetAvailable(); ?
Den01 - это вам только кажется, что вы понимаете логику. А на самом деле вы даже не подозреваете, в чем проблема. Тут не помогут никакие условия. Все эффекты в вашей программе написаны так, что их нельзя переключить, пока эффект не дойдет до конца. Они, что называется, написаны в "блокирующем режиме" - то есть полностью занимают все время контроллера, не позволяя ему принимать сигналы с пульта. Эффекты надо переписывать, другого пути нет
b707 спасибо за пояснение.