Mehrere bestimmte LEDs ansteuern

Hi zusammen,

ich bin mit dem Arduino noch nicht so richtig vertraut, deswegen wollte ich vor meinem Vorhaben erstmal nach Tipps/Ideen fragen.

Zwar will ich mit einem Arduino mehrere LEDs in einem LED Gitter ansteuern.

Sagen wir ca. 100 LEDs.

Da ich ja am Arduino nicht so viele Pins habe, brauche ich mehrere Schieberegister?
Kann ich mehrere Schieberegister zusammenschalten und meine Idee umsetzen?

Danke und Grüße,
p4ssi

Ja, mit den Schieberegistern geht das. Die werden hintereinander geschaltet.

Anstatt einzelne LED anzusteuern wieso nimmst Du nicht RGB LED mit integrierten Kontroller wie zB die WS2812 oder kompatible.
Jeder WS2812 braucht bei max Helligkeit und weißem Licht 60mA. 100 Stück brauchen also 6A.

Die WS2812 werden alle in Reihe geschaltet und die Daten seriell über ein Pin übertragen.

Grüße Uwe

Erstmal danke für die ganzen schnellen Rückmeldungen!
Die LED Streifen wären eine gute Alternative, aber das Gitter hätte ich bereits zur Verfügung, daher brauche ich hierfür eigentlich nichts neues.

Wenn ich beispielsweise in dem LED Gitter eine Zahl bestehend aus 10 LEDs ansteuern möchte, wie kann ich das dann den Schieberegistern umsetzen?

Hab nur Mal das Standard Lauflicht Tutorial probiert.

Du musst dir halt das Bitmuster deiner Zahl aufzeichnen und danach deine Schieberegister ansteueren.

Hi,
Wenn du Probleme mit der Anzahl der Ausgänge hast, schaue mal nach dem I2C-Bus.
Hier kannst du mehrer MCP23017 (I/O Expander) anschließen, wobei jeder dann 16 Ausgänge hat.
Vielleicht hilft das.

Gruß Martin

@HotSystems Genau das ist mein Problem. Hab aktuell 7 LEDs angeschlossen und hab irgendwie keinen Schimmer, wie ich jetzt zum Beispiel nur die mittlere LED leuchten lassen kann?

Mit dem Code-Ausschnitt, leuchten alle auf.
Ich würde jetzt gerne jede LED einzeln anlegen und dann sagen wollen: LED4 leuchte, Rest aus.

Also LED1, LED2,... LEDX als integer anlegen und dann fehlt das gewisse etwas. Ging wenn es direkt am Arduino hing irgendwie einfacher mit digitalWrite low/high.

int sh = 8; //SHCP (ShiftPin oder auch Clock)
int st = 9; //STCP (StorePin oder auch Latch)
int ds = 10; //DS (DataPin)

void setup() {
pinMode(sh, OUTPUT); //PIN als Ausgang definiert
pinMode(st, OUTPUT); //PIN als Ausgang definiert
pinMode(ds, OUTPUT); //PIN als Ausgang definiert
}

Ich würde jetzt gerne jede LED einzeln anlegen und dann sagen wollen: LED4 leuchte, Rest aus.

Klar, kannst du das tun, wenn du viel Schreibarbeit und Codeduplikate möchtest....
Meistens ist es echt unangenehm, Variablen, oder andere Dinge (z.B. Leds) durchzunummerieren.

Du könntest aber auch Bitfields verwenden, oder den Arrayaccess Operator überschreiben.

Beispiel:
led[0] bis led[100] schmeckt dir nicht?

Erstmal nochmals Danke für das schnelle Feedback, habs leider erst jetzt geschafft zu antworten.
Mit dem unten stehenden Code habe ich es hinbekommen, dass jede beliebige LED nach Wunsch leuchtet (im Bsp. also die mittlere).

Wenn ich mir das jetzt überlege wird das bei 100+ LEDs ganz schön aufwändig. Wie würdet ihr das bei einem großen LED-Gitter von 32x12 umsetzen? Wären ja in Summe 384 LEDs / 8 (pro Register) wären 48 Register.

Oder ist das dann allgemein nicht so gut mit dem verwendeten Schieberegister?

int sh = 8; //SHCP (ShiftPin oder auch Clock)
int st = 9; //STCP (StorePin oder auch Latch)
int ds = 10; //DS (DataPin oder auch Daten)

//Status der einzelnen LEDs 0=aus, 1=an
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 1;
int led5 = 0;
int led6 = 0;
int led7 = 0;

//Anzahl der gesamten LEDs
const int ANZAHL_LEDS = 7;

//Array mit Daten für das Schieberegister
int muster[ANZAHL_LEDS] = {
    led1,led2,led3,led4,
    led5,led6,led7
    };
    
void setup() {
 //Verwendetet PINs am Arduino als Ausgänge definieren 
 pinMode(sh, OUTPUT);
 pinMode(st, OUTPUT);
 pinMode(ds, OUTPUT);

 //
  for (int i=0; i<ANZAHL_LEDS; i++) {
  digitalWrite(sh, LOW);
  digitalWrite(ds, muster[i]);
  digitalWrite(sh, HIGH); 
}
 //Ohne diesen Befehl, kein Muster
 digitalWrite(st, HIGH); 

}


void loop() {
  // put your main code here, to run repeatedly:

}

Es macht wenig Sinn den Status erst mal einzeln in Variablen zu speichern und dann ein zweites mal in einem Array

Außerdem solltest du etwas über Datentypen und deren Bereiche nachdenken. byte hat 1 Byte. int hat 2 Bytes.
Selbst dann muss man nicht pro LED ein Byte verbraten. Ein Byte hat 8 Bits, worin man 8 LEDs kodieren kann.
Oder ein praktischeres Beispiel für eine 32x12 Matrix: Eine 32 Bit unsigned long Variable für die Spalte und dann ein Array aus 12 davon

Register sind das übrigens nicht. Das Wort hat auf Mikrocontrollern eine andere Bedeutung. Das sind interne Speicherstellen mit einer spezifischen Bedeutung. Aber nicht Teil des allgemeinen RAMs

Hi

Somit kannst Du in 48 Byte den Inhalt Deiner Matrix abspeichern.
Im Endeffekt genau so, die diverse gLCD-Libs - dort wird auch nur in einem Array hinein gezeichnet und Dessen Inhalt dann zum Display geschickt.
(liegt dort aber auch an der Tatsache, daß zumindest per I²C die Display-Werte nicht zurück gelesen werden können und immer 8 Pixel zusammen übertragen werden - also ein Byte für 8 Pixel.
Wenn man nun nur einen Pixel ändern möchte, müsste man zuvor die anderen 7 Pixel dieses Byte wissen - Das geht (meines Wissen) nur mit SPI-Interface.
Somit ändert man einzelne Pixel vorerst im Array - dort ist das Rücklesen ein Kinderspiel.
Und zum Display sind die zusammen gehörenden Pixel dann ja bekannt und können auch so verschickt werden.

... ok, etwas arg weit ausgeholt ...

mfG