Forum: Mikrocontroller und Digitale Elektronik Arduino mehr als 800 LEDs steuern


von LED King (Gast)


Lesenswert?

Hallo ,

hätte mal eine Frage , möchte mehr als 800 Leds ansteuern (WS2801).
Der Code den ich auch mit euerer Hilfe :) geschrieben habe kann ich nur 
254 Leds ansteuern.

Hat jemand eine ahnung wie ich mehr als 255 ansteuren kann.

1
#include "FastLED.h"
2
#define NUM_LEDS 340
3
#define DATA_PIN 3
4
#define CLOCK_PIN 2
5
6
CRGB leds[NUM_LEDS];
7
String incoming;
8
9
10
11
const CRGB CRGBBlue = CRGB(0 , 0 , 255);
12
const CRGB CRGBBlack = CRGB(0 , 0 , 0);
13
const CRGB CRGBRed = CRGB(178, 34, 34);
14
15
16
17
void setup()
18
{
19
  FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
20
  Serial.begin(9600);
21
}
22
23
void LedLeicht()
24
{
25
  FastLED.setBrightness(50);
26
}
27
void LedMittel()
28
{
29
  FastLED.setBrightness(100);
30
}
31
void LedHell()
32
{
33
  FastLED.setBrightness(255);
34
}
35
36
37
void SetLEDGroup(byte startIndex, byte endIndex, CRGB color)
38
{
39
  for (byte i = startIndex; i <= endIndex; i++)
40
    leds[i] = color;
41
  FastLED.show();
42
}
43
44
45
void DisplayLEDGroup(byte startIndex, byte endIndex)
46
{
47
  SetLEDGroup(startIndex, endIndex, CRGBBlue);
48
}
49
50
51
void DisplayLEDGroupAus(byte startIndex, byte endIndex)
52
{
53
  SetLEDGroup(startIndex, endIndex, CRGBBlack);
54
}
55
56
void DisplayLEDGroupTest(byte startIndex, byte endIndex)
57
{
58
  SetLEDGroup(startIndex, endIndex, CRGBRed);
59
}
60
61
void loop()
62
63
{
64
  LedMittel();
65
  if (Serial.available())
66
  {
67
    incoming = Serial.readStringUntil('\n');
68
    {
69
      if (incoming == "LedLeicht")
70
      {
71
        LedLeicht();
72
      }
73
      if (incoming == "LedMittel")
74
      {
75
        LedMittel();
76
      }
77
      if (incoming == "LedHell")
78
      {
79
        LedHell();
80
      }
81
      if (incoming == "Error")
82
      {
83
        leds[0] = CRGB::Red;
84
        FastLED.show();
85
      }
86
      if (incoming == "Start")
87
      {
88
        leds[0] = CRGB::Green;
89
        FastLED.show();
90
      }
91
      if (incoming == "0")
92
        DisplayLEDGroupAus (1, 338);
93
      }
94
      if (incoming == "1")
95
      {
96
        DisplayLEDGroup (1, 8);
97
        FastLED.show();
98
      }
99
      if (incoming == "2")
100
      {
101
        DisplayLEDGroup (10, 18);
102
        FastLED.show();
103
      }
104
      if (incoming == "3")
105
      {
106
        DisplayLEDGroup (22, 30);
107
        FastLED.show();
108
      }
109
      if (incoming == "4")
110
      {
111
        DisplayLEDGroup (33, 41);
112
        FastLED.show();
113
        }
114
      if (incoming == "5")
115
      {
116
        DisplayLEDGroup (43, 51);
117
        FastLED.show();
118
        }
119
      if (incoming == "6")
120
      {
121
        DisplayLEDGroup (54, 62);
122
        FastLED.show();
123
        }
124
      if (incoming == "7")
125
      {
126
        DisplayLEDGroup (64, 73);
127
        FastLED.show();
128
        }
129
      if (incoming == "8")
130
      {
131
        DisplayLEDGroup (75, 83);
132
        FastLED.show();
133
      }
134
        if (incoming == "9")
135
      {
136
        DisplayLEDGroup (84, 92);
137
        FastLED.show();
138
        }
139
        if (incoming == "10")
140
      {
141
        DisplayLEDGroup (94, 103);
142
        FastLED.show();
143
      }
144
        if (incoming == "11")
145
      {
146
        DisplayLEDGroup (107, 113);
147
        FastLED.show();
148
        }
149
        if (incoming == "12")
150
      {
151
        DisplayLEDGroup (115, 124);
152
        FastLED.show();
153
        }
154
        if (incoming == "13")
155
      {
156
        DisplayLEDGroup (126, 134);
157
        FastLED.show();
158
        }
159
        if (incoming == "14")
160
      {
161
        DisplayLEDGroup (137, 145);
162
        FastLED.show();
163
        }
164
        if (incoming == "15")
165
      {
166
        DisplayLEDGroup (147, 155);
167
        FastLED.show();
168
        }
169
        if (incoming == "16")
170
      {
171
        DisplayLEDGroup (158, 167);
172
        FastLED.show();
173
        }
174
        if (incoming == "17")
175
      {
176
        DisplayLEDGroup (168, 177);
177
        FastLED.show();
178
        }
179
        if (incoming == "18")
180
      {
181
        DisplayLEDGroup (179, 188);
182
        FastLED.show();
183
        }
184
        if (incoming == "19")
185
      {
186
        DisplayLEDGroup (189, 198);
187
        FastLED.show();
188
        }
189
        if (incoming == "20")
190
      {
191
        DisplayLEDGroup (201, 207);
192
        FastLED.show();
193
        }
194
        if (incoming == "21")
195
      {
196
        DisplayLEDGroup (210, 218);
197
        FastLED.show();
198
        }
199
        if (incoming == "22")
200
      {
201
        DisplayLEDGroup (220, 229);
202
        FastLED.show();
203
        }
204
        if (incoming == "23")
205
      {
206
        DisplayLEDGroup (231, 240);
207
        FastLED.show();
208
        }
209
        if (incoming == "24")
210
      {
211
        DisplayLEDGroup (243, 251);
212
        
213
        }
214
        if (incoming == "25")
215
      {
216
        DisplayLEDGroup (254, 262);
217
        
218
        }
219
        if (incoming == "26")
220
      {
221
        DisplayLEDGroup (264, 272);
222
        
223
        }
224
        if (incoming == "27")
225
      {
226
        DisplayLEDGroup (274, 282);
227
        FastLED.show();
228
        }
229
        if (incoming == "28")
230
      {
231
        DisplayLEDGroup (285, 293);
232
        FastLED.show();
233
        }
234
        if (incoming == "29")
235
      {
236
        DisplayLEDGroup (295, 314);
237
        FastLED.show();
238
        }
239
        if (incoming == "30")
240
      {
241
        DisplayLEDGroup (316, 325);
242
        FastLED.show();
243
        }
244
        if (incoming == "31")
245
      {
246
        DisplayLEDGroup (327, 335);
247
        
248
      }
249
  }
250
}

von Ingo L. (corrtexx)


Lesenswert?

LED King schrieb im Beitrag #6025504:
> SetLEDGroup(startIndex, endIndex, CRGBBlue);
Ich kenne deine Funktionen zwar nicht, aber reicht es nicht die Indexe 
zu erweitern? BTW mach mal aus deinen ganzen "if"-Abfragen lieber 
"else-if"-Abfragen oder besser switch (case), das wird 
übersichtlicher...

: Bearbeitet durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Überlege dir mal, welchen Wertebereich "Byte" hat, das du für die 
Indizierung nutzt.

: Bearbeitet durch User
von Rebecca und Larissa (Gast)


Lesenswert?

Für die Dataleitung wirst du bei 800 LED's noch eine Treiberstufe 
benötigen!

von oszi40 (Gast)


Lesenswert?

LED King schrieb im Beitrag #6025504:
> mehr als 255

Kaskadieren? Salamitaktik? Ein kluger Bauer legt nie alle Eier in einen 
Korb. Reicht denn die Leucht-Zeit überhaupt um diese multiplex zu 
bedienen?

von Einer K. (Gast)


Lesenswert?

Rebecca und Larissa schrieb:
> Für die Dataleitung wirst du bei 800 LED's noch eine Treiberstufe
> benötigen!

Ja?
Warum?

von Rebecca und Larissa (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
>
> Warum?

Ist doch irgendwie auch logisch. Wenn die Eingangsimpedanz der WS2812 
pro LED Baustein 50k Ohm beträgt, dann ergibt das bei 800 LED's einen 
Gesamteingangswiderstand von nur 62,5 Ohm. Das wird der Arduino nicht 
ohne zusätzliche Transistorstufe schaffen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Rebecca und Larissa schrieb:
> Ist doch irgendwie auch logisch. Wenn die Eingangsimpedanz der WS2812
> pro LED Baustein 50k Ohm beträgt, dann ergibt das bei 800 LED's einen
> Gesamteingangswiderstand von nur 62,5 Ohm. Das wird der Arduino nicht
> ohne zusätzliche Transistorstufe schaffen.

die WS2812 haben aber eigene Digitalausgänge mit Signalverstärkung. 
Input und Output sind entkoppelt die lesen ein, und geben alles nach den 
ersten 24bit hinten wieder aus. Der µC muss also keinen 10m langen Bus 
mit 800 Teilnehmern treiben, sondern nur bis zum 1. Teilnehmer und nur 
dessen Input.

von Bernd K. (prof7bit)


Lesenswert?

Rebecca und Larissa schrieb:
> Ist doch irgendwie auch logisch. Wenn die Eingangsimpedanz der WS2812
> pro LED Baustein 50k Ohm beträgt, dann ergibt das bei 800 LED's einen
> Gesamteingangswiderstand von nur 62,5 Ohm.

Die befinden sich üblicherweise in einer Daisy-Chain, jede LED treibt 
die nachfolgende.

Die einzigen Gedanken die man sich bei einer solchen Zahl von LEDs 
machen muss ist wie bekommt man die allesamt auf die ganze Länge mit 
halbwegs gleichen und satten 5V versorgt bei den nicht unerheblichen 
Strömen die da fließen werden.

von oszi40 (Gast)


Lesenswert?

Bernd K. schrieb:
> satten 5V versorgt

Wird interessant. z.B. 800x10mA=8A 800LED*0=fast 0
Die Aufgabe wird etwas komplexer. Wahrscheinlich hilft Salamitaktik 
lange, dicke Kupferschienen und Lastsprünge zu vermeiden.

Beitrag #6025601 wurde von einem Moderator gelöscht.
Beitrag #6025604 wurde vom Autor gelöscht.
von LED KING (Gast)


Lesenswert?

Zur Info sind WS2801 und es gehen ja nicht alle 800 LEDs gleichzeitig 
an.

Habe es jetzt hinbekommen und funktioniert alles sauber.

Dank Sebastian R , klar byte geht ja nur bis 255 somit kommt nur int 
infrage.

Danke euch P.s Netzteil ist ein 5A mit 5Volt

von Rebecca und Larissa (Gast)


Lesenswert?

Bernd K. schrieb:
>
> Die befinden sich üblicherweise in einer Daisy-Chain, jede LED treibt
> die nachfolgende.
>
Ok, jetzt wird es klara.
Hier haben die Jungs 643 LED's mit 45 Ampere verbaut. Die haben dann 
aber auch bei 8 Meter Kabellänge und 4qmm Querschnitt zwei Netzteile 
eingesetzt.

https://youtu.be/3TUjszkS3bY

von Bernd K. (prof7bit)


Lesenswert?

LED KING schrieb im Beitrag #6025657:
> Habe es jetzt hinbekommen und funktioniert alles sauber.
>
> Dank Sebastian R , klar byte geht ja nur bis 255 somit kommt nur int
> infrage.
>
> Danke euch P.s Netzteil ist ein 5A mit 5Volt

Mess mal ganz am Ende des Streifens die Spannung wenn die hintersten an 
sind. Und lass die mal weiß leuchten, ob das dann immer noch weiß ist 
oder nach hinten hin einen Farbstich bekommt je mehr davon an sind.

Ich würde dicke Kabel legen, evtl mehrere Netzteile wenns langgestreckt 
ist und an so vielen Punkten wie möglich/sinnvoll einspeisen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

LED King schrieb im Beitrag #6025504:
> Hallo ,
>
> hätte mal eine Frage , möchte mehr als 800 Leds ansteuern (WS2801).
> Der Code den ich auch mit euerer Hilfe :) geschrieben habe kann ich nur
> 254 Leds ansteuern.
>
> Hat jemand eine ahnung wie ich mehr als 255 ansteuren kann.

Dein riesigen if() Abfragen sind totaler Unsinn, das ist verschwendete 
Tipparbeit, unübersichtlich und unwartbar. Das kann man DEUTLICH kürzer 
und übersichtlicher gestalten.

Irgendwie schein dein Programm unvollständig, denn das Objekt FastLED 
ist nirgends deklariert. Vermutlich in #include "FastLED.h, wobei das 
dort nicht hingehört.

Der einfachste "Trick" ist, mehrere Ketten von LEDs zu bilden anstatt 
alle 800 an eine zu hängen. Das hat viele Vorteile, nicht nur bezüglich 
der Software.

von LED KING (Gast)


Lesenswert?

Eingangspannung 5,2 Volt

Letzte 40 Leds werden leicht blau wenn alle an sind , da aber immer nur 
bis zu 200 an sind leuchten alle kräftig.

An der letzten LED gemessen spannung 4.2 volt

von Falk B. (falk)


Lesenswert?

Etwa so.
1
#include "FastLED.h"
2
#define NUM_LEDS 340
3
#define DATA_PIN 3
4
#define CLOCK_PIN 2
5
6
CRGB leds[NUM_LEDS];
7
String incoming;
8
9
10
11
const CRGB CRGBBlue = CRGB(0 , 0 , 255);
12
const CRGB CRGBBlack = CRGB(0 , 0 , 0);
13
const CRGB CRGBRed = CRGB(178, 34, 34);
14
15
16
17
void setup()
18
{
19
  FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
20
  Serial.begin(9600);
21
}
22
23
void LedLeicht()
24
{
25
  FastLED.setBrightness(50);
26
}
27
void LedMittel()
28
{
29
  FastLED.setBrightness(100);
30
}
31
void LedHell()
32
{
33
  FastLED.setBrightness(255);
34
}
35
36
37
void SetLEDGroup(byte startIndex, byte endIndex, CRGB color)
38
{
39
  for (byte i = startIndex; i <= endIndex; i++)
40
    leds[i] = color;
41
  FastLED.show();
42
}
43
44
45
void DisplayLEDGroup(byte startIndex, byte endIndex)
46
{
47
  SetLEDGroup(startIndex, endIndex, CRGBBlue);
48
}
49
50
51
void DisplayLEDGroupAus(byte startIndex, byte endIndex)
52
{
53
  SetLEDGroup(startIndex, endIndex, CRGBBlack);
54
}
55
56
void DisplayLEDGroupTest(byte startIndex, byte endIndex)
57
{
58
  SetLEDGroup(startIndex, endIndex, CRGBRed);
59
}
60
61
void loop() {
62
63
  const int ledaction[32][2] = {
64
        {0, 0}, {1,8}, {10,18}, {22,30}, {33,41}, {43,51}, {54,62}, {64,73},
65
        {75,83}, {84,92}, {94,103}, {107,113}, {115,124}, {126,134}, {137,145}, {147,155},
66
        {158,167}, {168, 177}, {179,188}, {189,198}, {201,207}, {210, 218}, {220,229}, {231,240},
67
        {243,251}, {254,262}, {264,272}, {274,282}, {285,293}, {295,314}, {316,325}, {327,335}
68
  }
69
70
  LedMittel();
71
  if (Serial.available())  {
72
    incoming = Serial.readStringUntil('\n');
73
    if (incoming == "LedLeicht") {
74
      LedLeicht();
75
    }
76
    if (incoming == "LedMittel") {
77
      LedMittel();
78
    }
79
    if (incoming == "LedHell") {
80
      LedHell();
81
    }
82
    if (incoming == "Error") {
83
       leds[0] = CRGB::Red;
84
    }
85
    if (incoming == "Start") {
86
      leds[0] = CRGB::Green;
87
    }
88
    if (incoming == "0") {
89
        DisplayLEDGroupAus (1, 338);
90
    }
91
92
    int number = atoi(incomming);
93
    if (number > 0 && number < 32) {
94
        DisplayLEDGroup(ledaction[number][0], ledaction[number][1]);
95
    }
96
    FastLED.show();
97
  }
98
}

von Hört sich gut an (Gast)


Lesenswert?

Seit wann kann ich so einen Stringvergleich machen?
1
 if (incoming == "LedLeicht") {

von Eric B. (beric)


Lesenswert?

Falk B. schrieb:
> Etwa so.

Jetzt langweilt sich der uC noch mehr ;-)

von Einer K. (Gast)


Lesenswert?

Hört sich gut an schrieb:
> Seit wann kann ich so einen Stringvergleich machen?
>  if (incoming == "LedLeicht") {

Seit man den == Operator überladen kann.

von Falk B. (falk)


Lesenswert?

Hört sich gut an schrieb:
> Seit wann kann ich so einen Stringvergleich machen?
>  if (incoming == "LedLeicht") {

Seit es die zarteste Versuchung in Form von C++ gibt.

von Joachim B. (jar)


Lesenswert?

Falk B. schrieb:
>>  if (incoming == "LedLeicht") {
>
> Seit es die zarteste Versuchung in Form von C++ gibt.

und wo ist der Mehrwert gegenüber

if(!strcmp((char *)incoming, "LedLeicht")) {

?

von Werner W. (wam)


Lesenswert?

Joachim B. schrieb:
> Falk B. schrieb:
>>>  if (incoming == "LedLeicht") {
>>
>> Seit es die zarteste Versuchung in Form von C++ gibt.
>
> und wo ist der Mehrwert gegenüber
>
> if(!strcmp((char *)incoming, "LedLeicht")) {
>
> ?

44 gegenueber 30 Zeichen und besser lesbar  ;)
Schreib mal ein größeres Programm mit 1000 Zeilen.
Da merkt man schon einen Unterschied.

Gruß
Wam

von Kultmops (Gast)


Lesenswert?

Joachim B. schrieb:

>>>  if (incoming == "LedLeicht") {

> und wo ist der Mehrwert gegenüber
>
> if(!strcmp((char *)incoming, "LedLeicht")) {
>
> ?

Wenn man den nicht erkennt, sollte man mal an die frische Luft gehen ...
Oder war das ironisch gemeint?

von Joachim B. (jar)


Lesenswert?

Kultmops schrieb:
> Wenn man den nicht erkennt, sollte man mal an die frische Luft gehen ...

war ich gerade, der Regen hat ja glücklicherweise aufgehört

also ich kommen von Basic ganz früher und wenn man

if (incoming == "LedLeicht") dem ein $ spendiert und ein = wegnimmt
if (incoming$ = "LedLeicht") then ... :)

Dann lernt man mühevoll C und ist heute wieder fast bei Basic

mir solls egal sein, man muss ja nicht alles mitmachen, ich kann 
einigermaßen deutsch, lerne deswegen freiwillig doch nicht alle 
Mundarten und Dialekte.

Wers braucht solls machen, z.B. Spätihändler am Prenzelberg -> 
schwäbisch.

von leo (Gast)


Lesenswert?

Joachim B. schrieb:
> if (incoming$ = "LedLeicht") then ... :)
>
> Dann lernt man

... dass man die Warnungen des Compilers liest/behandelt und nicht 
unterdrueckt.

leo

von Bernd (Gast)


Lesenswert?

Autor: Joachim B. (jar)
>also ich kommen von Basic ganz früher und wenn man
>if (incoming == "LedLeicht") dem ein $ spendiert und ein = wegnimmt
>if (incoming$ = "LedLeicht") then ... :)
>Dann lernt man mühevoll C und ist heute wieder fast bei Basic

Das ist übrigens ein großer Irrtum vieler Informatiker und Techniker, 
nämlich das Komplexität etwas Gutes sei.

Nein, so ist es nicht: Die Dinge müssen einfach und verständlich sein. 
Nicht umsonst war Basic so erfolgreich ( es wurde übrigens an einer Uni 
von Informatikern entwickelt, die es den technisch ahnungslosen 
Wirtschaftwissenschaftlern ermöglichen sollte, auch einfache Software zu 
schreiben ). Der Erfolg war wie bei Python oder Arduino durchschlagend.

>> if(!strcmp((char *)incoming, "LedLeicht")) {
Vielfach ist diese Art von C-Code ein Tribut an die Mangelhaftigkeit der 
Maschinen aus früheren Tagen und diese Tage sollte irgendwann vorbei 
sein. Umständlichkeiten wie die Obige sollten in der heutigen Zeit von 
der Maschine erledigt werden ( a.k. Compiler ), den darin sind die 
Maschinen viel besser als die Menschen.

Ansonsten kann ich dieses Buch empfehlen:
https://www.oreilly.de/buecher/120174/9783897215672-weniger-schlecht-programmieren.html

Dort sagen die besten Programmierer: Code muss so gut lesbar wie ein gut 
geschriebenes Buch sein.

Beste Grüße,
euer Softwarearchitekt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.