Nachdem ich bereits einige Projekte mit dem 16x24 LED Display von Adafruit realisieren konnte, bin ich auf ein fast identisches Modul von Sure Electronics gestossen, mit dem ich in Zukunft lieber arbeiten möchte, weil es (a) günstiger und (b) auch mit 5mm grossen LEDs ausgestattet ist.
Leider habe ich nun ein Problem, mit der Adafruit Library das SureDisplay anzusteuern, da anscheinend (bautechnisch bedingt) alle 8x8-LED-Matrix-Module sowohl um 90° gedreht als auch räumlich anders verteilt sind. (z.B. lässt ein Demo-Programm auf dem Adafruit-Display alle LEDs zeilenweise von oben links nach unten rechts aufleuchten, dasselbe Programm auf dem SE-Display allerdings spaltenweise von rechts oben nach links unten)
Es gibt zwar Libraries für genau dieses Modul, allerdings finde ich diese nicht so benutzerfreundlich wie die Variante von Adafruit. Diese kommt nämlich noch mit einem weiteren mächtigen Tool daher: der GFX-Library, die das Einbinden von eigenen Fonts und Grafiken erheblich erleichtert.
Danke soweit schonmal für die Aufmerksamkeit!
Nun zur Frage:
Meint Ihr es ist möglich die Library von Adafruit dahingehend zu modifizieren, daß man quasi das Koordinatensystem ummodelt und alle Arduino-Programme unverändert verwendet werden können? Sollte dann auch die GFX-Library ohne Veränderung funktionieren, weil ja die Ansteuerung des Displays über die HT1632-Library erfolgt?
Mit der Programmierung von Libraries bin ich leider total überfordert und würde mich über einen "Schubs" in die richtige Richtung sehr freuen.
Vielleicht liege ich mit meinem Ansatz aber auch total falsch und sollte mich einfach damit abfinden, für jedes Display seine bereits existierende Library zu verwenden?
derGeppi:
Sollte dann auch die GFX-Library ohne Veränderung funktionieren, weil ja die Ansteuerung des Displays über die HT1632-Library erfolgt?
Zumindest diesen zweien Teil der Frage kann ich mit ja beantworten, die GFX-Library benötigt eigentlich nur eine Funktion um ein Pixel an einer Position zu setzen. Man sieht sie auch auf Rechnern, die gar keine Arduinos sind.
Ich denke diese Funktion dürfte auch der Schlüssel für die Anpassung an das neue Display sein. Da muss es ja sowohl in der originalen Adafruit Version als auch für das neue Display entsprechenden Code geben. Das ist die Stelle, die in der Lib für das neue Display angepasst werden muss ...
Guck einfach mit einem Texteditor rein, die gehen davon nicht kaputt. Nach beim Schließen einfach nicht abspeichern. Und wenn du dir nur eine Kopie anguckst, dann bist du erst recht auf der sicheren Seite. ´Wenn du einen Verdacht hast, dann mach einfach beide Versionen, die von Adafruit und die von Shure in 2 Fenstern nebeneinander auf.
Wenn du ein Backup der Originaldateien hast, dann editiere einfach den Teil, den du denkst, speicherst ab und testest. Du hast mindestens 100.000 Versuche, bis die FLASH Zellen vom Arduino irgendwann "nö" sagen
Ich weiß garnicht mehr, wo ich damals mal versuchsweise rumgefummet habe. Entweder vom MAX7219 oder auch von Shure die Lib, oder wars der Beispielsketch?
Na jedenfalls habe ich mir auch irgendwo aus den Netz nen Font gezogen und da rein verpflanzt. Dabei bin ich was Programmieren betrifft, auch der totale Noob.
Habe Euren Rat befolgt und mal beide libraries parallel verglichen. Leider ist die Umwandlung x,y-Koordinaten => Ansteuerung der 8x8-Matrix-Panels soo unterschiedlich umgesetzt, daß ich da gar nichts adaptieren konnte.
Also weiter Inspiration holen (websuche)..
Dabei stieß ich auf den Blog von RedLegoMan, der in seinem Projekt ebenfalls die Adafruit-library derart umgemodelt hat, daß er damit ein 32x8-Display von Sure ansteuern konnte. Hat zwar nicht die Auflösung von meinem, aber immerhin...
Hier kam ich mit dem Abgleich wesentlich besser voran. Und in der Tat, ArduFE: der einzig wichtige Teil spielt sich in der Funktion ab Zeile 61 ab!
Hier müssen die x,y-Koordinaten pro Panel getauscht werden:
void Adafruit_HT1632LEDMatrix::drawPixel(int16_t x, int16_t y, uint16_t color) {
if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return;
uint8_t m;
// figure out which matrix controller it is
m = x / 24;
x %= 24;
uint16_t i;
if (x < 8) {
i = 7;
} else if (x < 16) {
i = 128 + 7;
} else {
i = 256 + 7;
}
i -= (y % 8);
if (y < 8) {
y = (x % 8) * 2;
} else {
y = (x % 8) * 2 + 1;
}
i += y * 8;
if (color)
matrices[m].setPixel(i);
else
matrices[m].clrPixel(i);
}
Vielleicht programmiertechnisch nicht super-elegant gelöst, aber hey... if it works