Проблема переключение режимов с 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 спасибо за пояснение.