Fastled terug naar eerste loop neopixel

Ik heb 2 led strips van neopixel gekoppeld aan een arduino nano
Ook heb ik er een knop op gekoppeld
en de knop werkt en speelt zo de volgorde van de effecten af.

Nu wil ik bij de laatste loop als die daar mee klaar is
Dat hij terug gaat naar loop 1 en daar blijft.
tot dat de knop weer word bedient

Ik moet er bij zeggen voor mij is het redelijk nieuw
Maar voor mij hoeft er alleen nog dat ene probleempje in de sketch
Dan kan ik verder met het project.

alvast bedankt

c code:


#include "FastLED.h"
#include <EEPROM.h>
#define NUM_LEDS 4
CRGB leds[NUM_LEDS];
#define PIN 4

#define BUTTON 2
byte selectedEffect=2;

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  digitalWrite (BUTTON, HIGH);  // internal pull-up resistor
  attachInterrupt (digitalPinToInterrupt (BUTTON), changeEffect, CHANGE); // pressed
}

// *** REPLACE FROM HERE ***
void loop() {
  EEPROM.get(0,selectedEffect);
 
  if(selectedEffect>1) {
    selectedEffect=0;
    EEPROM.put(0,0);
  }
 
  switch(selectedEffect) {

    case 0 : {
      //RGBLoop - no parameters
      RGBLoop();
      break;
    }

    case 1 : {
      // LED 1 by 1
      LEDloop();
      
    }

    case 2 : {
      //Strobe
      Strobe(0xff, 0xff, 0xff, 3, 100, 500);
    
    }
  }
}

void changeEffect() {
  if (digitalRead (BUTTON) == HIGH) {
    selectedEffect++;
    EEPROM.put(0, selectedEffect); // store the chose effect
    asm volatile ("  jmp 0");      // reset the Arduino
  }
}




// LED EFFECTS FUNCTIONS

void RGBLoop(){
  for(int j = 0; j < 3; j++ ) { 
    // Fade IN
    for(int k = 40; k < 256; k++) { 
      switch(j) { 
        case 0: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 40; k--) { 
      switch(j) { 
        case 0: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}

void LEDloop() {
  leds[0] = CRGB(255, 0, 0);
  FastLED.show();
  delay(320);  
  leds[1] = CRGB(255, 0, 0);
  FastLED.show();
  delay(320);
  leds[2] = CRGB(255, 0, 0);
  FastLED.show();
  delay(320);
  leds[3] = CRGB(255, 0, 0);
  FastLED.show();
  delay(100);
}


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

Het uitlezen van de EEPROM hoef je in principe maar één keer te doen, dus verplaats dit naar de setup. De if die daar op volgt plaats je in de changeEffect() ISR. Het is immers daar waar je selectedEffect vermeerderd. Het resetten van de Arduino via inline assembly om zo het nieuwe effect te kunnen starten is niet bepaald "proper", dat moet anders kunnen. Ik zou de delay routine aanpassen, door bv telkens een paar ms te wachten en vervolgens te controleren of de drukknop is ingedrukt. Indien dit het geval is beëindig je het effect, in het andere geval wacht je opnieuw.

c code:


void changeEffect() {
 if(digitalRead(BUTTON) == HIGH) {
  buttonPressed = 1;

  if(++selectedEffect > 2) {
   selectedEffect = 0;
  }

  EEPROM.put(0, selectedEffect);
 }
}

uint8_t delay(uint8_t x, uint8_t y) {

 while(y > 0) {
  if(buttonPressed) {
   buttonPressed = 0;
   return 1;
  }

  delay(x);
  y--;
 }

 return 0;
}

void effect() {

 // pseudo code

 uint8_t state = 0;
 uint8_t run = true;
 
 
 while(run) {
  
  switch(state) {
   
   case 1 : {
    // set red
    if(delay(10, 100)) {
     state = 0;
    }else {
     state = 2;
    }
   }break;

   case 2 : {
   // set green
   if(delay(10, 100)) {
    state = 0;
   else {
    state = 3;
   }break;

   // continue

   default : {
    run = false;
   }
  }
 }
}