Arduino mehr als 800 LEDs steuern

Gast #6025504
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
}
#6025508
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...
#6025565
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.
#6025566
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.
Beitrag #6025601 wurde von einem Moderator gelöscht.
Beitrag #6025604 wurde von einem Moderator gelöscht.
Gast #6025657
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
#6025720
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.
#6025750
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.
#6025822
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
}
#6025939
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.
Gast #6025979
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren