Hallo Community,
ich habe ein ESP32 und versuche damit ein WS2812B LED-Strip anzusteuern. Weil mein ESP32 fest verbaut ist habe ich zuvor das Sketch auf den Arduino Nano getestet. Dort läuft das Sketch super und die LED-Strips werden richtig angesteurt, aber wenn ich nun das Sketch auf den ESP32 lade werden die LED-Strips zwar angesteuert aber es passiert null was eigentlich passieren soll. Alles leuchtet Bund und es ist fast nix mehr von der eigentlichen Animation zu erkennen. Anbei das Sketch:
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(65 , 14 , NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(65 , 12 , NEO_GRB + NEO_KHZ800);
//Helligkeit des jeweiligen Lichpuntes in der Schlange in Prozent
float Helligkeit[10]={};
//Absolute Helligkeit des ersten Lichtpunktes der Schlange
int Summe_Farbe1 = 100;
//Absolute Helligkeit des letzten Lichtpunktes der Schlange
int Summe_Farbe2 = 100;
//pysische Position der LED auf dem LED-Stip
int LEDid;
//Position der LED auf virtuellen Bereich (0-53)
int pos;
//gibt die Richtung an in die die Schlange wandert
String Richtung;
int leange;
// Speichert die Farbe für die jeweilige Stelle in der "Schlange"
// probeweise befüllt da ColorTable auskommentiert (eigentlich von dieser Funktion befüllt)
int rot[10] = {0, 51, 77, 76, 51};
int gruen[10] = {255, 153, 77, 26, 0};
int blau[10] = {255, 204,153, 102, 51};
void setup() {
//Resetet beide Stips
strip1.begin();
strip1.show();
strip2.begin();
strip2.show();
Serial.begin(115200);
// Schlange beginnt links und soll nach rechts wandern
pos = 0;
Richtung = "right";
// Schlange soll aus 5 Lichpunkten bestehen und mit Farbe1 beginnen und mit Farbe2 enden
leange=6;
int Farbe1[] = {0,255,255};
int Farbe2[] = {255,0,255};
}
//////////////////////////////////////////////////////////////////////////////////
void loop() {
MoveDot();
delay(20);
}
//////////////////////////////////////////////////////////////////////////////////
//Schaltet LED an der angegeben Position in der Farbe an, die in "place" angegeben wird
//übersetzt die Positionen 0-53 in die LEDid des jeweiligen LED-Bands
//zudem sind zu klein/große Eingaben für die Position nicht möglich (werden nicht beachtet)
//Position von 0-53
//Laufbahn links->rechts: strip1 LEDs 18-44; strip2 LEDs 44-18
void ShowDot(int posLED, int place) {
//entscheidet ob linkes oder rechtes LED-Band bzw. ob im gültigen Bereich
if (posLED <= 26 && posLED >= 0){
LEDid = posLED + 18;
strip1.setPixelColor(LEDid, strip1.Color(rot[place],gruen[place],blau[place]));
strip1.show();
Serial.print("(1)LEDid: ");
Serial.println(LEDid);
Serial.print("(1)place: ");
Serial.println(place);
}
else if (posLED >= 27 && posLED <= 53){
LEDid = 44 - (posLED-27);
strip2.setPixelColor(LEDid, strip2.Color(rot[place],gruen[place],blau[place]));
strip2.show();
Serial.print("(2)LEDid: ");
Serial.println(LEDid);
Serial.print("(2)place: ");
Serial.println(place);
}
else{Serial.println("(1)Show: Input außerhalb des Bereiches");}
}
//schaltet LED an angegebener Position aus
//Falsche Positionen (<0 || >53) werden nicht beachtet
//nötig, da wenn Schlange eins weiter gewandert Schlangenende von vorheriger Position sonst weiterleuchten würde
void ClearDot(int posLED){
//entscheidet ob linkes oder rechtes LED-Band bzw. ob im gültigen Bereich
if (posLED <= 26 && posLED >= 0){
LEDid = posLED + 18;
strip1.setPixelColor(LEDid, strip1.Color(0,0,0));
strip1.show();
Serial.print(LEDid);
Serial.println(" cleared(1)");
}
else if (posLED >= 27 && posLED <= 53){
LEDid = 44 - (posLED-27);
strip2.setPixelColor(LEDid, strip2.Color(0,0,0));
strip2.show();
Serial.print(LEDid);
Serial.println(" cleared(2)");
}
else{Serial.println("(2)Clear: Input außerhalb des Bereiches");}
}
//Erzeugt einen Punkt mit Schwanz abhängig von der Ausrichtung
//Zeigt diese Schlange an und schaltet die LED nach Schwanzende aus
void Dot_Strait() {
if (Richtung == "right"){ // bewegt sich nach rechts
for (int i=0; i<leange; i++){
ShowDot(pos-i, i);
}
ClearDot(pos-leange);
}
else{ //bewegt sich nach links
for (int i=0; i<leange; i++){
ShowDot(pos+i, i);
}
ClearDot(pos+leange);
}
}
//Pos und Richtung müssen in Form einer Variable, welche in Setup deklariert wurde, eingegeben werden
//läast die Schlange abhängig von der Ausrichtung wandern
void MoveDot(){
Serial.println(Richtung);
if (Richtung == "right"){
//Solange Dot mit Schwanz noch im Sichtbaren immer eins nach rechts verschieben
if (pos < 53+leange){
Dot_Strait();
pos += 1;
//Schlange läuft eigentlich weiter im ungültigen Bereich -> verschwindet allmählich
//Rand LED immer in Farbe Place[0], sodass Schlange optisch in Punkt Zusammenläuft
if (pos >= 54){
ShowDot(53,0);
}
}
//wenn in einen Punkt zusammengelaufen ändert die Richtung und Position von Startpunkt
//(ist vorher ja in den ungültigen Bereich weiter gelaufen)
else{Richtung = "left"; pos = pos-leange;}
}
else{ //bewegt sich nach links
//Solange Dot mit Schwanz noch im Sichtbaren immer eins nach links verschieben
if (pos > 0-leange){
Dot_Strait();
pos -= 1;
//Schlange läuft eigentlich weiter im ungültigen Bereich -> verschwindet allmählich
//Rand LED immer in Farbe Place[0], sodass Schlange optisch in Punkt Zusammenläuft
if (pos <= -1){
ShowDot(0,0);
}
}
//wenn in einen Punkt zusammengelaufen ändert die Richtung und Position von Startpunkt
//(ist vorher ja in den ungültigen Bereich weiter gelaufen)
else{Richtung = "right"; pos = pos+leange;}
}
}
Etwas wirr der Code, deshalb erkläre ich mal was er machen soll. Ich habe in meinen Tisch zwei LED-Bänder verbaut und eine Schlange (mit Farbverlauf und Helligkeitsabfall hin zum Schwanz der Schlange) soll von links nach rechts wandern. Eigentlich berechnen mehrere funktionen den Farbverlauf und so aber ich hab die alle der länge wegen gelöscht und Beispielwerte in die Arrays rot,gruen und blau gepackt. Der Code funktioniert auch auf den Nano und selbst mal probeweise auf den ESP8266 (ob der gekürzte geht kp).
Ich habe keinen Plan wieso das nun auf den ESP32 nicht geht (auch bei mein anderes ES32 ensteht das selbe Problem). Ich hoffe ihr könnt mir weiter helfen ![]()
Gruß Octarock


