2812 Shield Buchstaben Senkrecht laufen lassen

Bin Anfänger, bitte seid gnädig. :slight_smile:
Hallo zusammen, ich habe ein Shield für meinen Arduino Uno gekauft und möchte nun Wörter darauf laufen lassen. Bis jetzt habe ich dies mit Arrays angegangen, aber irgendwie komme ich nicht weiter....

Ich schicke mal den Code hier rein, vielleicht kann mir jemand helfen.

#include <Adafruit_NeoPixel.h>

#define PIN 13
#define NUMPIXELS 40
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 200; // Verzögerung zwischen jedem Frame

// Definition der Buchstaben "kommst"
int Bildschirm[8][40] =
{
  {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,1,0,0}
};

void setup() 
{
    pixels.begin();
}

void loop() 
{
    // Laufe das Wort "kommst" über den Bildschirm von rechts nach links
    for (int y = 0; y < 5; y++)
    {
      
        for (int x = 0; x < 39; x++) // Starte bei 7 und gehe bis 39 (von rechts nach links)
        {
            if (Bildschirm[y][x] == 1)
            {
                int ledNummer = 39 - ((y * 5) + x); // Berechne die LED-Nummer entsprechend der Spalten- und Zeilenposition
                pixels.setPixelColor(ledNummer, pixels.Color(25, 15, 15)); // Setze Pixel auf Weiß
            }
            else
            {
                int ledNummer = 39 - ((y * 5) + x); // Berechne die LED-Nummer entsprechend der Spalten- und Zeilenposition
                pixels.setPixelColor(ledNummer, pixels.Color(0, 0, 0)); // Setze Pixel auf Schwarz
            }
        }
        pixels.show(); // Zeige die Pixel
        delay(pause); // Verzögerung zwischen den Frames
    }
}



Es soll von rechts nach links im Shield angezeigt werden.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Schau mal hier: Lauftext mit WS2812, der über Seriellen Monitor eingegeben wird. Dort wird #include <Adafruit_NeoMatrix.h> benutzt.

// Definition der Buchstaben "kommst"
int Bildschirm[8][4 ] =
{
  {                1                                                              } 
  {                1                                                              } 
  {                1     1     1 1     1             1                            } 
  {                1   1     1     1   1 1 1   1 1     1 1 1   1 1     1          } 
  {                1 1       1     1   1     1     1   1     1     1     1        } 
  {                1   1     1     1   1     1     1   1     1     1       1      } 
  {                1     1   1     1   1     1     1   1     1   1     1     1    } 
  {                1     1     1 1     1     1     1   1     1     1 1       1    }
};

kom ist noch richtig, dann beginnt das Chaos.

1 Like

wie lautet die konkrete Frage? Wobei sollen wir dir helfen?

1 Like

Also, der Quellcode ist mittlerweile etwas versaut, vor allem an der Array Stelle. Habe es mit ChatGPT probiert und der anders das immer wieder...
Eigentlich sollte da in dem Versuch das Wort "kommst" stehen.
So das Array ist nicht so wichtig, das ja einfach.
Das Problem ist dann in den Schleifwn.
Ich dachte mir das ich nach und nach das Array durch gehe und jede Stelle angefangen bei 0|0 abtasten und wenn da eine eins steht die entsprechende Led auf an schalte. So eigentlich müsste die innere schleife vom Array ein Rechteck von 5 in der Zeile und 8 in der Breite abtasten und dann an die eusere schleife weiter geben um 5*8 nach rechts im Array ein zu rücken.
Ich bin gerade in der Bahn.
Ich weiß nicht ob das so klar ist, melde mich noch mal heute Abend.
Axo die Frage, was kommt da in die Schleife (mit Berücksichtigung das die led Matrix gedreht ist)?

Danke schön mal für die Hilfe, es geht hier schneller als gedacht. Freut mich so ein forum kennen zu lernen.
LG Alexei

Wie geht es dir mit den Tipp von Post #3? Warum ist das für dich nicht anwendbar?

Zeichne mal ganz exakt die LED Matrix auf sodass wir sehen welcher LED welche Nummer hat.
wo ist 0, 1, 2 ... 39

weiters ein zweites bild aus dem Erkennbar ist von wo nach wo die Darstellung erfolgen soll? wie ist das "Display" orientiert, wo erscheint die neue Spalte (im Gegenzug - wo verschwindet die älteste?)

P.S.: du hast die Antwort von pert als Lösung markiert ... mir scheint du hast noch nichts gelöst ...

1 Like

Ohhh also ich wollte von niemandem die Antwort als Lösung markieren. Ich bin neu hier und auch neu auf einem Forum. Ich muss mich auf der Seite noch lernen zurecht zu finden.

Auf dem Bild sollte zu erkennen sein, dass die LED1 unten links ist. Das Program fängt bei 0 an zu zählen (nähme ich an). Aber auf der Platine ist es so aufgemalt.
Die LED2 und folgenden gehen nach oben bis LED8 dann Springen wir in die Zweite Spalte und von LED9 unten geht es hoch in die erste zeile bis zur LED16. So bis man ganz oben in der Matrik in der ersten zeile und letzten Spalte zu der LED40 kommt.

Ich habe sowas noch nie Aufgezeichnet ,wie eine Schrift lang gehen soll... aber ich probiere es mal und mache mal ein Foto, auch weiter unten zu sehen :slight_smile:

und ich denke das ist bis jetzt das beste von dem was ich so an code habe:

#include <Adafruit_NeoPixel.h>
 
#define PIN 13
#define NUMPIXELS 40
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
int pause = 200; // Verzögerung zwischen jedem Frame
 
// Definition der Buchstaben "kommst"
int Bildschirm[8][40] =
{
  {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0},
  {0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,1,0,0}
};

void setup() 
{
    pixels.begin();
}
 
void loop() 
{
    // Laufe das Wort "kommst" über den Bildschirm von rechts nach links
    for (int a = 0; a < 40; a++) // Äußere Schleife von 0 bis 39
    {
        // Zählervariable für die LED-Nummer
        int ledNummer = 0;
      
        // Innere Schleife, um die 5x8-Fläche abzugrasen
        for (int y = 0; y < 8; y++)
        {
            for (int x = a; x < a + 5; x++) // Innere Schleife von der aktuellen Spalte bis zur nächsten 5x8-Fläche
            {
                if (Bildschirm[y][x] == 1)
                {
                    pixels.setPixelColor(ledNummer, pixels.Color(25, 15, 15)); // Setze Pixel auf Weiß
                }
                else
                {
                    pixels.setPixelColor(ledNummer, pixels.Color(0, 0, 0)); // Setze Pixel auf Schwarz
                }
                ledNummer++; // Inkrementiere die LED-Nummer
            }
        }
        
        pixels.show(); // Zeige die Pixel
        delay(pause); // Verzögerung zwischen den Frames
    }
}

hier steuere ich die LEDs noch aber in der falschen reihenfolge an.... Glaube das hat nichts mit kleinen Brötchen backen zu tun :smiley:

bitte das genau abklären.

mach einen Sketch der im wesentlich nur den Pixel 1 einschaltet:

pixels.setPixelColor(1, pixels.Color(255, 255, 0));
pixels.show();

welcher Pixel leuchtet? Markiere diesen auf deiner Grafik.

edit:
grundsätzlich würde ich mir zunächst eine Funktion schreiben die einfach genau eine Spalte der Matrix mit genau einer Spalte der Schrift befüllt. setCol

Dann würde ich eine Funktion schreiben die mehrere Spalten schreibt und die matrix befüllt. displayShow

Dann würde ich einen Timer schreiben, der nach Zeitablauf die Matrix aktualisiert displayUpdate

Delay braucht es eigentlich nicht. Dazu gibt es das "Blink Without Delay" Beispiel in der IDE.

P.S.: eigentlich würde sich für eine Schrift ein Bitmuster anbieten und nicht für jedes einzelne Pixel einen ganzes integer oder byte verschwenden. Sinnigerweise macht man sich für jeden Buchstaben ein Bytemuster, dann speichert man nur mehr "kommst" in einem Char Array.
Und dann hat man vermutlich genau das, was die Adafruit_NeoMatrix.h macht...

1 Like
#include <Adafruit_NeoPixel.h>
 
#define PIN 13
#define NUMPIXELS 40

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 

void setup() 
{
    pixels.begin();
}
 
void loop() 
{
    // ___________ Danke für deine Hilfe ________________
    pixels.setPixelColor(1, pixels.Color(255, 255, 0)); // Setze Pixel 1 auf Grün
    pixels.show(); // Zeige die Änderungen auf den LEDs
    delay(1000); // Warte 1 Sekunde
}


////////////////////////////
//08//16//24//32//40//            k
//07//17//23//31//39//            k
//06//16//22//30//38//            k     k
//05//15//21//29//37//            k   k
//04//14//20//28//36//     ←      kk                        Und das "k" soll ja in die Richtung laufen.
//03//13//19//27//35//            k   k
//02//12//18//26//34//            k      k
//01//11//17//25//33//            k       k
////////////////////////////

Es ist sehr hell, es leuchtet die LED2, also fängt es schon an bei 0 zu zählen.
Du hast ja deine Nachricht umgearbeitet, ich muss mir das alles mit zeit anschauen.

Und ja ich muss wohl erst mal ein paar Schritte zurück gehen. ich habe einen riessen Sprung versucht in meiner Entwicklung zu machen.

Das mit balkenlaufen lassen hat auch schon funktioniert, das größte Problem, ist glaube die 2 bis drei schleifen die ich brauche plus dass ich das umrechnen, weil ich das Display gedreht habe.

danke schön... ich habe es jetzt erst entdeckt ... es läuft noch nicht 100% aber 99 % ich danke dir viel mals :slight_smile:

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