Adafruit Neopixel - brauche kleine Hilfestellung

Ein freundliches Hallo in die Runde!

Seit kurzer Zeit arbeite ich an einem kleinen Neopixel Projekt und hab den Großteil meiner Probleme aus dem Weg geräumt. Ich bin was Arduino betrifft ein Anfänger würde ich behaupten - kein Blutiger mehr, aber definitiv noch im Anfangsstadium.

Der Aufbau ist eine Art Würfel im Infinity Mirror Stil, es sind 24 Strips á 15 cm mit je 8 LED verbaut => 192 LED. Wen das ganze interessiert der sucht auf YT mal nach "Rhombic Dodecahedron" von Adam Savage & Matt Parker.

Ein 5V 20A Netzteil liegt vor, angesteuert wird das ganze mit einem Mikro. Aufbau wie üblich mit 1000uF Kondensator und 400Ohm Widerstand auf D-IN.
Zur Steuerung werden 3-4 Push Buttons sowie ein paar Drehpotis verwendet.

Nun ist mir gestern aufgefallen:
Die strip.fill() Funktion tut sich ab ~120 Pixeln schwer. Ich hatte versucht, meine Pixel 120-144 "aufzudimmen", woraufhin sich aber Pixel 120 - 192 aufgedimmt haben. Dachte es liegt am Micro, ein Mega macht die gleichen Probleme.
Per "strip.setPixelColor" hat es wiederum funktioniert.
Edit
danke an noiasca für das Klarstellen der Funktion strip.fill();, ich hatte das "count" als letzten Parameter komplett vergessen!

Da ich später plane, die LEDs über mehrere verschiedene Funktionen mittels Push Button durchzuschalten und per Poti ggf. einzelne Farben heraus oder herein zu dimmen, hab ich meine Funktionen geplant.

Jetzt ist es nur so: Der Würfel ist "abenteuerlich" verkabelt. Durch seine nicht gewöhnliche Form laufen die DIN-DOUT Verkabelungen kreuz und quer (für den kürzesten Weg), so dass die obere Seite die Pixel 120-144, eine Randseite die Pixel 145 - 192 bedient.
Ist es möglich, den Spaß irgendwie einfach zu remappen, ohne über 192 Variablen zu gehen? Man könnte es ggf noch kürzen auf 24 Variablen, das ging, aber vllt geht es ja noch einfacher. Oder das remappen lieber sparen, wenn ich genau weiß, wo welche LED liegt?

Dies ist mein aktueller Stand. Ich hab mit Potis und Buttons schon rumprobiert und weiß, wie ich die einbinden kann. Die "delay"s sind auch erstmal nur für die Tests der einzelnen "Gestaltungen", später will ich mit Timern arbeiten (dass mir auch ja die Buttons- und Potis erkannt bleiben :D)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define PIN        6

#define NUMPIXELS 192

Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 100

void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
  strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {
  strip.clear();
    BuildUp();
    BuildMidUp();
    BuildRingLow();
    BuildLow();
    delay(5000);
    strip.clear();
    strip.show();
    delay(1000);
    
}

//Dim up the upper ring
void BuildUp(){
  for(int i=0; i<121; i++){
    for(int h=0; h<8; h++){
      strip.setPixelColor(104+h, i, i, i);
      strip.setPixelColor(112+h, i, i, i);
      strip.setPixelColor(120+h, i, i, i);
      strip.setPixelColor(96+h, i, i, i);
    }
    strip.show();
    delay(10);
  }
}

//Walk down from up to middle
void BuildMidUp(){
  for(int j=0; j<8; j++){
    strip.setPixelColor(47-j, 120, 120, 120);
    strip.setPixelColor(71-j, 120, 120, 120);
    strip.setPixelColor(72+j, 120, 120, 120);
    strip.setPixelColor(128+j, 120, 120, 120);
    strip.setPixelColor(183-j, 120, 120, 120);
    strip.setPixelColor(184+j, 120, 120, 120);
    strip.show();
    delay(DELAYVAL);
  }
}

//Middle ring walks from connection to middle of strip
//Low-Mid sides walk down
void BuildRingLow(){
  for(int k=0; k<8; k++){
    strip.setPixelColor(39-k, 120, 120, 120);
    strip.setPixelColor(48+k, 120, 120, 120);
    strip.setPixelColor(63-k, 120, 120, 120);
    strip.setPixelColor(136+k, 120, 120, 120);
    strip.setPixelColor(160+k, 120, 120, 120);
    strip.setPixelColor(175-k, 120, 120, 120);
    if(k == 0){
      strip.setPixelColor(95-k, 120, 120, 120);
      strip.setPixelColor(88+k, 120, 120, 120);
      strip.setPixelColor(80+k, 120, 120, 120);
      strip.setPixelColor(87-k, 120, 120, 120);
      strip.setPixelColor(144+k, 120, 120, 120);
      strip.setPixelColor(151-k, 120, 120, 120);
      strip.setPixelColor(152+k, 120, 120, 120);
      strip.setPixelColor(159-k, 120, 120, 120);
    }
    if(k == 2){
      strip.setPixelColor(95-k/2, 120, 120, 120);
      strip.setPixelColor(88+k/2, 120, 120, 120);
      strip.setPixelColor(80+k/2, 120, 120, 120);
      strip.setPixelColor(87-k/2, 120, 120, 120);
      strip.setPixelColor(144+k/2, 120, 120, 120);
      strip.setPixelColor(151-k/2, 120, 120, 120);
      strip.setPixelColor(152+k/2, 120, 120, 120);
      strip.setPixelColor(159-k/2, 120, 120, 120);
    }
    if(k == 4){
      strip.setPixelColor(95-k/2, 120, 120, 120);
      strip.setPixelColor(88+k/2, 120, 120, 120);
      strip.setPixelColor(80+k/2, 120, 120, 120);
      strip.setPixelColor(87-k/2, 120, 120, 120);
      strip.setPixelColor(144+k/2, 120, 120, 120);
      strip.setPixelColor(151-k/2, 120, 120, 120);
      strip.setPixelColor(152+k/2, 120, 120, 120);
      strip.setPixelColor(159-k/2, 120, 120, 120);
    }
    if(k == 6){
      strip.setPixelColor(95-k/2, 120, 120, 120);
      strip.setPixelColor(88+k/2, 120, 120, 120);
      strip.setPixelColor(80+k/2, 120, 120, 120);
      strip.setPixelColor(87-k/2, 120, 120, 120);
      strip.setPixelColor(144+k/2, 120, 120, 120);
      strip.setPixelColor(151-k/2, 120, 120, 120);
      strip.setPixelColor(152+k/2, 120, 120, 120);
      strip.setPixelColor(159-k/2, 120, 120, 120);
    }
    strip.show();
    delay(DELAYVAL);
  }
}

//Lower Side walks from connection Point to middle.
void BuildLow(){
    for(int l=0; l<4; l++){
    strip.setPixelColor(0+l, 120, 120, 120);
    strip.setPixelColor(7-l, 120, 120, 120);
    strip.setPixelColor(8+l, 120, 120, 120);
    strip.setPixelColor(15-l, 120, 120, 120);
    strip.setPixelColor(16+l, 120, 120, 120);
    strip.setPixelColor(23-l, 120, 120, 120);
    strip.setPixelColor(24+l, 120, 120, 120);
    strip.setPixelColor(31-l, 120, 120, 120);
    strip.show();
    delay(DELAYVAL);
  }
}

Ich will später in den Funktionen entsprechend die Potis einspielen für die Lichthelligkeit.
Nur wenn ich es mir richtig vorstelle, kann ich jeden Strip hier prinzipiell einzeln per Funktion definieren, und zwar so, dass ich über eine Variablenübergabe direkt festlegen kann:

  • Laufrichtung (Hoch, runter, von außen nach innen, von innen nach außen)
  • Dim-Up/Dim Down
  • Blinkelichter

Wobei letzteres, also rumgeblinke, vermutlich eher über eine getrennte Funktion laufen sollte.

Der Push-Button soll dann einfach nur die Fälle regeln, ob die Laufrichtung geändert wird, ob Dim-Up/down stattfinden soll etc... und per Poti kann ich dauerhaft einstellen, ob ich nun Blau, Rot, Grün oder weiß haben mag - und in welcher Intensität.
Ich weiß noch nicht, ob es Sinnig ist, die "Hue" Einstellung der Strips zu nutzen, da ich vermute, dass diese etwas... schwieriger per Poti zu regeln ist. Auch hier wäre ich für Hinweise dankbar :slight_smile:

Besten Dank schon einmal im Voraus. Ich habe nichts dergleichen bei meiner Suche im Forum (und Google) gefunden, hoffe ich habe dabei nichts übersehen.

Ich wollte die Pixel 120 - 144 aufdimmen. Zuerst einmal nur ansteuern und zum leuchten bringen (da man bei strip.fill ja mit "colour" und nicht mit RGB Werten arbeitet)

Es haben aber die Pixel 120 - 192 geleuchtet, also 48 mehr als sollten. Ich hatte entsprechend auch die Funktion "strip.fill(white, 120, 144);" drin stehen, die aber wieder rausgenommen weil - nicht funktional.

Und: ja, es war auch die variable "uint32_t white = strip.Color(120, 120, 120);" definiert :slight_smile: Diese hätte ich dann später vorraussichtlich mit einer "for"-Schleife versehen, dass die entsprechend von 0-120 hochtickt zum dimmen.
Aber wie gesagt: Strip 120 - 144 mit strip.fill füllen wollen, alles danach hat mit geleuchtet. Das war am Micro und Mega reproduzierbar.

guckst du Library:

void fill(uint32_t c=0, uint16_t first=0, uint16_t count=0);

das ist nicht von bis sonder von und Anzahl!

/*!
@brief Fill all or part of the NeoPixel strip with a color.
@param c 32-bit color value. Most significant byte is white (for
RGBW pixels) or ignored (for RGB pixels), next is red,
then green, and least significant byte is blue. If all
arguments are unspecified, this will be 0 (off).
@param first Index of first pixel to fill, starting from 0. Must be
in-bounds, no clipping is performed. 0 if unspecified.
@param count Number of pixels to fill, as a positive value. Passing
0 or leaving unspecified will fill to end of strip.
*/

noiasca:
guckst du Library:

void fill(uint32_t c=0, uint16_t first=0, uint16_t count=0);

das ist nicht von bis sonder von und Anzahl!

Macht Sinn. Erklärt auch das was da passiert ist. Ich erinnere mich sogar, dass ich das "count" gelesen habe... Da muss ich mir an die eigene Stirn fassen, danke für die Klarstellung :slight_smile:

Damit kann ich die Funktion ggf. für manche Konstellationen nutzen!

JKF2015:
Jetzt ist es nur so: Der Würfel ist "abenteuerlich" verkabelt.

Du könntest mal schauen, ob Dir die Adafruit_NeoMatrix library von Nutzen sein könnte. Da gibt es nach meiner Erinnerung eine Zick-Zack-Verkabelung, die unterstützt wird. Möglicherweise verwechsle ich das aber auch mit den Möglichkeiten der FastLED-Bibliothek. Ob es Dir hilft, ist dann noch eine andere Frage.

Ansonsten schreibst Du Dir eine kleine Umrechenfunktion von linear nach komisch verkabelt. Tipp: Auch switch/case kann einen Bereich mittels case 5 ... 7:.

Danke für den Hinweis. Ich werde mal schauen, wie ich das dann umlege.

Da ich weitestgehend nur Funktionen im Durchlauf und nicht mit Farbspiel plane (außer ggf. eine "Regenbogen" Variante) habe ich mich folgendes gefragt:
Ich will die drei Farben (RGB) mittels Poti dauerhaft regeln, d.h. ich lege drei Variablen R G B an (Integer sollte hier ja ausreichen?) die dauerhaft über "analogRead" den Poti abfragen.

Nur irgendwie will mir nicht in den Sinn, wie ich das am besten kompakt begrenze?
Also bspw die Dim-Funktion der "Build-Up" Funktion von oben:

int r;
int g;
int b;
//Dim up the upper ring
void BuildUp(){
r = analogRead(poti1);
g = analogRead(poti2);
b = analogRead(poti3);
  for(int i=0; i<121; i++){  //Dim i<maximale Leuchtstärke
    for(int h=0; h<8; h++){  //Für jede einzelne RGB
      strip.setPixelColor(104+h, r, g, b);
      strip.setPixelColor(112+h, r, g, b);
      strip.setPixelColor(120+h, r, g, b);
      strip.setPixelColor(96+h, r, g, b);
    }
    strip.show();
    delay(10);
  }

Wenn ich nun die Potis in die folgende Stellung bringen würde:
r = 100%
g = 50%
b = 10%

Wie muss ich diese Funktion aufbauen, dass r von 0 - 120, g von 0 - 60 und b von 0 - 12 hochläuft?

Würde das hier funktionieren:

int r;
int g;
int b;
//Dim up the upper ring
void BuildUp(){
r = analogRead(poti1);
g = analogRead(poti2);
b = analogRead(poti3);
  for(int i=0; i<121; i++){  //Dim i<maximale Leuchtstärke
    for(int h=0; h<8; h++){  //Für jede einzelne RGB
      strip.setPixelColor(104+h, i/(255/r), i/(255/g), i/(255/b));
      strip.setPixelColor(112+h, i/(255/r), i/(255/g), i/(255/b));
      strip.setPixelColor(120+h, i/(255/r), i/(255/g), i/(255/b));
      strip.setPixelColor(96+h, i/(255/r), i/(255/g), i/(255/b));
    }
    strip.show();
    delay(10);
  }

Damit wäre mit oben genanntem Beispiel 255/r = 1, also i/1 => i
255/g = 2, also i/2 => 0,5 * i
255/b = 10, also i/10 => 0,1 * i

Liege ich mit dem Ansatz richtig? zu komplex? Oder gar nicht funktional?

Ich käme auf i/255 * r/1023 * 255 oder gekürzt i * r /1023

Da der Arduino kein Taschenrechner ist, muß man mit dem Variablentyp aufpassen. Für r,g und b uint32_t.

Nur mal so am Rande:

0 .. 1023 auf 0 .. 255 umrechnen geht übrigens glatt mit /4
(der Compiler rechnet das richtig als >>2, weil du ja nur von 10 bit auf 8 bit willst)

Die Luxusvariante der Bereichsumrechnung wäre ja die map()-Funktion.
Die funktioniert auch bei den lustigsten Zuordnungen und nimmt einem die Überlegung "wie muss ich denn nun rechnen" ab.

Hier ein rotes Beispiel:

int r, strip_r;
...
r = analogRead(poti1);
strip_r = map(r, 0, 1023, 0, 120);

Gruß Walter

Danke für die vielen guten Hinweise. Ggf. lese ich mich dann auch mal in die "map" Funktion ein.

Das mit dem Umrechnen nach agmue klappt einwandfrei.

Ich regel das nun über:

r = analogRead(A1)/4;
...
for(..., i*r/255,...){

Und so klappt es wunderbar.
Die Abweichung im Monitor beträgt ~4-6 Units, also wenn ich als i<120 eingebe, liege ich bei voll aufgedrehtem Poti durchschnittlich bei 116-117
Bei i<255 liege ich bei ~249
Ich denke das ist verkraftbar, zumal die Strips ja doch sehr... Hell werden können :smiley:

Besten Dank in die Runde, sollte mir beim weiteren schreiben was auffallen melde ich mich hier wieder :slight_smile:

JKF2015:
Das mit dem Umrechnen nach agmue klappt einwandfrei.

Freut mich :smiley:

JKF2015:
Die Abweichung im Monitor beträgt ~4-6 Units, ...

Das Rechnen mit ganzen Zahlen birgt die Gefahr von Rundungsfehlern, weshalb ich Dir eine etwas andere Berechnung vorgeschlagen hatte.

agmue:
Freut mich :smiley:
Das Rechnen mit ganzen Zahlen birgt die Gefahr von Rundungsfehlern, weshalb ich Dir eine etwas andere Berechnung vorgeschlagen hatte.

Meinst du mit der anderen Berechnung die i * r /1023? Oder wegen dem uint32_t? Letzteres hab ich natürlich befolgt

Würde es so einen gewaltigen Unterschied machen, beim Schritt

r = analogRead(A1)/4;

das /4 weg zu lassen und erst später anzuwenden? Oder überseh ich eine Berechnung gerade?

JKF2015:
Meinst du mit der anderen Berechnung die i * r /1023?

Ja, denn da findet erst die Multiplikation und dann die Division statt. Das sollte den kleinsmöglichen Fehler ergeben. Wegen der Multiplikation wird ein relativ großer Zahlenbereich für das Zwischenergebnis ( 1023 * 255 = 260865 ) benötigt.

Verwende den seriellen Monitor zur Überprüfung, dafür ist er da ;D

Habe es jetzt mal für einen Wert gemacht:

#include <Streaming.h>

void setup()
{
  Serial.begin(9600);
  Serial.println("\nRechenartenüberprüfung");
  Serial << "w = i * r / 1023" << endl;
  Serial << "x = r / 4 * i / 255" << endl;
  Serial << "r " << "\tw" << "\tx" << endl;
  uint32_t i = 121;
  for (uint16_t r = 0; r <= 255; r++)
  {
    byte w = i * r / 1023;
    byte x = r / 4 * i / 255;
    Serial << r << "\t" << w << "\t" << x;
    if (w != x) Serial << "\t***";
    Serial << endl;
  }
}

void loop() {}
[sup]Rechenartenüberprüfung
w = i * r / 1023
x = r / 4 * i / 255
r w x
0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
7 0 0
8 0 0
9 1 0 ***
10 1 0 ***
11 1 0 ***
12 1 1
13 1 1
14 1 1
15 1 1
16 1 1
17 2 1 ***
18 2 1 ***
19 2 1 ***
20 2 2
21 2 2
22 2 2
23 2 2
24 2 2
25 2 2
26 3 2 ***
27 3 2 ***
28 3 3
29 3 3
30 3 3
31 3 3
32 3 3
33 3 3
34 4 3 ***
35 4 3 ***
36 4 4
37 4 4
38 4 4
39 4 4
40 4 4
41 4 4
42 4 4
43 5 4 ***
44 5 5
45 5 5
46 5 5
47 5 5
48 5 5
49 5 5
50 5 5
51 6 5 ***
52 6 6
53 6 6
54 6 6
55 6 6
56 6 6
57 6 6
58 6 6
59 6 6
60 7 7
61 7 7
62 7 7
63 7 7
64 7 7
65 7 7
66 7 7
67 7 7
68 8 8
69 8 8
70 8 8
71 8 8
72 8 8
73 8 8
74 8 8
75 8 8
76 8 9 ***
77 9 9
78 9 9
79 9 9
80 9 9
81 9 9
82 9 9
83 9 9
84 9 9
85 10 9 ***
86 10 9 ***
87 10 9 ***
88 10 10
89 10 10
90 10 10
91 10 10
92 10 10
93 11 10 ***
94 11 10 ***
95 11 10 ***
96 11 11
97 11 11
98 11 11
99 11 11
100 11 11
101 11 11
102 12 11 ***
103 12 11 ***
104 12 12
105 12 12
106 12 12
107 12 12
108 12 12
109 12 12
110 13 12 ***
111 13 12 ***
112 13 13
113 13 13
114 13 13
115 13 13
116 13 13
117 13 13
118 13 13
119 14 13 ***
120 14 14
121 14 14
122 14 14
123 14 14
124 14 14
125 14 14
126 14 14
127 15 14 ***
128 15 15
129 15 15
130 15 15
131 15 15
132 15 15
133 15 15
134 15 15
135 15 15
136 16 16
137 16 16
138 16 16
139 16 16
140 16 16
141 16 16
142 16 16
143 16 16
144 17 17
145 17 17
146 17 17
147 17 17
148 17 17
149 17 17
150 17 17
151 17 17
152 17 18 ***
153 18 18
154 18 18
155 18 18
156 18 18
157 18 18
158 18 18
159 18 18
160 18 18
161 19 18 ***
162 19 18 ***
163 19 18 ***
164 19 19
165 19 19
166 19 19
167 19 19
168 19 19
169 19 19
170 20 19 ***
171 20 19 ***
172 20 20
173 20 20
174 20 20
175 20 20
176 20 20
177 20 20
178 21 20 ***
179 21 20 ***
180 21 21
181 21 21
182 21 21
183 21 21
184 21 21
185 21 21
186 22 21 ***
187 22 21 ***
188 22 22
189 22 22
190 22 22
191 22 22
192 22 22
193 22 22
194 22 22
195 23 22 ***
196 23 23
197 23 23
198 23 23
199 23 23
200 23 23
201 23 23
202 23 23
203 24 23 ***
204 24 24
205 24 24
206 24 24
207 24 24
208 24 24
209 24 24
210 24 24
211 24 24
212 25 25
213 25 25
214 25 25
215 25 25
216 25 25
217 25 25
218 25 25
219 25 25
220 26 26
221 26 26
222 26 26
223 26 26
224 26 26
225 26 26
226 26 26
227 26 26
228 26 27 ***
229 27 27
230 27 27
231 27 27
232 27 27
233 27 27
234 27 27
235 27 27
236 27 27
237 28 27 ***
238 28 27 ***
239 28 27 ***
240 28 28
241 28 28
242 28 28
243 28 28
244 28 28
245 28 28
246 29 28 ***
247 29 28 ***
248 29 29
249 29 29
250 29 29
251 29 29
252 29 29
253 29 29
254 30 29 ***
255 30 29 ***
[/sup]

Danke für den ausführlichen Test. Erstaunlich, wie viele Werte darunter leiden. Dann wird das auf i*r/1023 geändert!

Aktuell warte ich leider immer noch auf ein paar Teile für die Box unter der Lampe. Geplant ist, diese aus Plexiglas zu bauen und ein paar 3D Druck Halter reinzusetzen, um die Platine mit Arduino und Power Supply reinzusetzen.
Diese Box war als "geschlossen" angedacht.
Nachdem ich aber in den ersten Testläufen die Stromzufuhr mal angefasst hab, war die schon... warm. Nicht heiß, aber ~30-40°C maximal.


Ich nutze so eine Stromversorgung. 5V, 20A. Kein Lüfter verbaut.

Einmal von der Elektronik weg:
Macht es Sinn, in den Unterboden Lüftungsschlitze einzubauen? Sollten da vllt sogar kleine Lüfter für Luftzirkulation dazu? Es ist jetzt kein 24/7 Betrieb geplant, aber so ein paar Stündchen am Stück kommen da bestimmt zusammen..

Installiert wird der ganze Spaß mit einem alten Kaltgerätestecker Kabel inkl. Zugentlastung.

Und dann wieder hin zur Elektronik:

  1. Der 1000uF Kondensator - kann ich den direkt an das Netzteil dort klemmen? Oder sollte ich den lieber über die Platine mitführen und dort zwischenhängen? Ich meine gelesen zu haben, dass er eigtl "so nah wie möglich" an den LEDs sein soll... Möchte ihn aber auch ungern irgendwo frei hängen lassen :smiley:

  2. Der Arduino Micro und seine Stromversorgung...
    Zuerst dachte ich mir: "Altes USB Kabel an den Arduino und an das Netzteil" - aber ich möchte eigtl ggf. nachprogrammieren können, ohne groß was auseinander zu bauen. Da das Netzteil 5V liefert, dachte ich mir, ich könnte das an "RAW" und "GND" hauen. Das hatte ich in einem anderen, fest verbauten Projekt schon einmal getan, musste aber nix mehr nachprogrammieren.

Nur da hört mein Elektronikverständnis etwas auf - kann ich dann, wenn das NT an ist und den Arduino & die LEDs versorgt einfach ein MicroUSB an den Arduino anschließen? Kommen sich da die Spannungsversorgung über USB und durch das NT nicht in die Quere?

JKF2015:
Macht es Sinn, in den Unterboden Lüftungsschlitze einzubauen?

Um Wärme abzuführen, gibt es verschiedene Möglichkeiten. Ohne Schlitze muß das Gehäuse die Energie abstrahlen, was meist bei Metallgehäusen einigermaßen gut funktioniert, bei Kunststoff eher nicht so. Mit dem notwendigen Wissen ausgestattet, kann man sowas berechnen.

Auch die notwendigen Schlitzflächen für natürliche und erzwungene Konvektion lassen sich berechnen.

Nun der dicke Daumen: Das Netzteil hat nicht ohne Grund Löcher im Gehäuse, daran könntest Du Dich orientieren. Wenn Deine Lüftungsschlitze ungefähr die selbe Fläche haben wie die Löcher im Netzteilgehäuse, solltest Du auf der sicheren Seite sein. Ein ungehindertes Strömen der Luft vom Gehäuseboden durch das Netzteil zum Gehäusedeckel sollte möglichst gewährleistet sein.

Also nein, auch im Deckel oder an den Seiten.

Geht es auch mit weniger Fläche? Mit einem Lüfter sicherlich, aber dann mußt Du rechnen oder mit einem Thermometer messen.

JKF2015:
... kann ich den direkt an das Netzteil dort klemmen?

Der schießt Energie nach, wenn diese benötigt wird. Je weiter weg vom Streifen, je dünner, also hochohmiger das Kabel, desto schlechter. Du kannst aber auch viele kleine Kondensatoren verteilen, eventuell geht das besser.

Ich "vergesse" diesen Kondensator gerne und verwende dafür dickere Kabel. Das möchte ich aber nicht als Empfehlung verstanden wissen 8)

JKF2015:
Da das Netzteil 5V liefert, dachte ich mir, ich könnte das an "RAW" und "GND" hauen.

VIN muß größer sein als 5 V, also ca. 6,5 V, sonst hat der Spannungsregler nichts zu regeln. Zumindest verstehe ich das Datenblatt so.

JKF2015:
Kommen sich da die Spannungsversorgung über USB und durch das NT nicht in die Quere?

Sie kommen, wenn Du das NT an den 5V-Pin anschließt. Also USB-Kabel ohne 5V verwenden, aber mit GND.

Erneut vielen Dank für die schnelle und aufschlussreiche Antwort :slight_smile:

Zum 5V Spannungsversorgung / USB Port:
Also wird die einfachste Option sein, ein MicroUSB Kabel aufzuschneiden und wie folgt aufzuteilen:
5V - NT
D+ / D- an USB-A
GND - USB-A / NT gesplittet

So wird 5V und GND als Stromversorgung vom NT geliefert und der PC kann bei Anschluss einwandfrei D+/D- und GND bedienen, richtig?
Der PC meckert da aber nicht, wenn ein USB-Pin Anschluss nicht belegt ist?

Bzgl Kondensator:
Lass es mich so ausdrücken... Mein Testaufbau war:
NT an Breadboard, Kondensator auf der +/- Schiene des Breadboards, ca 20cm Kabel (Ich meine es ist 0,25mm²) vom Breadboard bis zur Lampe - es gab selbst auf hellster Stufe an der letzten LED keine Ausfälle, selbst bei schnell wechselnden Blink-Programmen. Dann sollte es also kein Problem sein.

Bzgl der Belüftung...
Deckel ist keine Option, da da die Lampe drauf sitzt. Das maximale wären wirklich noch die Seiten, wo später auch die Knöpfe dran sind. Meine Idee war einseitig Lüfter "Luft einsaugen" und auf der anderen Seiten einen "Luft rausblasen".
Ich denke aber das wird ein Try-and-Error, ggf. mal einen von diesen Temperatursensoren an den Arduino mit dran hängen und am PC mal ne Stunde lang auslesen, wie es sich da drin verhält.

JKF2015:
... richtig?
Der PC meckert da aber nicht, wenn ein USB-Pin Anschluss nicht belegt ist?

Ja, denn der PC merkt nichts davon.

Manche Platinen aus dem Arduino-Bereich haben in der Nähe des USB-Anschlusses eine Lötbrücke für die 5 V von USB, die man öffnen kann. Im Schaltplan des Micro habe ich das nicht gefunden, möglicherweise kann man aber eine Leiterbahn trennen. Dann benötigt man kein spezielles Kabel und braucht auch nicht dran zu denken.

JKF2015:
Dann sollte es also kein Problem sein.

Test- und Realaufbau können zu unterschiedlichen Ergebnissen führen, aber Du weißt ja, woran es liegen könnte.

JKF2015:
Ich denke aber das wird ein Try-and-Error ...

Probieren geht über Studieren. Wenn das Gehäuse schmilzt - ist mir schon passiert - oder die Elektronik abraucht, kennst Du die Ursache.

Etwas Risiko ist immer ;D