I just spent about three hours tracking this down. I have this issue narrowed down to the point where my knowledge can no longer continue. and, amazingly I see no similar issues online
So for some background:
I am using an LED stick of 8 WS2812B LED's.
I simply want to turn them all on to either green or red.
then I wait some time and Turn them off repeat.
you know... blink
The following code causes an error (shown below the snippet)
inline void allGreen() {
digitalWrite( 2, HIGH );
Serial.println("Trying to set LED's Green");
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i].r = 0;
leds[i].g = 255;
leds[i].b = 0;
Serial.println(i);
}
Serial.println("LED's set to Green");
}
22:04:41.498 -> Trying to set LED's Green
22:04:41.498 -> 0
22:04:41.498 -> 1
22:04:41.498 -> 2
22:04:41.498 -> 3
22:04:41.498 -> 4
22:04:41.498 -> 5
22:04:41.498 -> 6
22:04:41.498 -> 7
22:04:41.498 -> 8
22:04:41.498 -> LED's set to Green
22:04:41.498 -> FastLED Show
22:04:41.498 -> Guru Meditation Error: Core 1 panic'ed (InstrFetchProhibited). Exception was unhandled.
22:04:41.498 -> Core 1 register dump:
22:04:41.498 -> PC : 0x00000081 PS : 0x00060330 A0 : 0x800d104d A1 : 0x3ffb1f70
22:04:41.498 -> A2 : 0x3ffbff50 A3 : 0x00000001 A4 : 0x00000081 A5 : 0x00000003
22:04:41.498 -> A6 : 0x00000003 A7 : 0x00000000 A8 : 0x800d0f68 A9 : 0x00000102
22:04:41.498 -> A10 : 0x00000081 A11 : 0x00000081 A12 : 0x00000081 A13 : 0x00000003
22:04:41.545 -> A14 : 0x00000001 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x00000014
22:04:41.545 -> EXCVADDR: 0x00000080 LBEG : 0x40084ed8 LEND : 0x40084ee7 LCOUNT : 0x00000000
22:04:41.545 ->
22:04:41.545 -> ELF file SHA256: 0000000000000000
22:04:41.545 ->
22:04:41.545 -> Backtrace: 0x00000081:0x3ffb1f70 0x400d104a:0x3ffb1f90 0x400d1f69:0x3ffb1fb0 0x40086485:0x3ffb1fd0
22:04:41.545 ->
22:04:41.545 -> Rebooting...
What is interesting here is that it gets past the for loop and gets to the next task in the task scheduler which threw me off for a while but I am certain it is in the for loop because the following works.
inline void oneGreen() {
digitalWrite( 2, HIGH );
leds[0].r = 0;
leds[0].g = 255;
leds[0].b = 0;
}
I have tried this with the following changes and none work:
commenting out FastLED.show()
Using an integer instead of NUM_LEDS to iterate
Adding a 2ms delay in between each assignment in the for loop
Different methods for assigning the LED colors
Entire code here:
#include <TaskScheduler.h>
#include <FastLED.h>
#define NUM_LEDS 8 //number of leds in LED stick
#define DATA_PIN 23 // data pin for LED Stick I2C bus
Scheduler ts;
CRGB leds[NUM_LEDS];
int LED_state;
void LEDloop(); // <-------------------------------------------|
Task tBlink1 ( 500 * TASK_MILLISECOND, TASK_FOREVER, &LEDloop, &ts , true );
void foreGround(); // <-------------------------------------------|
Task taskForeground ( 5 * TASK_MILLISECOND, TASK_FOREVER, &foreGround, &ts , true );
void setup()
{
pinMode(2, OUTPUT);
LED_state = 0;
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical
FastLED.setBrightness(10);
Serial.begin(115200);
}
void loop()
{
ts.execute();
}
inline void oneOff() {
digitalWrite( 2, LOW );
leds[0].r = 0;
leds[0].g = 0;
leds[0].b = 0;
}
inline void oneGreen() {
digitalWrite( 2, HIGH );
leds[0].r = 0;
leds[0].g = 255;
leds[0].b = 0;
}
inline void allRed() {
Serial.println("Trying to set LED's Red");
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i].r = 255;
leds[i].g = 0;
leds[i].b = 0;
Serial.println(i);
}
Serial.println("LED's set to RED");
}
inline void allGreen() {
digitalWrite( 2, HIGH );
Serial.println("Trying to set LED's Green");
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i].r = 0;
leds[i].g = 255;
leds[i].b = 0;
Serial.println(i);
}
Serial.println("LED's set to Green");
}
inline void allOff() {
digitalWrite( 2, LOW );
Serial.println("Trying to set LED's Off");
for (int i = 0; i <= NUM_LEDS; i++) {
Serial.println(i);
leds[i].r = 0;
leds[i].g = 255;
leds[i].b = 0;
}
Serial.println("LED's set to off");
}
void LEDloop()
{
Serial.println("LEDloop");
flashGreen();
Serial.println("FastLED Show");
FastLED.show();
}
void flashGreen()
{
Serial.println("Flash Green");
if ( LED_state != 1 )
{
oneGreen();
LED_state = 1;
}
else
{
oneOff();
LED_state = 0;
}
}
void foreGround()
{
//Serial.println("Foreground");
}