Wenn Du mich fragst, ich habe diese Matrix nicht.
Die Sinnfrage habe ich mir bislang verkniffen, da der TO die Hardware bereits vorliegen hat und ohne funktionierendes Programm zu Elektronikschrott wird ![]()
Wenn Du mich fragst, ich habe diese Matrix nicht.
Die Sinnfrage habe ich mir bislang verkniffen, da der TO die Hardware bereits vorliegen hat und ohne funktionierendes Programm zu Elektronikschrott wird ![]()
Darf ich mal fragen, was an diesem Display es denn vor einer Matrix aus RGB-LED wie z.B. WS2812 auszeichnet?
Das kann ich Dir nicht sagen. Es ist meine erste Matrix und ich ich wollte was in “mini” haben. Die Matrix sollte ans Motorad kommen und da fand ich die Größe passend.
Es wurde als 100% Arduino-kompatibel beworben und …..
…..
Ich bin ein Arduino bzw. ESP32 Anfänger, daher ist mir der Inhalt der Bibliothek teilweise - sagen wir mal - suspekt. Da müsste ich noch viel lesen und testen bevor ich das verstehe. Ich werde mich weiter mit dem Teil beschäftigen - ist vielleicht zum lernen und begreifen ganz gut - aber das werde ich wohl dann eher in die Wintermonate verschieben …
Euch erst einmal vielen Dank !!!
Wenn Ihr eine Empfehlung für eine kleine Matrix habt, dann lasst es mich bitte wissen.
Probierst Du noch #20 oder habe ich das umsonst gemacht?
Danke, passt für mich; habe so ein Ding nur noch nie gesehen.
Die Neopixel-Matrix-Dinger von Adafruit sind ja eher teuer. Mögliche Alternativen wären z.B. das oder sowas hier - aber da müsstest Du schon den Lötkolben schwingen und Kabel anlöten.
So, habe Deinen letzten Sketch mal hochgeladen und ausprobiert.
Ist das Dein erwartetes Ergebnis?
Die 5x5-Matrix hier ist 1,9x2,9cm.
Die von Dir genannten Matrizen sind mit 6,5 x 6,5 cm leider zu groß.
Vielen Dank für Eure Unterstützung !!!
Leider nein, danke für`s Testen, aber schön, daß überhaupt was leuchtet, nur wohl in einer anderen Konstellation ![]()
Das Treiber-IC kennt nur einzelne LEDs, die könnte man einzeln ansteuern, schauen, welche LED leuchtet und das Ergebnis in eine Tabelle mit 3*25=75 Werten eintragen. Aus der Tabelle entsteht dann ein Feld, über das sich die in einem Gehäuse befindlichen LEDs gezielt ansteuern lassen, um eine Farbe aus dem RGB-Farbraum anzuzeigen.
Keine große Sache, aber wenn ich Dich richtig verstanden habe, möchtest Du Deine Tätigkeiten lieber in den Winter verschieben.
Daher von inaktivem zu aktivem Motorradfahrer: Hals und Beinbruch!
Es gibt das Python-Projekt:
Irgendwie hab ich aber das Gefühl, dass die Beschaltung aus dem Schaltplan dazu nicht passt.
Daher hab ich mal ne neue Idee.
Kann ma wer mit setLedPwm arbeiten?
Das wäre eine Einzelansteuerung jeder LED.
Theoretisch müsste jeder Leuchtpunkt einmal angesteuert werden, alles auf clear und den nächsten Punkt - und das für jede Farbe.
Es geht in angenehmen Temperaturen und da ist nicht nur Moppedfahren, sondern auch Gartenpflege, Urlaubszeit, etc. und ob ich da noch Zeit habe, mich so einem komplexen Thema (für mich - vielleicht nicht für Dich) zu widmen …. Es wäre ja sinnvoll, etwas zu kreieren, was auch sinnvoll verwendet werden kann - für mich wäre dies (x, y, R, G, B). Sollte es anders kommen, dann liest Du das hier ![]()
Vielen Dank für die Brüche ![]()
Nur der TO scheint diese Hardware zu haben, daher könnte das wohl nur er. Daran scheitert es, siehe #29.
Ja, für mich auch, zusätzlich noch die Ebene als optionalen Parameter, denn das IC kennt acht davon. Eventuell noch R, G und B in einer Variablen color zusammenfassen, um mit der GFX-Bibliothek kompatibel zu bleiben, wäre dann die Kür.
Das gilt nicht mehr, seit heute ein freundlicher UPS-Onkel bei mir geklingelt hat.
Ja, ich.
Geht und das sogar ohne modifizierte Library. Darf es z.B. myPimoroniDrawPixel() heißen?
// https://forum.arduino.cc/t/esp32-pimoroni-5x5-led-matrix/1437627
// Es ist keine modifizierte Library erforderlich, das Werk
// von Adafruit reicht aus.
#include <Wire.h>
#include <Adafruit_GFX.h> // V 1.12.6 (Library-Manager Arduino-IDE 2.3.8)
#include <Adafruit_IS31FL3731.h> // V 2.0.2 (Library-Manager Arduino-IDE 2.3.8)
Adafruit_IS31FL3731 matrix = Adafruit_IS31FL3731(15, 5);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Hier kommt der Trick... (Spalte: X, Zeile: Y)
constexpr uint8_t pwmRegisterIndexR[] = {
118, 117, 116, 115, 114,
132, 133, 134, 112, 113,
131, 130, 129, 128, 127,
125, 124, 123, 122, 121,
126, 15, 8, 9, 10
};
constexpr uint8_t pwmRegisterIndexG[] = {
69, 68, 84, 83, 82,
19, 20, 21, 80, 81,
18, 17, 33, 32, 47,
28, 27, 26, 25, 41,
29, 95, 89, 90, 91
};
constexpr uint8_t pwmRegisterIndexB[] = {
85, 101, 100, 99, 98,
35, 36, 37, 96, 97,
34, 50, 49, 48, 63,
44, 43, 42, 58, 57,
45, 111, 105, 106, 107
};
// Pixel-Mal-Funktion
// setzt voraus, dass es ein Adafruit_IS31FL3731-Obkekt mit Namen matrix gibt
void myPimoroniDrawPixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b)
{
uint8_t idx = y * 5 + x;
matrix.setLEDPWM(pwmRegisterIndexR[idx], r);
matrix.setLEDPWM(pwmRegisterIndexG[idx], g);
matrix.setLEDPWM(pwmRegisterIndexB[idx], b);
}
//
// ... und hier ist die Trickserei schon wieder zu Ende.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Hilfsfunktion für laufende Punkte
void letThemRun(uint8_t r, uint8_t g, uint8_t b, uint16_t wartezeit, bool deleteOld = true)
{
matrix.clear();
for (uint8_t y = 0; y < 5; y++)
{
for (uint8_t x = 0; x < 5; x++)
{
myPimoroniDrawPixel(x, y, r, g, b);
delay(wartezeit);
if (deleteOld)
myPimoroniDrawPixel(x, y, 0, 0, 0);
}
}
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.println();
// see https://forum.arduino.cc/t/can-preprocessors-know-the-type-of-esp32-board/1200772/7
#if defined CONFIG_IDF_TARGET_ESP32C3
Wire.begin(4, 6);
if (!matrix.begin(0x74, &Wire))
#else
if (!matrix.begin())
#endif
{
Serial.println("IS31FL3731 nicht gefunden");
while (1)
;
}
matrix.clear();
}
void loop()
{
uint8_t warte = 150;
letThemRun(128, 0, 0, warte); // rot
letThemRun(0, 128, 0, warte); // grün
letThemRun(0, 0, 128, warte); // blau
letThemRun(200, 200, 0, warte); // gelb
letThemRun(200, 0, 200, warte); // pink
letThemRun(0, 200, 200, warte); // türkis
letThemRun(255, 255, 255, warte); // weiß, volle Lotte!
delay(60000);
}
Ich bin unter Nutzung von PWM (#28) und Einzelansteuerung (#27 und #28) vorgegangen.
Und ja, es hat ein paar Minuten gekostet, die 144 PWM-Register den einzelnen Farb-LEDs zuzuordnen. Da treten mitunter lustige Effekte auf, bei denen LEDs nur ganz schwach oder auch mal 2, 3 oder 6 Stück gemeinsam leuchten.
Ich habe fertig; bei uns fährt nur der Sohn Moped.
Gute Fahrt allerseits!
Nachtrag 1:
Bei mir werkelte zunächst ein Arduino Uno R3, mit leicht geändertem Code in setup() geht z.B. auch ein ESP32-C3 Dev Module - man muss halt die I2C-Pins setzen.
Nachtrag 2:
Im Code oben steht natürlich außer dem abgewandelten drawPixel() das Original (mit RGB565-Farbe) und die restliche Adafruit-GFX-Funktionalität nicht zur Verfügung. Ob man die wirklich braucht, sei dahingestellt.
Ableitung der Adafruit-Klasse (zusätzliche Datei Adafruit_IS31FL3731_Pimoroni.h)
Da müsste mehr Gehirnschmalz z.B. für die Rotation rein, wenn es richtig sein sollte.
#pragma once
namespace wnoMod
{
constexpr uint8_t pwmRegisterIndexR[] = {
118, 117, 116, 115, 114,
132, 133, 134, 112, 113,
131, 130, 129, 128, 127,
125, 124, 123, 122, 121,
126, 15, 8, 9, 10
};
constexpr uint8_t pwmRegisterIndexG[] = {
69, 68, 84, 83, 82,
19, 20, 21, 80, 81,
18, 17, 33, 32, 47,
28, 27, 26, 25, 41,
29, 95, 89, 90, 91
};
constexpr uint8_t pwmRegisterIndexB[] = {
85, 101, 100, 99, 98,
35, 36, 37, 96, 97,
34, 50, 49, 48, 63,
44, 43, 42, 58, 57,
45, 111, 105, 106, 107
};
}
class Adafruit_IS31FL3731_Pimoroni : public Adafruit_IS31FL3731
{
public:
Adafruit_IS31FL3731_Pimoroni(uint8_t w = 15, uint8_t h = 5)
: Adafruit_IS31FL3731(w, h), height(h){};
void drawPixel(int16_t x, int16_t y, uint16_t color) override
{
// convert RGB 565 to RGB 888
uint8_t r = (color & 0xF800) >> 8;
uint8_t g = (color & 0x7E0) >> 3;
uint8_t b = (color & 0x1F) << 3;
// call drawPixel specific for this display
drawPixel(x & 0xFF, y & 0xFF, r, g, b);
};
void drawPixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b)
{
uint8_t idx = y * height + x;
setLEDPWM(wnoMod::pwmRegisterIndexR[idx], r);
setLEDPWM(wnoMod::pwmRegisterIndexG[idx], g);
setLEDPWM(wnoMod::pwmRegisterIndexB[idx], b);
};
private:
uint8_t height;
};
Testcode mit drawLine() und original drawPixel():
// https://forum.arduino.cc/t/esp32-pimoroni-5x5-led-matrix/1437627
// In diesem Fall Benutzung einer modifizierten "Library"
#include <Wire.h>
#include <Adafruit_GFX.h> // V 1.12.6 (Library-Manager Arduino-IDE 2.3.8)
#include <Adafruit_IS31FL3731.h> // V 2.0.2 (Library-Manager Arduino-IDE 2.3.8)
#include "Adafruit_IS31FL3731_Pimoroni.h"
Adafruit_IS31FL3731_Pimoroni matrix = Adafruit_IS31FL3731_Pimoroni();
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.println();
// see https://forum.arduino.cc/t/can-preprocessors-know-the-type-of-esp32-board/1200772/7
#if defined CONFIG_IDF_TARGET_ESP32C3
Wire.begin(4, 6);
if (!matrix.begin(0x74, &Wire))
#else
if (!matrix.begin())
#endif
{
Serial.println("IS31FL3731 nicht gefunden");
while (1)
;
}
matrix.clear();
}
// Color definitions (geklaut bei https://learn.adafruit.com/adafruit-gfx-graphics-library/coordinate-system-and-units)
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void loop()
{
matrix.drawLine(0, 1, 4, 3, YELLOW);
delay(2000);
matrix.drawLine(1, 0, 3, 4, RED);
delay(2000);
matrix.drawPixel(0, 4, BLUE);
delay(60000);
matrix.clear();
}
Konnte es leider noch nicht ausprobieren … die Urlaubsvorbereitungen laufen auf Hochtouren und morgen früh geht’s los. Habe aber alles eingepackt, wenn es mal regnen sollte. Bin echt gespannt …..
Bin aus dem Urlaub zurück und konnte heute testen. "drawPixel" und "drawLine" in diversen Farben ausprobiert - funzt prima !!! Ziel für mich erst einmal erreicht. Merci und vielen Dank !!!
gelöst
Nachtrag: @wno158 hat eine Lösung gefunden. Dies Lösung befindet sich in Post #31
Und wo steht da jetzt eine Lösung ?
Das hilft keinem weiter.
Sorry, aber lesen bzw. den Code runterladen musst Du schon selbst. Ich habe ihn runtergeladen, ausgeführt und kann die 5x5 Matrix individuell programmieren. Somit ist es gelöst!
Jau Du bist ja richtig Höfflich ;-)
Ja, gelöst ist es.
Ich bin aber auch leicht verwundert über Deine Wahl des "Lösungs-Beitrags", muss jetzt aber nicht unbedingt die Lorbeeren ernten, denn ich weiß ja, dass es funktioniert.
Der Hintergrund unseres Störgefühls ist, dass jemand anders, dem diese Hardware unterkommt und der den Thread findet, als Lösung Deine Erfolgsmeldung sieht (Danke für die Rückmeldung!), aber eben nicht die Lösung selbst.
Du musst dich für dein Fehlverhalten nicht entschuldigen und deine Spielsachen interessieren mich auch nicht.
Nur solltest du schon den richtigen Post als Lösung kennzeichnen.
So ist es jedenfalls Quatsch.
Jedoch bist nicht du auf die Lösung gekomen nur @wno158, sich schminken mit fremden Federn ist nicht schön.
Ooops, was habe ich denn da ausgelöst ?!? Bin etwas sehr verwirrt ! Vorausgeschickt: Es war nie meine Absicht, mich mit "fremden Federn" zu schmücken oder hier jemanden zu verärgern.
Um ehrlich zu sein: Ich erkenne nicht, was falsch gelaufen ist. Ich habe mich bei @wno158 für seine Lösung mit "Merci und vielen Dank" bedankt. Ich habe auch nirgendwo geschrieben, dass es meine Lösung ist. Ich habe geschrieben, dass ich seinen Code heruntergeladen habe, ausgeführt und dann die Matrix selbstständig programmieren konnte. Was sind daran fremde Federn? Ich verstehe es leider nicht.
Nachdem ich "meinen" Beitrag hier eröffnet habe, gab es einige Beiträge (auch dafür habe ich mich zwischenzeitlich bedankt) und @wno158 hat dann die Lösung für "mein" Problem geschaffen. Damit war dann für mich mein Problem gelöst. Nachdem ich post#33 geschrieben hatte, fiel mir der Button "gelöst" auf. Ich dachte, dass die Admins und User sich freuen, wenn ein Thread als solcher auch gekennzeichnet wird. Es erschien noch eine Textabfrage, die ich dann einfach mit "gelöst" beantwortet habe.
Ich denke, wer sich mit der gleichen Problematik der 5x5 Matrix beschäftigt, wird den gesamten Thread lesen und leicht erkennen, dass der Fragesteller nicht der Lösungshersteller ist. Auch wird er erkennen, welcher Code letztendlich zum Ziel geführt hat und kann sich diesen zu Gemüte führen und hat die Lösung schwarz auf weiß vor sich.
Es tut mir leid, wenn ich den Button "gelöst" falsch verwendet habe - vielleicht habe ich eine "Anleitung" übersehen, vielleicht hat sich hier etwas eingebürgert, was ein Wenignutzer hier nicht direkt erkennen kann. Ich wende mich nicht an ein Forum und suche Hilfe, um dann hinterher den Aufstand zu proben. Sorry!