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