der Sketch sollte eine RGB LED in 256256256 Farben leuchten lassen. Hier meine Idee:
void setup() {
pinMode (9, OUTPUT);// rote LED in Pin 9
pinMode (10, OUTPUT);// gruene LED in Pin 10
pinMode (11, OUTPUT);// blaue LED in Pin 11
}
void loop() {
for (int r = 0; r < 256; r = r + 1) {
for (int g = 0; g < 256; g = g + 1) {
for (int b = 0; b < 256; b = b + 1) {
analogWrite(9, r);
analogWrite(10, g);
analogWrite(11, b);
delay(10);
}
}
}
}
Das sollte der Sketch tun:
Die innerste for Schleife variiert zunächst alle 256 Werte für die blaue LED bei festem r=0 und g=0.Anschließend wird bei festem r=0 g von 0 auf 255 erhöht. Dabei durchläuft blau jeweils alle Zustände von 0 bis 255. Zuletzt erfolgt dieses Schema mit rot. Die LEDs werden über die PWM gedimmt, die Pins 9,10 und 11 sind beim Arduino PWM fähig. Dieser Fehler wurde ausgeschlossen. Allerdings werden in der Realität nur grün und blau variiert. rot wird nicht angesteuert. Wenn man aber nur die erste for Schleife für die rote LED ablaufen lässt, wird die rote LED gedimmt. Vielleicht findet jemand den Fehler oder eine Erklärung.
Vielleicht kann mir jemand erklären, wie die verschachtelten for Schleifen funktionieren.
Red diode have different voltage than green and blue. Did You measure voltage on arduino?
Check voltage on led. Maybe you should use different value for red diode.
Du hast ein Verständnisproblem bzw bist Dir der langen Zeiten nicht bewußt.
Die Innere for Schleife (blau) erhöht sich alle 0,01 s
Die mittlere Schleife (grün) alle 2,56 s
Die äußere Schleife (rot) alle 655,36 s oder anders ausgedrückt ca alle 10,9 Minuten.
Ein ganzer Durchlauf ( alle 16 Millionen Farben) dauert fast 2 Tage.
Vielleicht kann mir jemand erklären, wie die verschachtelten for Schleifen funktionieren.
@ Uwe richtig , das wäre das was er haben wollte nach seinem Text.
es geht aber auch so.
Erste Schleife läuft von 0-255
Bei Beginn der zweiten Schleife bleibt der Wert von der ersten auf 255 stehen.
Bei Beginn der dritten Schleife steht 1 und 2 auf 255.
damit mischt man farbe 2 zu 1 dazu und später farbe 3 zu den beiden Ersten. Klar dabei bekommmt man nie den Zustand z.B 128,128,128 oder 128,50,100 hin.
Dazu muss halt nur die Laufvariablen r,g,b vorher global definieren nicht innerhalb des schleife.
dann sollte das doch gehen.
Mann kann auch 3 zähler bilden die rauf laufen bis 255 und dann wieder runter bis 0 und das passiert für jeden mit unterschiedlicher Geschwindigkeit. z.B alle 30 ms 80ms 100ms. einen step. ist gleichzeitig eine schöne Übung für den Einsatz von millis().
uwefed:
Du hast ein Verständnisproblem bzw bist Dir der langen Zeiten nicht bewußt.
Die Innere for Schleife (blau) erhöht sich alle 0,01 s
Die mittlere Schleife (grün) alle 2,56 s
Die äußere Schleife (rot) alle 655,36 s oder anders ausgedrückt ca alle 10,9 Minuten.
Ein ganzer Durchlauf ( alle 16 Millionen Farben) dauert fast 2 Tage.
Ich verstehe Deine Frage nicht.
Grüße Uwe
Das ist richtig. Ein kompletter Durchlauf aller Farben würde so lange dauern, das war mir schon bewusst.
Daher hatte ich wegen der Zeit die Werte für r,g und b auch schon reduziert. Z.B. habe ich r und g von 100 auf 120 laufen lassen. Aber es sah gefühlt so aus, als wäre kein rot dabei. Es hätte zumindest bei diesen Intensitäten der Farbton orange erscheinen müssen.
Bezüglich der geschachtelten for Schleifen kam ich ins Grübeln. Müsste die innerste Schleife, nachdem sie die Werte für b von 0 bis 255 erhöht hat, beim Erhöhen der Werte für g von 0 auf 255 nicht immer noch den Wert b=255 haben?
Noch eine andere Frage:
Wie schnell schaltet Arduino ohne ein delay() von einem Befehl zum nächsten? Wie schnell würde also eine LED ein- und ausgeschaltet werden oder anders gefragt, wie lange wäre die LED an, wenn es hieße
Sowohl die LED, als auch das Auge sind nichtlinear. Im unteren Bereich bringen kleine Spannungsänderungen große Helligkeitsänderungen, oben fast keine mehr.
Schau Dir mal das hier an.
Gruß Tommy
Edit: Zu Deiner 2. Frage: So schnell, dass Du es nicht sehen würdest.
Bastel Dir einen Beispiel-Sketch, merke Dir die Startzeit (dieses Mal micros() statt millis() ), lasse den Ausgang 50x an/aus gehen, nehme die Endzeit und zeige an, wie lange der Kram für 50 Zyklen gedauert hat.
diese Zeitangabe ist nur ein 'so ungefähr', da noch die Schleife mit abgearbeitet werden muss - aber als grober Anhaltspunkt sollte Das schon eine verwertbare Zeit geben.
MfG
PS: Wenn 50 zu kurz/zu lang sind, nimm eine andere Anzahl.
appelmann:
Bezüglich der geschachtelten for Schleifen kam ich ins Grübeln. Müsste die innerste Schleife, nachdem sie die Werte für b von 0 bis 255 erhöht hat, beim Erhöhen der Werte für g von 0 auf 255 nicht immer noch den Wert b=255 haben?
Nein.
Das wäre wenn Du die Schleifen hintereinander geschrieben hättest. Du hast sie aber verschachtelt.
for (int r = 0; r < 256; r = r + 1) {
for (int g = 0; g < 256; g = g + 1) {
for (int b = 0; b < 256; b = b + 1) {
analogWrite(9, r);
analogWrite(10, g);
analogWrite(11, b);
delay(10);
}
}
}
Bei so verschachtelten FOR Schleifen läuft zuerst:
b von 0 bis 255 dann
g um 1 erhöht, wird 1
b von 0 bis 255
g um 1 erhöht, wird 2
b von 0 bis 255
g um 1 erhöht, wird 3
b von 0 bis 255
...
b von 0 bis 255 nach 65536 Schleifendurchläufen
g um 1 erhöht, wird 255
r um 1 erhöht, wird 1
g, wird 0
b von 0 bis 255
g um 1 erhöht, wird 1
b von 0 bis 255
g um 1 erhöht, wird 2
b von 0 bis 255
g um 1 erhöht, wird 3
b von 0 bis 255
...
b von 0 bis 255
g um 1 erhöht, wird 255
r um 1 erhöht, wird 1
Damit die Schleifen schneller werden:
vermindere delay auf 1
Mach größere Schritte beim Erhöhen in der Schleife zB 5 oder 10.
for (int b = 0; b < 256; b = b + 5) {
oder
for (int b = 0; b < 256; b = b + 10) {
und so weiter
Wenn du nicht nur testen, sondern tatsächlich mit Farben arebiten willst, definiere die Wuschfarbe mit HSV-Werten (h=hue=Farbe, s=saturation=Sättigung, v=value=Intensität).
H läuft von 0-359 (Farbkreis) durch das ganze Spektrum. Natürlich muss HSV am Ende mittels einer Funktion nach RGB für die LEDs übersetzt werden, aber - wie gesagt - die Auswahl bzw. Festlegung einer (Misch-)Farbe ist so herum wesentlich einfacher ...