You could just replace the delay, with a timed loop where you check the button. If pressed then jump out and go onto the next pattern. It's effectively the same approach as per the solution in #3.
#include <FastLED.h>
#define NUM_STRIPS 3
#define NUM_LEDS 8
#define COLOR_ORDER GRB
#define LED_TYPE WS2812B
#define DELAY 100
CRGB leds[NUM_STRIPS][NUM_LEDS];
//Pin locations for LED strips
const int lowerLEDs = 5;
const int middleLEDs = 6;
const int upperLEDs = 7;
const int myButton = 8;
void setup() {
delay(3000); //For recovery
//Add led strip arrays
FastLED.addLeds<LED_TYPE, lowerLEDs, COLOR_ORDER>(leds[0], NUM_LEDS);
FastLED.addLeds<LED_TYPE, middleLEDs, COLOR_ORDER>(leds[1], NUM_LEDS);
FastLED.addLeds<LED_TYPE, upperLEDs, COLOR_ORDER>(leds[2], NUM_LEDS);
// currentTime = millis();
pinMode (myButton, INPUT_PULLUP);
}
void loop()
{
pattern_1();
//pattern_2();
//pattern_3();
}
void pattern_1()
{
for(int x = 0; x < NUM_STRIPS; x++)
{
for(int i = 0; i < NUM_LEDS; i++)
{
leds[x][i] = CRGB::Red;
FastLED.show();
leds[x][i] = CRGB::Black;
unsigned long onTime = millis();
while (millis() - onTime < DELAY)
{
if (digitalRead(myButton) == LOW)
return;
}
}
}
}