@san41to

Как сделать вход и выход в режим еффектов в Ардуино с ИК Пульта для светодиодной ленты?

При нажатии на кнопку UP или Down не переключает еффект и при нажатии на статический цвет ничего не происходит. Как сделать отмену режима еффектов. В мониторе после входа в режим ефф. данные с пульта прекращают считиваться

#include <IRremote.hpp>
#include "FastLED.h"

#define RECEIVE_PIN 2
#define LEDPIN     13

#define LED_TYPE     NEOPIXEL
#define NUM_LEDS    256

#define MAXBRG 250
#define MINBRG 15
#define EFFCOUNT 5

CRGB leds[NUM_LEDS];
CRGB endclr;
CRGB midclr;

int brg = 130;
bool eff = false;
int numEff = 0;

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(RECEIVE_PIN);
  FastLED.addLeds<LED_TYPE, LEDPIN>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(brg);
  fill_solid(leds, NUM_LEDS, CRGB::White);
  FastLED.show();
}

void loop() {
  if (IrReceiver.decode()) {
    uint8_t gHue = 0;
    FastLED.delay(1000 / 120);
    EVERY_N_MILLISECONDS( 20 ) {
      gHue++;
    }

    if (IrReceiver.decodedIRData.protocol==8) {
      byte   Command;
      Command = IrReceiver.decodedIRData.command % 256;

      IrReceiver.printIRResultShort(&Serial);
      switch (Command) {
        case 0x18 : {
            // код для выполнения +brg
            brg = brg + 5;
            if (brg > MAXBRG) {
              brg = MAXBRG;
            }
            FastLED.setBrightness(brg);
            FastLED.show();
            break;
          }
        case 0x52: {
            // код для выполнения -brg
            brg = brg - 5;
            if (brg < MINBRG) {
              brg = MINBRG;
            }
            FastLED.setBrightness(brg);
            FastLED.show();
            break;
          }
        case 0x19: {
            // код для выполнения 0
            eff = false;
            fill_solid(leds, NUM_LEDS, CRGB::White);
            FastLED.show();
            break;
          }
        case 0x45: {
            eff = false;
            // код для выполнения 1
            fill_solid(leds, NUM_LEDS, CRGB::Red);
            FastLED.show();
            break;
          }


        case 0x46: {
            eff = false;
            // код для выполнения 2
            fill_solid(leds, NUM_LEDS, CRGB::Blue);
            FastLED.show();
            break;
          }
        case 0x47: {
            eff = false;
            // код для выполнения 3
            fill_solid(leds, NUM_LEDS, CRGB::Green);
            FastLED.show();
            break;
          }
        case 0x44: {
            eff = false;
            // код для выполнения 4
            fill_solid(leds, NUM_LEDS, CRGB::Yellow);
            FastLED.show();
            break;
          }
        case 0x40: {
            eff = false;
            // код для выполнения 5
            fill_solid(leds, NUM_LEDS, CRGB::Purple);
            FastLED.show();
            break;
          }
        case 0x43: {
            eff = false;
            // код для выполнения 6
            fill_solid(leds, NUM_LEDS, 0xBBCC00);
            FastLED.show();
            break;
          }
        case 0x7: {
            eff = false;
            // код для выполнения 7
            fill_solid(leds, NUM_LEDS, 0x00BBCC);
            FastLED.show();
            break;
          }
        case 0x15: {
            eff = false;
            // код для выполнения 8
            fill_solid(leds, NUM_LEDS, 0xCC00BB);
            FastLED.show();
            break;
          }
        case 0x1C: {
            eff = false;
            // код для выполнения 9
            fill_solid(leds, NUM_LEDS, CRGB::Black);
            FastLED.show();
            break;
          }
        case 0xD: {
            // код для выполнения CH- (#) rainbow
            fill_rainbow( leds, NUM_LEDS, 64, 1);
            FastLED.show();
            break;
          }
        case 0x16: {
            // код для выполнения CH+ (*) вход в режим еффектов
            eff = true;
            delay(150);
            break;
          }
        case 0x5A: {
            // код для выполнения >> (UP) номер еффекта +1
            if (eff) {
              numEff++;
            }
            if (numEff > EFFCOUNT) {
              numEff = 0;
            }
            delay(150);
         
            break;
          }
        case 0x8: {
            // код для выполнения << (DOMW) номер ефекта -1
            if (eff) {
              numEff--;
            }
            if (numEff < 0) {
              numEff = EFFCOUNT;
            }
            delay(150);
            break;
          }
        default: {
            // код для выполнения
          }
      }

    }
    IrReceiver.resume();
  }
// Serial.println(numEff, DEC);
  if (eff) {
    switch (numEff) {
      case 0: {       //effect 0
   /*       fadeToBlackBy( leds, NUM_LEDS, 130);
          int pos = random16(NUM_LEDS);
          leds[pos] = CRGB::Green;
          FastLED.show();*/
          break;
        }
      case 1: {       // effect 1

          uint8_t speed = beatsin8(8, 0, 255);
          endclr = blend(CRGB::Yellow, CRGB::Blue, speed);
          midclr = blend(CRGB::Blue, CRGB::Yellow, speed);

          fill_gradient_RGB(leds, 0, endclr, NUM_LEDS / 2, midclr);
          fill_gradient_RGB(leds, NUM_LEDS / 2 + 1, midclr, NUM_LEDS, endclr);
          FastLED.show();

          break;
        }
      case 2: {          // effect 2
          Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
          break;
        }
      case 3: {
          // effect 3
          setAll(0, 0, 0);
          addGlitter(60);
          FastLED.show();
          break;
        }
      case 4: {          // effect 4
  TwinkleRandom(20, 100, false);
          break;
        }
      case 5: {          // effect 5
          SnowSparkle(0x10, 0x10, 0x10, 20, random(100,1000));
          break;
        }
      default: {
          // код для выполнения}
        }
    }
  }


}



// Apply LED color changes
void showStrip() {
  if (IrReceiver.isIdle()) {
    FastLED.show();
  }
}

// Set a LED color (not yet visible)
void setPixel(int Pixel, byte red, byte green, byte blue) {

  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;

}

// 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();
}
//<——————————————————————OTHER FUNCTIONS————————————————————>
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);
}
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 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);
  }
}



void addGlitter( fract8 chanceOfGlitter)
{ if ( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 1
@kalapanga
Суть проблемы изложена в описании библиотеки IRRemote: https://github.com/Arduino-IRremote/Arduino-IRremo...
Там же есть ссылка на страничку, где товарищ пытается найти решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы