Skip to content

constant_lightning freezing in Thunderburst #6

Open
@rhampton67

Description

@rhampton67

I have used a variation of your sketch for a bluetooth-enabled cloudlamp and it works magnificently. Am now attempting to modify it for a variant that uses a pushbutton to switch between modes in case switch. The other patterns seem to work fine but constant_lightning is randomly freezing in Thunderburst at FastLED.show (used several Serial.prints to pinpoint the freeze location). Sometimes it happens the first time it hits TB, sometimes it will run a few times. As I said, it works fine in my bluetooth sketch and run it where constant_lighting is called from void loop where it will run for hours at a time. Any suggestions on what might be causing the freeze? Below is a simplified version of my code I'm using to troubleshoot. Thanks!

/* 
Lighting Cloud Mood Lamp By James Bruce
View the full tutorial and build guide at http://www.makeuseof.com/
Sound sampling code originally by Adafruit Industries.  Distributed under the BSD license.
This paragraph must be included in any redistribution.
*/

#include "FastLED.h"

// constants won't change. They're used here to set pin numbers:
const int buttonPin1 = 8;     // the number of the pushbutton pin1

#define NUM_LEDS 20
#define DATA_PIN 5
#define BRIGHTNESS  175
CRGB leds[NUM_LEDS]; // Define the array of leds

#define FRAMES_PER_SECOND  120

// variables will change:
int buttonPushCounter1 = 0;   // counter for the number of button presses
int buttonState1 = 0;         // current state of the button
int lastButtonState1 = 0;     // previous state of the button


void setup() {
  // this line sets the LED strip type - refer fastLED documeantion for more details https://github.com/FastLED/FastLED
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);

  Serial.begin(9600); // initialize serial communication:
  randomSeed(analogRead(0));

  // initialize the pushbutton pin as an input:
  pinMode(buttonPin1, INPUT);
}


void loop() {

  // read the pushbutton input pin:
  buttonState1 = digitalRead(buttonPin1);

  // compare the buttonState1 to its previous state
  if (buttonState1 != lastButtonState1) {
    // if the state has changed, increment the counter
    if (buttonState1 == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter1++;
      Serial.print("Button Pushed...MODE = ");
      Serial.println(buttonPushCounter1);
    }

    delay(50);    // Delay a little bit to avoid bouncing
  }

  // save the current state as the last state, for next time through the loop
  lastButtonState1 = buttonState1;

  if (buttonPushCounter1 > 2) {
    buttonPushCounter1 = 0;
  }

  switch (buttonPushCounter1) {
    case 1:
      constant_lightning();
      break;
    case 2:
      reset(); break;
  }
}


// basically just a debug mode to show off the lightning in all its glory, no sound reactivity.
void constant_lightning() {
  switch (random(1, 10)) {
    case 1:
      thunderburst();
      delay(random(10, 500));
      break;

    case 2:
      rolling();
      break;

    case 3:
      crack();
      delay(random(50, 250));
      break;
  }
}


void rolling() {
  // a simple method where we go through every LED with 1/10 chance
  // of being turned on, up to 10 times, with a random delay wbetween each time
  for (int r = 0; r < random(2, 10); r++) {
    //iterate through every LED
    for (int i = 0; i < NUM_LEDS; i++) {
      if (random(0, 100) > 90) {
        leds[i] = CHSV( 0, 0, 255);

      }
      else {
        //dont need reset as we're blacking out other LEDs here
        leds[i] = CHSV(0, 0, 0);
      }
    }
    FastLED.show();
    delay(random(5, 100));
    reset();
  }
}

void crack() {
  //turn everything white briefly
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CHSV( 0, 0, 255);
  }
  FastLED.show();
  delay(random(10, 100));
  reset();
}

void thunderburst() {
  // this thunder works by lighting two random lengths
  // of the strand from 10-20 pixels.
  int rs1 = random(0, NUM_LEDS / 2);
  int rl1 = random(10, 20);
  int rs2 = random(rs1 + rl1, NUM_LEDS);
  int rl2 = random(10, 20);

  //repeat this chosen strands a few times, adds a bit of realism
  for (int r = 0; r < random(3, 6); r++) {

    for (int i = 0; i < rl1; i++) {
      leds[i + rs1] = CHSV( 0, 0, 255);
    }

    if (rs2 + rl2 < NUM_LEDS) {
      for (int i = 0; i < rl2; i++) {
        leds[i + rs2] = CHSV( 0, 0, 255);
      }
    }

    FastLED.show();
    //stay illuminated for a set time
    delay(random(10, 250)); //50
    reset();
    delay(random(10, 1000)); //50
  }
}


void reset() // utility function to turn all the lights off.
{
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CHSV( 0, 0, 0);
  }
  FastLED.show();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions