Laufschrift auf 32 X 8 Matrix

Hallo allerseits,

vor kurzen habe ich eine 32 X 8 Matrix auf Basis von NeoPixeln relativ preiswert bekommen. Da hat es natürlich in den Fingern gejuckt damit mal eine Laufschrift zu probieren.
Leider lief das fertige Programm nicht auf dem UNO. Vom Speicher her musste es schon ein Mega 2560 sein. Ob auch andere gehen, weiß ich nicht. Den Mega hatte ich in der Bastelkiste.

Man kann einen beliebigen Text (beliebige Länge) eingeben. Jetzt läuft das Alphabet durch. Die Buchstaben werden als Zahlen eingeschrieben. Die Zuordnung und die Programmzeile ist im Programm ersichtlich. Wichtig ist, dass der Text mit einer 0 abgeschlossen wird.

Der Text ändert bei jedem Durchlauf die Farbe.

Das Programm zum direkten laden: matrix_8x32.ino

Für den Bildschirm ist das Programm leider zu groß (> 9000).

M.f.G.

Hans-Ulrich

gib dein Monster array in den PROGMEM, dann sparst 2800 Byte SRAM (bzw. wird in den Programmspeicher geschoben). Außerdem reicht da wohl Byte statt int, wenn du da nicht sogar noch mehr rausholen könntest, wenn du das Bitweise verarbeiten würdest.

Hallo,

gib dein Monster array in den PROGMEM, dann sparst 2800 Byte SRAM

Kenne ich noch nicht, werde mich aber mal einlesen. Danke für den Tipp.

M.f.G.

Hans-Ulrich

Hans_Ulrich:

... PROGMEM, ...
Kenne ich noch nicht, werde mich aber mal einlesen. Danke für den Tipp.

Guck z.B. hier, zweiter Abschnitt.

Gruß

Gregor

Hallo,

die beiden Seiten habe ich mir erst mal abgespeichert. Muss ich mir mal in Ruhe durch den Kopf gehen lassen.

M.f.G.

Hans-Ulrich

Hallo,

an der Auslagerung der Daten habe ich mir die Zähne aus gebissen. Die Beschreibungen dazu versteht man wohl erst, wenn man sie verstanden hat . . .

Zum Problem, Das Auslagern scheint geklappt zu haben, aber ich habe keine Weg gefunden um diese wieder zu lesen.

#include <avr/pgmspace.h>

const int buchstabe[7][5]PROGMEM = 
  {
  {0, 1, 1, 1, 0,  },
  {1, 0, 0, 0, 1,  },
  {1, 0, 0, 0, 1,  },
  {1, 1, 1, 1, 1,  },
  {1, 0, 0, 0, 1,  },
  {1, 0, 0, 0, 1,  },
  {1, 0, 0, 0, 1,  },
 
};

int test=0;

void setup() {
}

void loop() {


 
}

Wenn mir jetzt einer die Zeile schreibt, mit der ich einen Wert aus der Matrix in "test" schreiben kann, wäre ich sehr dankbar.

M.f.G.

Hans-Ulrich

Bist Du Dir sicher, dass das Array int sein soll (byte erscheint mir sinnvoller).
Ansonsten nusst Du die Progmem-Macros verwenden.

Gruß Tommy

Gregor hat dir doch eine Seite gepostet oder?

data=pgm_read_byte(&(var[5][4]));

was gefällt dir daran nicht?

Hallo,

data=pgm_read_byte(&(var[5][4]));

was gefällt dir daran nicht?

Gefallen oder nicht gefallen ist hier nicht die Frage. Wenn ich die Zeile so eingebe passiert außer einer Fehlemeldung nichts.

Man muss schon den Syntax verstehen um ihn anwenden zu können. Für die Speicherung habe ich eine ausführliche Beschreibung im Netz gefunden. Leider hat der Autor das Lesen nicht genauso ausführlich beschrieben. Aber irgend wie musste man ja die Zeile zum Laufen bekommen. Mit Versuch und Irrtum hat es dann endlich geklappt.

Mein Beispielprogramm geht jetzt so und funktioniert (überprüft):

#include <avr/pgmspace.h>

const byte buchstabe[7][5]PROGMEM = 
  {
  {0, 1, 1, 1, 0,},
  {1, 0, 0, 0, 1,},
  {1, 0, 0, 0, 1,},
  {1, 1, 1, 1, 1,},
  {1, 0, 0, 0, 1,},
  {1, 0, 0, 0, 1,},
  {1, 0, 0, 0, 1,},
 
};

byte test=0;

void setup() {}

void loop() {

test=pgm_read_byte(&(buchstabe[0][1]));
 
}

Auch wenn es nicht gleich geklappt hat, vielen Dank für eure Mühe. Wieder mal ein Stückchen weiter . . .

M.f.G.

Hans-Ulrich

Hans_Ulrich:
Wenn ich die Zeile so eingebe passiert außer einer Fehlemeldung nichts.

Klar, wenn Du ein Read für byte auf ein Array von int anwendest, kann das nicht funktionieren.

Gruß Tommy

Hallo allerseits,

Monsterprogramm umgeschrieben und es läuft jetzt sogar auf dem UNO !!!

http://www.huk-2.de/Matrix/matrix2_02.ino

Ist aber natürlich zum direkten Einstellen immer noch zu groß.

M.f.G.

Hans-Ulrich

Hallo,

ALLE Variablen überprüfen, welche davon const sein können

Was bringt das in dem Fall?

und auch überlegen, ob man "Text" wirklich in ein int array geben soll...

Bezieht sich die Frage auf "int" oder "Array" ?

Das Array hat den Vorteil, das man einen beliebig langen Text eingeben kann.

Sicherlich führen viele Wege nach Rom . . .

Das Programm funktioniert so wie es ist auf einem UNO also warum etwas ändern?

M.f.G.

Hans-Ulrich

PS.

Falls sich das auf das Einstellen bezieht, das Programm überschreitet die mögliche Größe die hier eingestellt werden kann.

HUK

Hallo,

du bist hier her gekommen, weil dir der Speicher ausgeht.

Ganz so war die Sache nicht. Ich habe das hier eingestellt, in der Hoffnung, dass sich jemand für das Projekt interessiert. Das ich bei der Gelegenheit noch gelernt habe, wie ich Daten im Programmspeicher unterbringen kann, war so nicht geplant. Aber man lernt ja nie aus . . .

M.f.G.

Hans-Ulrich

const byte letter [7] [5] PROGMEM = 
  { 
  {0, 1, 1, 1, 0,}, 
  {1, 0, 0, 0, 1,}, 
  {1, 0, 0, 0, 1,} , 
  {1, 1, 1, 1, 1,}, 
  {1, 0, 0, 0, 1,}, 
  {1, 0, 0, 0, 1,}, 
  {1, 0, 0, 0, 1 ,}, };

This is 35 bytes.
Can be done in 7 byte horizontally:

const byte letter [7] [5] PROGMEM =  << not sure how this would change
  {  
  {0, 1, 1, 1, 0,}, -> 0x0E  
  {1, 0, 0, 0, 1,},  -> 0x11 
  {1, 0, 0 , 0, 1,},  -> 0x11 
  {1, 1, 1, 1, 1,},  -> 0x1F 
  {1, 0, 0, 0, 1,},   -> 0x11 
  {1, 0, 0, 0 , 1,},   -> 0x11 
  {1, 0, 0, 0, 1,},  -> 0x11
};

or 5 bytes if you can go vertically: 0x3F, 0x48, 0x48, 0x48, 0x3F

Lot of duplication there, maybe there is room for compressing / compacting?

Nein, das sind immer noch 35 Byte.
Die 7 Byte-Lösung muss anders aussehen.

const byte letter [7] PROGMEM =  
  { 
    0b00001110,    // 0x0E  
    0b00010001,    // 0x11
    0b00010001,    // 0x11
    0b00011111,    // 0x1F
    0b00010001,    // 0x11
    0b00010001,    // 0x11
    0b00010001     // 0x11
  };

Da sind pro Zeile alle Bits rechtsbündig jeweils in einem Byte angeordnet.
Erfordert ein wenig Pfriemelei beim Dekodieren - aber sowas macht Spaß.

Gruß Walter

Hallo Walter,

das sieht interessant aus. Habe ich mir erst mal kopiert. Mal sehen ob eine für mich sinnvolle Lösung des Dekodieren finde. Das wäre für mich für ein anderes Projekt sehr interessant, da will ich eine Reihe von Ports mit wechselten Daten im Wechsel als Ein und Ausgänge ansteuern. Aber das ist alles noch in Planung.

M.f.G.

Hans-Ulrich

Hallo Walter,

ich habe mir das nochmal durch den Kopf schleichen lassen. Dein Vorschlag geht sicherlich, hat aber einen kleinen Haken. Das Einlesen der Buchstaben in die Matrix erfolgt ja Spaltenweise. Aber bei deinem "A" liest man die Daten Zeilenweise. Ist kein Problem, man muss die Daten nur anders ablegen. Das "A" sieht dann so aus:

const byte letter [5] PROGMEM = 
  {
    0b01111110,    
    0b00001001,    
    0b00001001,    
    0b00001001,    
    0b01111110,    
   };

Dein Vorschlag bringt noch eine andere Sache die mir im ersten Moment gar nicht aufgefallen war. Bei meinem ursprünglichen Programm muss ich für einen Buchstaben 35 mal auf das Array zugreifen, bei deinem Vorschlag nur 5 mal. das ist natürlich ein gewaltiger Gewinn an Geschwindigkeit.

Das Bitweise auslesen und zuordnen ist kein Problem.

Jetzt überlege ich, wenn ich das umschreibe, dann könnte ich vom Rechentempo noch eine zweite Matrix ran hängen. Dann könnte es zwar passieren, dass die Neopixel mehr Speicher verbrauchen als der UNO hat, das ist aber kein Problem. Dann muss halt der Mega ran. Mal sehen . . .

M.f.G.

Hans-Ulrich

Prima!
Wenn ich meinen Bildschirm gegen den Uhrzeigersinn um 90° drehe, erkenne ich das A.

Aber Ehre wem Ehre gebührt: Das "bitweise Verarbeiten" hat noiasca schon in der ersten Antwort erwähnt. Ich habe nur den Array von CrossRoads korrigiert.

Aber ich durfte mit solcherart bitweiser Schriftenfummelei Ende des letzten Jahrtausends mal meine Brötchen verdienen.

Hallo Walter,

aber dich konnte ich mit Namen ansprechen.

Aber ich durfte mit solcherart bitweiser Schriftenfummelei Ende des letzten Jahrtausends mal meine Brötchen verdienen.

Als ich meine Brötchen mit so etwas ähnlichen verdient habe, hatte die Welt noch 8 Bit und die Krone der Schöpfung war der u880. Ist schon alles etwas her. Danach musste ich mich mit Datenbanken herumschlagen. Ist eine ganz andere Welt.
Jetzt bin ich Rentner kann kann am Rechner das machen, was mir Spaß macht.

M.f.G.

Hans-Ulrich

Hallo allerseits,

jetzt die dritte und hoffentlich letzte Version:

http://www.huk-2.de/Matrix/matrix3_08.ino

Ich habe mal getestet, eine zweite Matrix schafft der UNO nicht. Es gibt zwar keine Fehlermeldung, aber das Programm bleibt stehen. Vermutlich überschreiben dann die Neopixel irgend was.

M.f.G.

Hans-Ulrich