Hilfe bei Code für Matrix-LED 1088AS

Hallo,

ich bin neu hier und auch relativ neu mit Arduino & Co.

Ich habe mir vor einiger Zeit Matrix LEDs mit MAX7219 bestellt, 6 x 4in1.

Ich will mir einen Scanner ala Knight Rider 2008 bauen.

Den Hauptteil davon habe ich soweit zum Laufen bekommen. Siehe Video-Link (Beispiel mit 32x8)

https://videobin.org/+19m3/1fvt.html

Nun würde ich gerne am Anfang und am Ende dieses Balken noch eine Art Spitze hinzufügen, damit es am Schluss ein wenig besser aussieht. Dass bekomme ich aber mit meinen Kenntnissen derzeit nicht hin. Ich betreibe das momentan an einem Uno.

Für Tipps dazu wäre ich sehr dankbar.

Hier der Stretch:

#include <MD_MAX72xx.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES	4

const int CLK_PIN = 13;   // Uno 13, Nano D13
const int DATA_PIN = 11;  // Uno 11, Nano D11
const int CS_PIN = 10;    // Uno 10, Nano D10

// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

// Wartezeit zwischen Aktionen
#define  DELAYTIME  150  // in Millisekunden

const int maxLeds = mx.getColumnCount()-1; // ermittle maximale Anzahl LED-Spalten, je nach eingestellter Anzahl an Modulen
const int halbMaxLeds = maxLeds / 2;       // Berechne die Mitte für LED-Spalte 0 bis halb
const int halbMaxLeds1 = maxLeds / 2 + 1;  // Berechne die Mitte für LED-Spalte halb bis max

int x;
int y;

void scan() { // LED-Spalten nacheinander ab der Mitte einschalten

  for (x = halbMaxLeds1, y = halbMaxLeds; x <= maxLeds && y >= 0; x++, y--)
  {
    mx.setColumn(x, 0xff);
    mx.setColumn(y, 0xff);
    delay(DELAYTIME);
  }
}

void scan1() { // LED-Spalten nacheinander ab der Mitte ausschalten
  
  for (x = halbMaxLeds1, y = halbMaxLeds; x <= maxLeds && y >= 0; x++, y--)
  {
    mx.setColumn(x, 0x00);
    mx.setColumn(y, 0x00);
    delay(DELAYTIME);
  }
}

void scan2() { // LED-Spalten nacheinander ab den Enden einschalten

  for (x = maxLeds, y = 0; x >= halbMaxLeds && y <= halbMaxLeds1; x--, y++)
  {
    mx.setColumn(x, 0xff);
    mx.setColumn(y, 0xff);
    delay(DELAYTIME);
  }
}

void scan3() { // LED-Spalten nacheinander ab den Enden ausschalten
  
  for (x = maxLeds, y = 0; x >= halbMaxLeds && y <= halbMaxLeds1; x--, y++)
  {
    mx.setColumn(x, 0x00);
    mx.setColumn(y, 0x00);
    delay(DELAYTIME);
  }
}

void scanner() {
  scan();
  scan1();
  delay(300);
  scan2();
  scan3();
  delay(300);
}

void setup()
{
  Serial.begin(9600);
  Serial.println(maxLeds);
  Serial.println(halbMaxLeds);
  Serial.println(halbMaxLeds1);
  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, 15);
  mx.clear();
}

void loop()
{
  scanner();
}

Desweiteren soll das Ganze später in ein Gehäuse gepackt werden und mit einer durchsichtigen "Platte" an der Sichtseite abgedeckt werden. Diese Platte soll von aussen sehr dunkel sein und das Licht der einzelnen LEDs verschwimmen lassen, so dass man von aussen die einzelnen LEDs nicht mehr erkennen kann. (Ich dachte an Milchglass-Plexi mit dunkler Tönungsfolie)

Wenn dafür jemand eine Idee hat, wäre ich auch dankbar.

fuxxy1979:
... noch eine Art Spitze ...

Was meinst Du damit?

Desweiteren soll das Ganze später in ein Gehäuse gepackt werden und mit einer durchsichtigen "Platte" an der Sichtseite abgedeckt werden. Diese Platte soll von aussen sehr dunkel sein und das Licht der einzelnen LEDs verschwimmen lassen, so dass man von aussen die einzelnen LEDs nicht mehr erkennen kann. (Ich dachte an Milchglass-Plexi mit dunkler Tönungsfolie)
Wenn dafür jemand eine Idee hat, wäre ich auch dankbar.

Auch halbtransparentes Milchglas-Acrylglas ist noch ziemlich durchsichtig. Damit habe ich bereits gespielt. Plane einen Abstand zwischen LEDs und Acrylglas ein. Kaufe das Zeug als fertigen Zuschnitt - selbst sägen ist blöd, das Zeug ist spröde.

Gruß

Gregor

Hi

Sollen diese Spitzen <===> aussehen?
Dann programmiere Das doch :wink:

Ist Dir klar, WAS Du mit
mx.setColumn(y, 0xff);
bezweckst?
Was sagt das y, was sagt das 0xff?
Und genau darin besteht Deine Lösung.

MfG

PS: Sandstrahlen geht auch

@gregorss
Es baut sich ja bei den Sequenzen immer der komplette Balken nach rechts und links gleichzeitig mit 8 LEDs in der Höhe auf. Die Spitze stelle ich mir so vor:

**





**
*

Das natürlich am Anfang und auch am Ende der jeweiligen Sequenz.

@postmaster-ino
Das mit den Spitzen habe ich oben erklärt.

Sicher weiß ich, was mx.setColumn(y, 0xff); bezweckt. x ist die eine Richtung, y die andere. Wird durch die for-Schleife hochgezählt und damit baut sich der Balken auf. 0xff schaltet die LEDs ein.

Ich hatte da schon mal was probiert. Allerdings sind die LEDs für die Spitzen in der Mitte nur an gegangen, aber nicht mit dem Balken weiter gelaufen.

Hi

0xFF schaltet 8 LEDs ein.
Neben der hexadezimalen Schreibweise gibt's noch Binär - Das wäre hier B11111111 (alle Bits gesetzt).
Eine 'Spitze' könnte so aussehen:
B00011000
B00111100
B01111110
B11111111

Jeweils 4 dieser Ziffern ergeben ein Zeichen in Hexadezimal
0001 1000
1 8 -> 0x18
0011 1100
3 C (12) -> 0x3C
0111 1110
7 E (14) -> 0x7E
1111 1111
F F (15) -> 0xFF

Dein Ablauf wäre also
0x18 -> 0x3C -> 0x7E -> 0xFF

Dabei musst Du halt - je nach Länge der Spitzen - mehrere Spalten neu mit LED-Mustern füllen.
Achtung: In der Mitte beginnst Du mit der Spitze der Spitze - für die größeren Balkenbreiten ist Da ja einfach noch kein Platz - also unterhalb der 4.ten Spalte werden nur entsprechend wenig Spalten ausgegeben - das Gleiche am Ende, wenn die Spitze 'nach Außen raus läuft' - zum Schluss gibst Du nur noch die letzte Spalte 0xFF aus, um die letzte (linke oder rechte) Spalte ganz zu füllen.

Deshalb fragte ich, Was Du mit dem 0xFF bezweckst - Der tiefere Sinn dahinter.
Mit etwas Glück konntest Du meiner Erklärung folgen?!?

MfG

fuxxy1979:

*

**





**
*



Das natürlich am Anfang und auch am Ende der jeweiligen Sequenz.

Ach so. Ich hatte zuerst an eine geänderte Helligkeit gedacht, wenn das Laufband das Ende erreicht.

Beschäftige Dich mal mit Feldvariablen (dt. „Arrays“).

Ich würde versuchen, das gewünschte „Filmchen“ nicht „zu Fuß“ zu programmieren, sondern das Ganze als Pixelbild zu betrachten und jeweils das ganze Bild zu „übertragen“. Ob das geht, weiß ich nicht. Ich kenne diese Dinger nicht.

Ganz sicher würde ich mich aber tierisch austoben, was verschiedene Helligkeiten angeht.

Gruß

Gregor

Hi

Helligkeiten sind hier schwierig!
Zumindest, wenn man verschiedene LED verschieden hell haben möchte.
Ich hatte Das Mal angetestet (Lauftext und 'MadFly' in verschiedener Helligkeit).

Oha, noch gar nicht so lange her:
gescheitert - Dot-Matrix-Display an MAX7219, verschiedene Helligkeiten

Der Rest ist 'pixelweise' hier wirklich einfacher.
Die Library enthält einen Buffer, in Den die Methoden reinschreiben - dann wird eh immer das komplette Bild abgeschickt.
(Das ist auch ein Problem, daß man dir 'Bilder' der verschiedenen Helligkeiten schnell genug durch's Display prügeln muß)

Mit dem Buffer haben wir aber den Vorteil, daß wir 'Mitte links' die Pfeilspitze zeichnen - abschicken.
Dann Mitte-Links das nächst größere Segment, links davon die Pfeilspitze - abschicken.
... Mitte-Links das 6er Segment, links davon das 4er, davor das 2er, abschicken.
... 8er, 6er, 4er, 2er, abschicken
Ab jetzt bewegen wir uns mit der Spitze mit - das volle 8er-Segment (blöde Wortwahl ...) ist und bleibt Da - also fangen wir jetzt 'mitte-Links+1' an mit 8,6,4,2,Abschicken.
Jedes Mal prüfen wir bei jeder Ausgabe, ob Diese noch 'im sichtbaren bereich' ist - wenn nicht, sparen wir uns die Ausgabe (wobei Das die Lib auch für uns machen würde).
Rückwärts das Gleiche - nur anders herum.
Ganz Außen wird ein 6er angezeigt (der 8er verändert Sich in einen 6er).
Dann von Außen nach Innen 4er, 6er, Abschicken. (die 8er sind und bleiben ja stehen).

Den 4er tauschen wir zum 2er, den 2er zum 0er (alle LED aus).
Das, bis wir wieder in der Mitte sind - dort sollen ja auch nur bis zur Mitte überschrieben werden (von der anderen Seite passiert ja das Gleiche).

Verständlich?

MfG

Um das Programm zu testen, habe ich die aktuelle Version 3.2.1 von MD_MAX72XX installiert, was auch mit den Bibliotheksbeispielen keine stabile Anzeige ergibt. Je nach Beispiel wird beispielsweise Text angezeigt, dann wird das Display dunkel. Die Ursache für dieses Verhalten konnte ich noch nicht ermitteln. Auf meinem Display steht "FC16_HW".

Nach einem Rückfall auf Version 3.1.0 sehe ich zumindest ein Muster, das mit diesem Thema zusammenhängen könnte.

So verrinnt die Zeit, ohne daß ich etwas inhaltlich beitragen kann :confused:

@agmue
Hallo, bei mir ist die Bibliothek Ver. 3.2.1 installiert. Ich habe den Stretch per Copy & Paste hier veröffentlicht. Eigentlich sollte das funktionieren.

Für die anderen: Ich habe nochmal so einiges probiert, wie z.B. in den Schleifen bei x und y mit -1, -2, -3 oder +1, +2, +3 zu spielen. Aber ich hab leider nichts hinbekommen.

Ich glaube, dass mir das zu umständlich ist.