Keeping a FastLED working not just switched on

Hi,

Could someone give me a clue as to where I put the 'while' statement to keep the FastLED actually running rather tah simply switched on.

Many thanks,
Flyhighmike


void loop()
{
  int sensorVal1 = digitalRead(2);
  int sensorVal2 = digitalRead(3);

  if (sensorVal1 == HIGH or sensorVal2 == HIGH)
  {
    // If not alrteady on...
    if (digitalRead(LED_BUILTIN) == LOW)
    {
      // ...turn on and start timer
      digitalWrite(LED_BUILTIN, HIGH);
      previousTime = currentTime;
      Serial.println("Test Seconds = " + String(eventInterval / 1000) + String(currentTime));
      pride();
      FastLED.show();
    }
  }

  /* Updates frequently */
  currentTime = millis();

  /* After scheduled time, turn off */
  if (digitalRead(LED_BUILTIN) == HIGH
      && currentTime - previousTime >= eventInterval)
  {
    digitalWrite(LED_BUILTIN, LOW);
    FastLED.show();
    FastLED.clear();
    FastLED.show();
    Serial.println("Test Seconds = " + String(eventInterval / 1000) + String(currentTime));
  }
}

Please post the entire code and show what that "while loop" looks like.

Hi,

The code works fine but the FastLED is turned on and stays at one location in the pride() function is doesn't keep the function going until the timer stops. I think I need to replace the // . . . turn on and start part with a while statement but I am neither sure nor know where it goes.

Your help is much appreciated.

/* Fastled Timer

  v0.01 - Basic Timer Setup 29Jan22
  v0.02 - Add Fastled Project code - tryout
*/

// Sensor & Timer variables
const unsigned long eventInterval = 15000;
unsigned long previousTime = 0;
unsigned long currentTime = 0;
int val = 0;

// Fastled variables
#include "FastLED.h"
#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    7
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    95
#define BRIGHTNESS  100
CRGB leds[NUM_LEDS];


void setup()
//Sensor and timer setup
{
  Serial.begin(19200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

  //Fastled Setup
  delay(3000); // 3 second delay for recovery
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS)
  .setCorrection(TypicalLEDStrip)
  .setDither(BRIGHTNESS < 100);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.show();
  delay(1500);
  FastLED.clear();
  FastLED.show();

  Serial.println("Setup Complete");
}



void loop()
{
  int sensorVal1 = digitalRead(2);
  int sensorVal2 = digitalRead(3);

  if (sensorVal1 == HIGH or sensorVal2 == HIGH)
  {
    // If not alrteady on...
    if (digitalRead(LED_BUILTIN) == LOW)
    {
      // ...turn on and start timer
      digitalWrite(LED_BUILTIN, HIGH);
      previousTime = currentTime;
      Serial.println("Test Seconds = " + String(eventInterval / 1000) + String(currentTime));
      pride();
      FastLED.show();
    }
  }

  /* Updates frequently */
  currentTime = millis();

  /* After scheduled time, turn off */
  if (digitalRead(LED_BUILTIN) == HIGH
      && currentTime - previousTime >= eventInterval)
  {
    digitalWrite(LED_BUILTIN, LOW);
    FastLED.show();
    FastLED.clear();
    FastLED.show();
    Serial.println("Test Seconds = " + String(eventInterval / 1000) + String(currentTime));
  }
}

// This function draws rainbows with an ever-changing,
// widely-varying set of parameters.
void pride()
{
  static uint16_t sPseudotime = 0;
  static uint16_t sLastMillis = 0;
  static uint16_t sHue16 = 0;

  uint8_t sat8 = beatsin88( 87, 220, 250);
  uint8_t brightdepth = beatsin88( 341, 96, 224);
  uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
  uint8_t msmultiplier = beatsin88(147, 23, 60);

  uint16_t hue16 = sHue16;//gHue * 256;
  uint16_t hueinc16 = beatsin88(113, 1, 3000);

  uint16_t ms = millis();
  uint16_t deltams = ms - sLastMillis ;
  sLastMillis  = ms;
  sPseudotime += deltams * msmultiplier;
  sHue16 += deltams * beatsin88( 400, 5, 9);
  uint16_t brightnesstheta16 = sPseudotime;

  for ( uint16_t i = 0 ; i < NUM_LEDS; i++) {
    hue16 += hueinc16;
    uint8_t hue8 = hue16 / 256;

    brightnesstheta16  += brightnessthetainc16;
    uint16_t b16 = sin16( brightnesstheta16  ) + 32768;

    uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
    uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
    bri8 += (255 - brightdepth);

    CRGB newcolor = CHSV( hue8, sat8, bri8);

    uint16_t pixelnumber = i;
    pixelnumber = (NUM_LEDS - 1) - pixelnumber;

    nblend( leds[pixelnumber], newcolor, 64);
  }
}

Definitely not. :astonished:

Hmmm. Perhaps start here.

Yes, take a look at the link @Paul_B provides.

Say this to yourself to get in the mood




I have to call pride over and over and over so it will take the next step take the next step take the next step in its process

while

I am waiting for the timer to expire.



It may step too rapidly, so really you’ll want to call pride periodically during the other period.

So when it runs too fast, you can use the same technique to make it run on a schedule.

a7

This piece of code is resting for 15 seconds, then executing once. Looks like a possible mishap to me.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.