Forum: Mikrocontroller und Digitale Elektronik Arduino Code klemmt / Anfänger


von Christian B. (summ)


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();
}
}

von troll (Gast)


Lesenswert?

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

von Christian B. (summ)


Lesenswert?

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.

von tono (Gast)


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.

von PittyJ (Gast)


Lesenswert?

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().

von tono (Gast)


Lesenswert?

Bitte auch "Tlc.clear();" in der Loop entfernen.
Das schaltet alle LED aus.
Wird aber bisher nicht wirksam, weil das Tlc.update() fehlte ...

von Christian B. (summ)


Lesenswert?

dann passiert: es blitzt jede led und dann ledPins einmal kurz,

von troll (Gast)


Lesenswert?

Christian B. schrieb:
> ledPins[]={2,3,4}
> pincount = 3
Mach dir das Leben einfach...
pincount=sizeof(ledPins)/sizeof(int);

von Christian B. (summ)


Lesenswert?

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

von tono (Gast)


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

von Christian B. (summ)


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
}

von Ardu (Gast)


Lesenswert?

Christian B. schrieb:
> Hier mal der aktuelle Code:

Danke!

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
Noch kein Account? Hier anmelden.