Bei mehr wie 70 LEDs bekomme ich eine Fehlermeldung

Hallo allerseits,
wenn ich im Sketch mehr wie 70 LEDs angebe, bekomme ich diese Fehlermeldung.
Was kann ich machen, hat da vielleicht jemand eine Idee?
ESP-32
LED Stripe WS2815
2x HC SR501 PIR Infrarot Sensor
Spannungswandler 5v

***ERROR*** A stack overflow in task loopTask has been detected.


Backtrace: 0x400828b9:0x3ffafa00 0x400887f1:0x3ffafa20 0x4008b69d:0x3ffafa40 0x40089b1e:0x3ffafac0 0x4008b854:0x3ffafaf0 0x4008b804:0x3ffafb10 0x4008446e:0x00000001 |<-CORRUPTED




ELF file SHA256: a2704a6da8235cce

Sketch sieht so aus:

#include <Adafruit_NeoPixel.h>

#define LED_PIN        5  // Pin, an dem die LEDs angeschlossen sind
#define PIR_PIN_TOP    15 // Pin, an dem der PIR-Sensor oben angeschlossen ist
#define PIR_PIN_BOTTOM 16 // Pin, an dem der PIR-Sensor unten angeschlossen ist
#define NUM_LEDS       70 // Gesamtanzahl der LEDs
#define LEDS_PER_STEP  7  // LEDs pro Treppenstufe
#define NUM_STEPS      10 // Anzahl der Treppenstufen

#define TIMEOUT 5000 // Zeit (ms), nach der die LEDs wieder ausgeschaltet werden

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

// Steuerung für Verzögerung und Schaltverhalten
int stepDelay = 300; // Wartezeit (ms) pro Treppenstufe
int ledSpeed = 50;   // Geschwindigkeit für das nacheinander Einschalten der LEDs innerhalb einer Stufe
bool simultaneousStep = false; // Wenn true, schalten alle LEDs einer Stufe gleichzeitig ein

unsigned long lastMotionTime = 0; // Zeit der letzten erkannten Bewegung
bool motionDetected = false;      // Gibt an, ob eine Bewegung erkannt wurde
bool movingUp = true;             // Gibt an, ob sich die Person nach oben oder unten bewegt
bool lastPirStateTop = LOW;       // Letzter Zustand des oberen PIR-Sensors
bool lastPirStateBottom = LOW;    // Letzter Zustand des unteren PIR-Sensors

void setup() {
  Serial.begin(115200);  // Initialisiere den Serial Monitor
  strip.begin();
  strip.show();          // Alle LEDs ausschalten
  strip.setBrightness(50); // Helligkeit auf 50% setzen (Wert von 0 bis 255)

  pinMode(PIR_PIN_TOP, INPUT);
  pinMode(PIR_PIN_BOTTOM, INPUT);
}

void loop() {
  int pirTopState = digitalRead(PIR_PIN_TOP);       // PIR oben auslesen
  int pirBottomState = digitalRead(PIR_PIN_BOTTOM); // PIR unten auslesen

  // Bewegung oben erkannt
  if (pirTopState == HIGH && lastPirStateTop == LOW) {
    Serial.println("Bewegung oben erkannt!");
    movingUp = false;            // Person geht nach unten
    lightUpStairs(movingUp);     // Treppenstufen von oben nach unten einschalten
    motionDetected = true;
    lastMotionTime = millis();   // Zeit der Bewegung speichern
  }

  // Bewegung unten erkannt
  if (pirBottomState == HIGH && lastPirStateBottom == LOW) {
    Serial.println("Bewegung unten erkannt!");
    movingUp = true;             // Person geht nach oben
    lightUpStairs(movingUp);     // Treppenstufen von unten nach oben einschalten
    motionDetected = true;
    lastMotionTime = millis();   // Zeit der Bewegung speichern
  }

  lastPirStateTop = pirTopState;
  lastPirStateBottom = pirBottomState;

  // Nach einer gewissen Zeit die LEDs nacheinander wieder ausschalten
  if (motionDetected && (millis() - lastMotionTime > TIMEOUT)) {
    Serial.println("Keine Bewegung mehr - Treppenbeleuchtung ausschalten.");
    turnOffStairs(movingUp);  // LEDs in umgekehrter Reihenfolge ausschalten
    motionDetected = false;   // Bewegung zurücksetzen
  }

  delay(50); // Wartezeit für die nächste Sensorabfrage
}

void lightUpStairs(bool upwards) {
  if (upwards) { // von unten nach oben
    Serial.println("Treppenstufen von unten nach oben einschalten...");
    for (int step = 0; step < NUM_STEPS; step++) {
      if (simultaneousStep) {
        // Schalte alle LEDs einer Stufe gleichzeitig ein
        for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
          strip.setPixelColor(i, strip.Color(255, 147, 41)); // Warmweiß einschalten
        }
      } else {
        // Schalte LEDs einer Stufe nacheinander ein
        for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
          strip.setPixelColor(i, strip.Color(255, 147, 41)); // Warmweiß einschalten
          strip.show();
          delay(ledSpeed); // Wartezeit für jede LED innerhalb der Stufe
        }
      }
      strip.show(); // Zeige die LEDs an, wenn alle gesetzt sind
      delay(stepDelay); // Wartezeit bis zur nächsten Stufe
    }
  } else { // von oben nach unten
    Serial.println("Treppenstufen von oben nach unten einschalten...");
    for (int step = NUM_STEPS - 1; step >= 0; step--) {
      if (simultaneousStep) {
        // Schalte alle LEDs einer Stufe gleichzeitig ein
        for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
          strip.setPixelColor(i, strip.Color(255, 147, 41)); // Warmweiß einschalten
        }
      } else {
        // Schalte LEDs einer Stufe nacheinander ein
        for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
          strip.setPixelColor(i, strip.Color(255, 147, 41)); // Warmweiß einschalten
          strip.show();
          delay(ledSpeed); // Wartezeit für jede LED innerhalb der Stufe
        }
      }
      strip.show(); // Zeige die LEDs an, wenn alle gesetzt sind
      delay(stepDelay); // Wartezeit bis zur nächsten Stufe
    }
  }
}

void turnOffStairs(bool upwards) {
  if (upwards) { // von unten nach oben ausschalten
    Serial.println("Treppenstufen von unten nach oben ausschalten...");
    for (int step = 0; step < NUM_STEPS; step++) {
      for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
        strip.setPixelColor(i, strip.Color(0, 0, 0)); // LEDs ausschalten
      }
      strip.show();
      delay(stepDelay); // Wartezeit bis zur nächsten Stufe
    }
  } else { // von oben nach unten ausschalten
    Serial.println("Treppenstufen von oben nach unten ausschalten...");
    for (int step = NUM_STEPS - 1; step >= 0; step--) {
      for (int i = step * LEDS_PER_STEP; i < (step + 1) * LEDS_PER_STEP; i++) {
        strip.setPixelColor(i, strip.Color(0, 0, 0)); // LEDs ausschalten
      }
      strip.show();
      delay(stepDelay); // Wartezeit bis zur nächsten Stufe
    }
  }
}

Danke schon mal vorab

schliesse IDE und öffne erneut. Der Sketch kompiliert normal

Sketch uses 290601 bytes (22%) of program storage space. Maximum is 1310720 bytes.
Global variables use 20416 bytes (6%) of dynamic memory, leaving 307264 bytes for local variables. Maximum is 327680 bytes.

Geht auch bei mir.

Kompilieren geht auch, aber mache ich zb 100 LEDs oder 300 LEDs und verteile dies auf die Stuffen, kommt im Serial Monitor die Fehlermeldung nach Upload. Die LEDs gehen dann auch nicht an.

@kolaha: Es handelt sich um einen Laufzeitfehler.

Zeige mal bitte den Code.

geh zurück auf einen älteren ESP32 Core z.B. 2.0.17, dann wird es gehen.
3.0.x hat Probleme damit.

Hmm.... könnte es das Problem sein?

Das ist die Lösung! Super Vielen Dank

1 Like

habs erst nicht gefunden, aber wurde die letzten Tage schon im internationalen Bereich diskutiert:

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