Menu - Code example doesn't loop?

// ColorWipe Subroutine: Fill the dots bottom to top with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = pixels.numPixels(); i >= 0; i--) {
    pixels.setPixelColor(i, c);
    pixels.show();
//    delay(wait);
  }
}

Costas, Thanks for the help… The above subroutine is blocking execution of code. As standalone code (non Blynk) it works fine (it is used to slow down pixel wipes across an array). Given that delay is not an option in Blynk, I commented out the delay line in hopes of getting the subroutine to do work and return. and this is what happens:

Item 2 selected

Soft WDT reset

ctx: cont 
sp: 3ffef780 end: 3ffefa90 offset: 01b0

>>>stack>>>
3ffef930:  3ffe849c 3ffef9e6 00000031 3ffee844  
3ffef940:  3ffef9e4 3ffee844 0000fca0 402023a4  
3ffef950:  00000001 3ffef9e6 00000001 40202455  
3ffef960:  ffffffff 3ffef9e6 00000001 40202908  
3ffef970:  3ffef9e0 3fff0be4 3fff0ab4 40203625  
3ffef980:  3ffef9e5 00000001 00000001 40203686  
3ffef990:  40203f01 3ffee88c 3ffeea70 3ffef9e5  
3ffef9a0:  3ffee858 00000006 40203fa8 3ffeea70  
3ffef9b0:  00000005 3ffef9e0 3ffee858 3ffef9e0  
3ffef9c0:  00000006 00000001 3ffee858 40202b32  
3ffef9d0:  00000001 3ffee878 3ffee858 4020298c  
3ffef9e0:  31007776 31003200 00000037 402024da  
3ffef9f0:  06131614 3ffef900 3ffeea70 3ffee878  
3ffefa00:  00000006 3ffef9e0 40203fa8 3ffeea70  
3ffefa10:  40105244 000d0b9d 3ffee858 00000000  
3ffefa20:  00000001 3ffee878 3ffee858 40202c99  
3ffefa30:  00000000 3ffefa60 00000000 3ffeea70  
3ffefa40:  3ffee878 00ffffff 0101a8c0 402010c7  
3ffefa50:  3fffdad0 00000000 3ffee8a4 3ffeea60  
3ffefa60:  3fffdad0 00000000 3ffeea58 40202cc7  
3ffefa70:  3fffdad0 00000000 3ffeea58 40203ff4  
3ffefa80:  feefeffe feefeffe 3ffeea70 40100718  
<<<stack<<<

I am sorry that this problem is beyond me and I appreciate the help to guide me to understanding… Thanks again.

Comment out all the functions and write to Serial Monitor for each Menu item.

When you have done this add back 1 function at a time to see which one’s are bad.

Let us know which function(s) is bad and we can see if their is a fix.

Yes, I did that troubleshooting but in an additive way. i.e. I started with a bare bones sketch and slowly added code until things broke down.

The function that is causing the trouble is ColorWipe(). As show above, all it is supposed to do is light the pixels in an array one by one. There is a delay but I commented it out.

Without the delay (I understand that delays are a no-no in Blynk - I’ll figure out how timers work later) the code should light the array (which it does) and return. But instead it caused the reset shown above instead… So your intuition is correct; the menu code is working until one calls the subroutine. The code is from the Examples that come with the Adafruit NeoPixel Library and is called strandtest. (shown below)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Thanks… Jeff

I believe Espressif recommend maximum delays of 20 milliseconds.

Perhaps put the delay back in at 5 or 10.

Try reducing the NUMPIXELS from 60 to 10 and keep increasing by 10 if it stops the watchdog (WDT) reset.

I’m not a user of these fancy lights so I can’t suggest much more but there does seem to be several libraries for them and some seem to be better than others from what I read.

Hery Jeff all I can recommend at this stage is ditching Neopixels and use FastLED library instead… I also had maaaaaaaaannnnny problems getting Neopixel’s stupid library to work (is retarded trsut me)…

FastLED also uses far less memory and less code to get working so everything runs faster and doesnt crash

Ben,

Will do… I am leaving to take my kids to college so I will d/l the library and tutorian and start learning.

Thanks again!!!
Jeff