NodeMCU stürtz ab

Hallo, ich weiß das der Titel dieser Topic nicht wirklich viel aussagt (sorry dafür). Mein Ziel ist es Daten per Artnet zu empfangen und diese auf einem WS2812-Strip per FastLED anzuzeigen. Mein aktueller Code sieht so aus:

/*
  Example Artnet RGB LED, 3 LED (one per color) react on ArtNet messages from a master.
  Charles Yarnold 2015 - charlesyarnold@gmail.com
  https://github.com/solexious/ESP8266_artnet_led_node

  Stephan Ruloff 2016-2017
  https://github.com/rstephan
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ArtnetnodeWifi.h>
#include <FastLED.h>

//Wifi settings
const char* ssid = "myssid";
const char* password = "myPassword";

ArtnetnodeWifi artnetnode;

#define NUM_LEDS 15
#define DATA_PIN 5

int pos = 0;

CRGB leds[NUM_LEDS];

// connect to wifi – returns true if successful or false if not
boolean ConnectWifi(void)
{
  boolean state = true;
  int i = 0;

  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20) {
      state = false;
      break;
    }
    i++;
  }
  if (state) {
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("");
    Serial.println("Connection failed.");
  }

  return state;
}

void setup()
{
  delay(2000);
  Serial.begin(115200);
  artnetnode.setName("ESP8266 - Artnet");
  artnetnode.setNumPorts(1);
  artnetnode.enableDMXOutput(0);
  artnetnode.setStartingUniverse(1);

  ConnectWifi();

  artnetnode.begin();

  Serial.println();
  Serial.println("Connected");

  FastLED.addLeds<WS2811, DATA_PIN, BRG>(leds, NUM_LEDS);

}

void loop()
{

  /*for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::White;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();

      // Wait a little bit
      delay(100);

      // Turn our current led back to black for the next loop around
      leds[whiteLed] = CRGB::Black;
    }*/


  uint16_t code = artnetnode.read();
  if (code) {
    if (code == OpDmx) {
      //Serial.println("ArtPacket");
      //Serial.println(artnetnode.getDmxFrame()[0]);
      pos = 0;
      for (int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
        
        leds[whiteLed] = CRGB(artnetnode.getDmxFrame()[pos], artnetnode.getDmxFrame()[pos+1], artnetnode.getDmxFrame()[pos+2]);
        pos+=3;
        yield();
        // Show the leds (only one of which is set to white, from above)
        FastLED.show();
      }

      //leds[5] = CRGB(artnetnode.getDmxFrame()[0], artnetnode.getDmxFrame()[1], artnetnode.getDmxFrame()[2]);
      //FastLED.show();
    }
    else if (code == OpPoll) {
      //Serial.println("Art Poll Packet");
    }
  }
  if (WiFi.status() == 6) {
    ESP.reset();
  }
  yield();
}

Sobald nun die Verbindung mit dem WLAN steht und die Software im Loop ankommt bekomme ich einen Trace mit der Exception 29. Was ist das Problem, falls irgendwelche Informationen fehlen, einfach hier kommentieren ich füge die dann hinzu.

Deinen Code habe ich nur recht schnell gelesen. Einen Fehler ist mir nicht aufgefallen.

Probiere doch mal, mit entsprechender Serial.print()-Anweisung herauszufinden, bis wohin genau der Code ausgeführt wird.

Gruß

Gregor

Hast Du Dir mal den Exceptiondecoder installiert?

Gruß Tommy

Der Code läuft in den Loop nach ein paar Runden schmiert es ab. Mein Decodeder Stracktrace sieht so aus:

0x401003a4: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 160
0x40100b68: malloc(size_t) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\umm_malloc\umm_malloc.cpp line 511
0x40201feb: UdpContext::_s_recv(void*, udp_pcb*, pbuf*, ip4_addr const*, unsigned short) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/include/UdpContext.h line 467
0x402036e3: loop_task(ETSEvent*) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 188
0x401003a4: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 160
0x401003a4: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 160
0x401003a4: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 160
0x40100380: ets_intr_unlock() at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 146
0x401002c8: ClocklessController5, 26, 26, 52, (EOrder)129, 0, false, 50>::showRGBInternal(PixelController(EOrder)129, 1, 4294967295u>) at C:\Users\******\Documents\Arduino\libraries\arduino_526649/controller.h line 333
0x402044b8: uart_do_write_char(int, char) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\uart.cpp line 478
0x402044ac: uart_do_write_char(int, char) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\uart.cpp line 476
0x40204571: uart_write(uart_t*, char const*, size_t) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\uart.cpp line 509
0x40202d9c: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/HardwareSerial.h line 164
0x40202da8: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/HardwareSerial.h line 165
0x40202d9c: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/HardwareSerial.h line 164
0x40203071: Print::write(char const*) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/Print.h line 60
0x40203179: Print::printNumber(unsigned long, unsigned char) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\Print.cpp line 260
0x4020151d: CPixelLEDController(EOrder)129, 1, 4294967295u>::show(CRGB const*, int, CRGB) at C:\Users\******\Documents\Arduino\libraries\arduino_526649/controller.h line 409
0x40204571: uart_write(uart_t*, char const*, size_t) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\uart.cpp line 509
0x40204571: uart_write(uart_t*, char const*, size_t) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\uart.cpp line 509
0x40202d9c: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/HardwareSerial.h line 164
0x40202da8: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/HardwareSerial.h line 165
0x401003a4: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 160
0x40203763: __yield() at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 100
0x402012df: loop() at C:\Users\******\Documents\Arduino\libraries\arduino_526649/FastLED.h line 500
0x4020384c: loop_wrapper() at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\core_esp8266_main.cpp line 180

Bei welcher LED er abschmiert, scheint reinzufällig zu sein.

GreyDiamond:
Mein Decodeder Stracktrace sieht so aus:
...
Bei welcher LED er abschmiert, scheint reinzufällig zu sein.

Hast Du mein Posting nicht gelesen? Wieso baust Du keine passenden Ausgaben in Deinen Code ein, um etwas mehr als nur „scheint zufällig“ sagen zu können?

Gruß

Gregor

Ich habe mehr Debug Ausgaben hinzugefügt. Diese sehen zurzeit so aus:

Connecting to WiFi
Connecting.......
Connected to ssid
IP address: 192.168.***.***

Connected
LED init done
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
loop start
artnet input
For loop led: 0
for loop end
For loop led: 1
for loop end
For loop led: 2
for loop end
For loop led: 3
for loop end
For loop led: 4
for loop end
For loop led: 5
for loop end
For loop led: 6
for loop end
For loop led: 7
for loop end
For loop led: 8
for loop end
For loop led: 9
for loop end
For loop led: 10
for loop end
For loop led: 11
for loop end
For loop led: 12
for loop end
For loop led: 13
for loop end
For loop led: 14
for loop end
loop start
artnet input
For loop led: 0
for loop end
For loop led: 1
for loop end
For loop led: 2
for loop end
For loop led: 3
for loop end
For loop led: 4
for loop end
For loop led: 5
for loop end
For loop led: 6
for loop end
For loop led: 7
for loop end
For loop led: 8
for loop end
For loop led: 9
for loop end
For loop led: 10
for loop end
For loop led: 11
for loop end
For loop led: 12
for loop end
For loop led: 13
for loop end
For loop led: 14
for loop end
loop start
artnet input
For loop led: 0
for loop end
For loop led: 1
for loop end
For loop led: 2
for loop end
For loop led: 3
for loop end
For loop led: 4
for loop end
For loop led: 5
for loop end
For loop led: 6
for loop end
For loop led: 7
for loop end
For loop led: 8
for loop end
For loop led: 9
for loop end
For loop led: 10
for loop end
For loop led: 11
for loop end
For loop led: 12
for loop end
For loop led: 13
for loop end
For loop led: 14
for loop end
loop start
artnet input
For loop led: 0
for loop end
For loop led: 1
for loop end
For loop led: 2
for loop end
For loop led: 3
for loop end
For loop led: 4
for loop end
For loop led: 5
for loop end
For loop led: 6
for loop end
For loop led: 7
for loop end
For loop led: 8
for loop end
For loop led: 9
for loop end
For loop led: 10
for loop end
For loop led: 11
for loop end
For loop led: 12
for loop end
For loop led: 13
for loop end
For loop led: 14
for loop end

Der Code sieht so aus:

/*
  Example Artnet RGB LED, 3 LED (one per color) react on ArtNet messages from a master.
  Charles Yarnold 2015 - charlesyarnold@gmail.com
  https://github.com/solexious/ESP8266_artnet_led_node

  Stephan Ruloff 2016-2017
  https://github.com/rstephan
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ArtnetnodeWifi.h>
#include <FastLED.h>

//Wifi settings
const char* ssid = "ssid";
const char* password = "passwd";

ArtnetnodeWifi artnetnode;

#define NUM_LEDS 15
#define DATA_PIN 5

int pos = 0;

CRGB leds[NUM_LEDS];

// connect to wifi – returns true if successful or false if not
boolean ConnectWifi(void)
{
  boolean state = true;
  int i = 0;

  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20) {
      state = false;
      break;
    }
    i++;
  }
  if (state) {
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("");
    Serial.println("Connection failed.");
  }

  return state;
}

void setup()
{
  delay(2000);
  Serial.begin(115200);
  artnetnode.setName("ESP8266 - Artnet");
  artnetnode.setNumPorts(1);
  artnetnode.enableDMXOutput(0);
  artnetnode.setStartingUniverse(1);

  ConnectWifi();

  artnetnode.begin();

  Serial.println();
  Serial.println("Connected");

  FastLED.addLeds<WS2811, DATA_PIN, BRG>(leds, NUM_LEDS);
  Serial.println("LED init done");

}

void loop()
{

  /*for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::White;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();

      // Wait a little bit
      delay(100);

      // Turn our current led back to black for the next loop around
      leds[whiteLed] = CRGB::Black;
    }*/

Serial.println("loop start");
  uint16_t code = artnetnode.read();
  if (code) {
    if (code == OpDmx) {
      Serial.println("artnet input");
      //Serial.println("ArtPacket");
      //Serial.println(artnetnode.getDmxFrame()[0]);
      pos = 0;
      for (int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
        Serial.print("For loop led: ");
        Serial.println(whiteLed);
        
        leds[whiteLed] = CRGB(artnetnode.getDmxFrame()[pos], artnetnode.getDmxFrame()[pos+1], artnetnode.getDmxFrame()[pos+2]);
        pos+=3;
        yield();
        // Show the leds (only one of which is set to white, from above)
        FastLED.show();
        Serial.println("for loop end");
      }

      //leds[5] = CRGB(artnetnode.getDmxFrame()[0], artnetnode.getDmxFrame()[1], artnetnode.getDmxFrame()[2]);
      //FastLED.show();
    }
    else if (code == OpPoll) {
      Serial.println("Art Poll Packet");
      yield();
    }
  }
  /*if (WiFi.status() == 6) {
    ESP.reset();
  }*/
  yield();
}

Den Code hatte ich schon modifiziert, die Runde (whiteLed) scheint mir eine zufällige Zahl zusein. Manchmal stürtzt es bei 14, manchmal auch schon bei nur 5 Runden ab. Wobei vorher ein paar mal der for-Loop erfolgreich ausgeführt wird.

EDIT: Nach mehr Analyse verschiebt sich mein Verdacht auf den freien Heap. Diesen habe ich mit
ESP.getFreeHeap() ermittelt. Dieser sinkt erst stark, dann schmiert der ESP ab. Wie kann ich heap wieder frei machen?

Hallo,

Vorschlag: rausfinden, welche Funktion da Speicher beim Aufruf frisst und den nicht wieder ordentlich freigibt.
Also nacheinander bei allen Funktionsaufrufen davor und danch den freien Heap ausgeben.
Normalerwesie sollte der Heap sich da nicht groß ändern, spätestens beim 2. Durchlauf sollte das stabil sein.
Dann eben Ursachenforschung...
Mach das am Besten schrittweise, nicht alles auf einmal, wird sonst schnell unübersichtlich.
Ach ja: die serielle kannst Du auch auf 500000 oder 1000000 setzen, können CH34x, FTDI und CP210x und auch der Windowstreber problemlos. Spart ein klein wenig Zeit bei den zusätzlichen Ausgaben.

Gruß aus Berlin
Michael

GreyDiamond:
EDIT: Nach mehr Analyse verschiebt sich mein Verdacht auf den freien Heap. Diesen habe ich mit
ESP.getFreeHeap() ermittelt. Dieser sinkt erst stark, dann schmiert der ESP ab. Wie kann ich heap wieder frei machen?

Naja, das ist ja schon einmal guter Hinweis darauf, in welcher Richtung man weiter suchen sollte. Auf die Schnelle fällt mir zusätzlich zu dem was amithlon vorschlägt, nur ein, dass Du vielleicht etwas RAM sparen kannst, indem Du die Texte in den seriellen Ausgaben ins Flash verlagerst. Irgendwo hatte ich mal von einem Makro gelesen ... irgendwas mit T?

Gruß

Gregor

F-Makro

https://forum.arduino.cc/index.php?topic=338813.0

Trotzdem würde ich erst den Fehler suchen, so lange Der noch 'bei Zeiten' auftritt.
Das sieht mir zumindest so aus, daß eine öfter aufgerufene Funktion den Stack zumüllt und nur vereinzelt wieder frei gibt.
Der darauf folgende Aufruf muß weiter Hinten freien Platz nehmen, da Vorne nicht Genug 'am Stück' vorhanden ist.
... hätte ja spontan Strings gesagt :wink:

MfG

0x40100b68: malloc(size_t) at C:\Users\******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266\umm_malloc\umm_malloc.cpp line 511

0x40201feb: UdpContext::_s_recv(void*, udp_pcb*, pbuf*, ip4_addr const*, unsigned short) at C:\Users******\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/include/UdpContext.h line 467

Da sollte ziemlich klar sein, wo der heap gefressen wird.
Frage ist eher, warum er wohl nicht wieder freigegeben wird.

Da du ja udp nicht direkt verwendest, benutzt du vermutlich dein ArtnetnodeWifi Objekt anders als der Erfinder das vorgesehen hat.

Libraries sind toll, wenn sie keine Probleme machen.

Hallo, danke für das gute Feedback. @michael_x Ich nutze ein leicht modifiziertes Example. Ich werde jetzt erstmal herraus finden welcher Aufruf schuld ist und euch dann berichten.

Der FastLED.show() command scheint schuld zu sein. Wenn ich diesen auskommentiere habe ich keine Probleme mit dem heap.

Hallo,

eigentlich habe ich die FstLED hier stabil sowohl auf ESP8266 als auch ESP32 am Laufen, auch über längere Zeit.

Von der FastLED gibt es einen Fork, der die DMA-Routinen der NeoPixelBus Lib integriert, müßte ich den Link mal raussuchen.
Vielleicht reichen für Deinen Zweck auch die Funktionen der NeoPixelBus:

Hier noch der Link zum Fork der Lib:

Ist allerdings eine ältere FastLED-Lib die Basis.

Gruß aus Berlin
Michael