Arduino Code klemmt / Anfänger

OP #3058737
Lesenswert?

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();
}
}
Gast #3059326
Lesenswert?

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.
Gast #3059927
Lesenswert?

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
OP #3060257
Lesenswert?

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
}

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