LED Matrix - LEDs abschalten - Fehler - "Sternenfunkeln"

Hallo liebe Community,

ich habe einen Fehler bei dem ich echt nicht mehr weiter kommen. In meinen Augen stimmt der Code, aber offensichtlich habe ich was übersehen. Vlt kann mir von euch jmd helfen?

Ziel: Auf einer LED Matrix sollen per Zufall gewisse LEDs angehen. Und nachdem 6 Stück eingeschaltet wurden soll die erste wieder ausgeschaltet werden.

Der Effekt soll sozusagen ein "Sternenfunkeln" sein.

Umsetzung: Zwei Array die für X und Y Koordinate bestimmt sind und mit Random gefüllt werden. Indexplus ist die aktuelle Position des Arrays, indexminus praktisch um 6 versetzt. Heißt wenn ich auf Array Index 5 bin mit einschalten soll indexminus auf Position 0 schauen was dort X und Y war und die LED abschalten.

Leider klappt das aber nicht. Er schaltet die LEDs nicht mehr aus, bzw schaltet irgendwann irgendwelche aus.

Code:

int zufallx[5];
int zufally[5];
int indexplus = 0;
int punkte = 6;
int indexminus = -6;
unsigned long timer = 0;
int zeit = 20;

void setup() {
  Serial.begin(9200);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(20);
matrix.fillScreen(matrix.Color(0,0,0));
matrix.show();
}




void loop() {

if (millis() - timer > zeit)
  {
    timer = millis();
zufallx[indexplus] = random(5);
zufally[indexplus] = random(5);
indexplus = indexplus + 1;
indexminus = indexminus + 1;
    matrix.drawPixel(zufallx[indexplus], zufally[indexplus], matrix.Color(250,250,250));
    matrix.drawPixel(zufallx[indexminus], zufally[indexminus], matrix.Color(0,0,0));
  
  delay(250); //diente nur zur Verlangsamung für debug per Serial.

  }
  if (indexplus == punkte)
  { indexplus = 0; }

if (indexminus == punkte)
  {indexminus = 0;}
matrix.show();
}

Ist bestimmt ein total unnötiger Fehler, aber ich sehe ihn nicht. Ich danke für eure Zeit und Mühe :)

Frank

Wenn ich Dich richtig verstanden habe, willst Du von den LED, die Du gesetzt hast wieder die letzte ausschalten.

Also musst Du dir auch merken, welche Du in welcher Reihenfolge eingeschaltet hast und anhand dieser Liste das Ausschalten vornehmen. Ich vermute, das sollen Deine indexplus sein.

Damit Dir der Platz im Merkarray nicht ausgeht, musst Du erst das Element an [0] entfernen, dann alles nach vorn schieben und dann am Ende neu setzen. indexminus bruchst Du also nicht, wenn ich dein Vorhaben richtig verstanden habe.

Gruß Tommy

Genau das habe ich vor. Darum mein Ansatz:

Einen "Ringspeicher" den ich von 0 - 5 beschreibe mit Werten für X und Y. Mit dem Indexplus weiß ich welchen Wert ich gerade in DIESER Loop geschrieben habe und lasse die LED einschalten. Mit Indexminus, der genau 5 hinterher läuft möchte ich dann aus dem Ringspeicher eben den ältesten Wert vor dem Überschreiben auslesend und damit die LED an Koordinate X Y ausschalten.

Aber das klappt leider so gar nicht. Ich probiere seit Tagen. Habe es auch schon auf nem LED Streifen statt ner Matrix probiert. Gleiches Problem. Darum denke ich in meinem Ansatz ist ein gravierender Denkfehler...

Was du vorschlägst ist die Werte durch das Array zu shiften? Wie geht das? Ich habe in anderen Projekten einfach immer wieder angefangen von 0 an neu zu überschreiben wenn ich am Ende des Arrays angekommen bin^^.

Schau Dir mal memcpy an.

Gruß Tommy

Oh ein wichtiges Detail habe ich vergessen.

Ich muss wissen welche LED die "erste" war die angeschaltet wurde weil ich diese beim Ausschalten auf 0 dimmen möchte.

Ich habe eine Lösung die funktioniert. Nämlich einfach vor einer For-Schleife das LED-Panel Speichertechnisch auf 0 setzen und in der folgenden For Schleife für alle Positionen des Arrays die Pixel aktivieren und die Matrix auf den Ausgang legen. Das führt dazu, dass tatsächlich immer die älteste LED wieder ausgeht. Aber damit habe ich keine Chance die betroffene LED zu dimmen zum ausschalten. Das Array shiften oder ähnliches um die alten LED raus zu schieben bringt mir nichts?!

Ohje, ich hoffe da draußen versteht auch nur einer meine wirren Gedanken :sweat_smile:

Nö, verstehe ich nicht wirklich.

Wenn Du alle ausschaltest, kannst Du natürlich keine dimmen. Davon war bisher aber auch nicht die Rede. Die Aufgabenbeschreibung ist sozusagen ein "moving target" (laufender Keiler ;) )

Gruß Tommy

Ein einziger Index reicht, der auf die nächste auszuschaltende LED im Array zeigt. Wenn es Zeit ist, wird diese LED ausgeschaltet, eine neue erwürfelt und eingeschaltet, dann wird der Index weitergeschaltet.

Wenn das Ein- und Ausschalten gedimmt erfolgen soll, hilft ein Automat (finite state machine).