Hallo zusammen, ich bin eigentlich Modellbauer und versuche nun neben dem Beruf, der Familie und dem Hobby Modellbau, einen Arduino zu programmieren. Es fällt mir extrem schwer, aber ich bin immerhin soweit, einen Arduino mit einem TLC zu koppeln und den einiges machen zu lassen. Aber in meinem momentanen Sketch klemmt es. Per Eingabe teste ich gerade, wie ich verschiedene PRogrammabläufe auslösen kann. Im diesem Fall sollte eigentlich nach Eingabe "c" das ledPins-Array blinken. Macht es aber nicht, sondern es leuchten alle Leds in dem Array stupide vor sich hin. Wo ist der Fehler und kann mir jemand einen Tipp geben? //import TLC libraries #include "Tlc5940.h" #include "tlc_fades.h" int ledPins[] = {0,1,2}; int pinCount = 4; int max = 100; void setup() { // start communication with TLC chip Tlc.init(); Serial.begin(9600); } TLC_CHANNEL_TYPE channel; void loop(){ Tlc.clear(); if (Serial.available() > 0) { int input1 = Serial.read(); switch (input1) { case 'a': Serial.println("a"); Tlc.set(3,4000); Tlc.update(); break; case 'b': Serial.println("b"); Tlc.set(3,500); Tlc.update(); break; case 'c': ledBlink(); Serial.println("Blinker"); break; } } //delay(1); } void ledBlink(void){ Tlc.clear(); for (int thisPin = 0; thisPin < pinCount; thisPin++) { Tlc.set (ledPins[thisPin], max); uint16_t duration = 150; uint32_t startMillis = millis()+ 2000; uint32_t endMillis = startMillis + duration; tlc_addFade(ledPins[thisPin], 4095, max, startMillis, endMillis); tlc_updateFades(); Tlc.update(); } }
Christian B. schrieb: > int ledPins[] = {0,1,2}; > int pinCount = 4; > for (int thisPin = 0; thisPin < pinCount; thisPin++) { > Tlc.set (ledPins[thisPin], max); ledPins[3] existiert nicht! out-of-bound-access
Ich hab das mal so korrigiert: ledPins[]={2,3,4} pincount = 3 aber dennoch passiert nach Eingabe von c nichts, ausser das die 3 Pins leuchten. Die Fades werden nicht beachtet.
Du definierst zwar die Fades nutzt sie aber nicht. Versuche mal folgendes: in der Funktion ledBlink die Befehle tlc_updateFades(); Tlc.update(); entfernen in der Loop die Befehle um das Delay setzen tlc_updateFades(); delay(25); Tlc.update(); Es scheint so als müsssen die gesetzten Fades per tlc_updateFades innerhalb der Loop aufgerufen werden.
Dann ist wohl das "klassische" Debuggen angesagt. Hinter jder Zeile ein print(), um zu sehen, wo der Computer überhaupt ist. Und die wichtigsten Variablen mit in das print().
Bitte auch "Tlc.clear();" in der Loop entfernen. Das schaltet alle LED aus. Wird aber bisher nicht wirksam, weil das Tlc.update() fehlte ...
Christian B. schrieb: > ledPins[]={2,3,4} > pincount = 3 Mach dir das Leben einfach... pincount=sizeof(ledPins)/sizeof(int);
danke für den Tipp. aber es ändert leider nicht die Tatsache, dass void ledBLink(void) nur einmal ausgeführt wird. Ich müsste wohl irgendwo sagen "mach ledBlink solange, bis Serial.read was anderes macht. Aber ich habe keine Ahnung, wie das genau geht
deine Antwort scheint plausibel. Die Zeit zwischen max und min ist 150 ms. Das wird man nur als Aufblitzen wahrnehmen. Mit einem Wert von 5000 kann man das Verhalten sicher besser beobachten... Wie läßt sich dein Wunsch umsetzen ... relativ simpel ... die Funktion muß in die Loop. Zwei Variablen FadeAktiv 0/1 nicht aktiv / aktiv FadeArt 0/1 max zu min / min zu max Innerhalb des "case 'c':" wird die Variable FadeAktiv invertiert. Jede Eingabe von 'c' schaltet damit zwischen an/aus um. Ausserhalb, aber innerhalb der Loop und nach "if (Serial.available() > 0) { }", wird abgefragt of FadeAktiv <> 0 ist. Innerhalb dieser Abfrage wird noch die Richtung abgefragt (FadeArt) und die min max Werte entsprechend gesetzt. Ob der FadeVorgang abgeschlossen ist zeigt der Rückgabewert von "tlc_updateFades();" ... ist nur ein grober Überblick ... aber so kann man es lösen
Ich habe jetzt lange herumgedoktort und warum es jetzt klapp, kann ich garnicht genau sagen. Woran es jetzt noch hängt ist, dass das Blinken beim Wechsel zwischen Mode 1 und 4 manchmal zufällig wird. Doppelblitzer oder nicht alle ledPins machen mit. Hier mal der aktuelle Code:
1 | #include "Tlc5940.h" |
2 | #include "tlc_fades.h" |
3 | #define interval 500
|
4 | |
5 | |
6 | int fadingMode = 0; //Beginn mit TLC Reset |
7 | int ledPins[] = {2,3,4}; |
8 | int pinCount = sizeof(ledPins)/sizeof(int); |
9 | int max = 100; |
10 | unsigned char x; |
11 | unsigned long startTime = 0; |
12 | unsigned long waitUntil=0; |
13 | |
14 | //TLC_CHANNEL_TYPE channel;
|
15 | |
16 | void setup() { |
17 | |
18 | Tlc.init(); |
19 | Serial.begin(115200); |
20 | }
|
21 | |
22 | |
23 | |
24 | void loop() |
25 | {
|
26 | if(Serial.available()){ |
27 | if(Serial.peek() == 'l'){ |
28 | Serial.flush(); |
29 | }
|
30 | else{ |
31 | fadingMode = Serial.parseInt(); |
32 | Serial.print("Mode set to "); |
33 | Serial.print(fadingMode); |
34 | Serial.print(": "); |
35 | startTime = millis(); |
36 | switch(fadingMode){ |
37 | case 0: |
38 | Serial.println("allet uff Null"); |
39 | break; |
40 | case 1: |
41 | Serial.println("Flash"); |
42 | break; |
43 | case 2: |
44 | Serial.println("Schalte Led an Pin 5 ein"); |
45 | break; |
46 | case 3: |
47 | Serial.println("Dimme Led an Pin 5"); |
48 | break; |
49 | case 4: |
50 | Serial.println("Slow Blinker"); |
51 | break; |
52 | }
|
53 | }
|
54 | }
|
55 | unsigned char brightness; |
56 | switch(fadingMode){ |
57 | case 0: |
58 | // TLC Resert, alles aus
|
59 | for (int thisPin = 0; thisPin < pinCount; thisPin++) { |
60 | Tlc.clear(); |
61 | tlc_removeFades(ledPins[thisPin]); |
62 | Tlc.update(); |
63 | }
|
64 | break; |
65 | case 1: |
66 | Flash(); |
67 | break; |
68 | case 2: |
69 | ledset1(); |
70 | break; |
71 | case 3: |
72 | ledset2(); |
73 | break; |
74 | case 4: |
75 | slowBlink(); |
76 | break; |
77 | |
78 | break; |
79 | default:
|
80 | Serial.println("Unknown Mode!"); |
81 | delay(1000); |
82 | break; |
83 | }
|
84 | }
|
85 | |
86 | void Flash(void){ // Flasher Variante |
87 | for (int thisPin = 0; thisPin < pinCount; thisPin++) { |
88 | // if (!tlc_isFading(ledPins[thisPin])) {
|
89 | // tlc_removeFades(ledPins[thisPin]);
|
90 | uint16_t duration = 150; |
91 | uint32_t startMillis = millis()+ 2000; |
92 | uint32_t endMillis = startMillis + duration; |
93 | //Tlc.set (ledPins[thisPin], max);
|
94 | tlc_addFade(ledPins[thisPin], 4095, max, startMillis, endMillis); |
95 | tlc_updateFades(); |
96 | // Tlc.update();
|
97 | }
|
98 | }
|
99 | void ledset1(void){ // schaltet einfach nur die Led ein |
100 | Tlc.set(5,4000); |
101 | Tlc.update(); |
102 | }
|
103 | |
104 | void ledset2(void){ // verändert einfach Led |
105 | Tlc.set(5,500); |
106 | Tlc.update(); |
107 | }
|
108 | |
109 | void slowBlink(void){ //slower blinking |
110 | Tlc.clear(); |
111 | for (int thisPin = 0; thisPin < pinCount; thisPin++) { |
112 | if (!tlc_isFading(ledPins[thisPin])) { |
113 | Tlc.set(ledPins[thisPin],0); //Versuch, die Leds komplett auschalten |
114 | uint16_t duration = 1000; |
115 | uint32_t startMillis = millis()+ 2000; |
116 | uint32_t endMillis = startMillis + duration; |
117 | //tlc_removeFades(ledPins[thisPin]);
|
118 | //Tlc.set (ledPins[thisPin], max);
|
119 | tlc_addFade(ledPins[thisPin], 0, 4095, startMillis, endMillis); |
120 | tlc_addFade(ledPins[thisPin], 4095, 0, startMillis, endMillis); |
121 | }
|
122 | tlc_updateFades(); |
123 | // Tlc.update();
|
124 | }
|
125 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.