Anfänger: hab was übersehen bei Serial.available

Hallo zusammen,
als mega-blutiger Anfänger war heilfroh, als ich endlich raus hatte, wie ich Led-Pins in einem Array zusammenfassen kann. Ich taste mich in meinem Sketch Schritt für Schritt vorwärts. Jetzt wollte ich mal schauen, wie ich bestimmte Aktionen per Tastatur-Eingabe im Serial Monitor steuern kann. Aber es gibt immer den Fehler
error: expected unqualified-id before 'if'

zur Info: ich versuche eine wahnsinnig simple (im Vergleich zu Massenled-Matrix-TLC-sonstwas Schaltungen) zu erreichen und später verschiedene Programmabläufe per Bluetooth (daher der Versuch mit simplen Zahlen oder Buchstaben) zu steuern.
Heute mittag hätte ich fast alle meine Arduino-Sachen, die ich mir dafür zugelegt habe, hier im Forum zum verkauf angeboten, da ich zwischen Arbeit, Familie und Hobby (Modellbau, und dafür soll die Arduino-Anwendung sein) einfach nicht genug Zeit habe, die Programmiersprache komplett zu erlernen.
ich hoffe, es kann mir jemand helfen. Ich habe ausgiebig versucht, mit den Hilfedateien, den Beispielen und viel Lesen im Netz vorwärts zu kommen. Aber viele der Erklärungen sind auf Englisch (normal hab ich damit kein Problem, aber hier muss ich es technisch verstehen) oder sind für wesentlich komplexere Abläufe und nicht für sowas einfaches.

Hier noch der Code dazu:

//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(4,4000);
       Tlc.update();
       break;
     case 'b':    
       Serial.println("b");
       Tlc.set(4,500);
       Tlc.update();
       break;

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

}
}

[EDIT] CODE Tags hinzugefügt Grüße Uwe[/EDIT]

hi,

in der void setup wird alles reingeschrieben, was beim start einmal ausgeführt werden muß, die void loop wird dann immer wieder durchlaufen.
deshalb macht es keinen sinn, etwas außerhalb dieser funktionen oder anderer funktionen, die von der setup oder loop aufgerufen werden, reinzuschreiben.

schreib das, was nach der loop drinsteht, in eine eigene funtion und ruf diese aus der loop auf.

gruß stefan

meintest Du sowas? Jetzt klappt es mit der Tastatureingabe. Aber in case 'c' tut sich nichts, ausser das die Leds statisch leuchten.

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

[EDIT] CODE Tags hinzugefügt Grüße Uwe[/EDIT]

Hallo,

leg mal Deine LEDs nicht auf D0 / D1, das ist die serielle Schnittstelle.

Ich hab mal entsprechend ledPins[] = {2,3,4} ind pinCount = 3 koorigiert.
Aber dennoch: sobald ich im Terminal c eingebe, leuchten pins 2,3,4 dauerthaft. Ich hab keine Idee, woran es liegt, dass er die fades nicht ausführt und nix mehr macht.
Übrigens: sobald ich 'c' mehrfach hintereinander im Terminal eingeben, so änderns sich die Helligkeitswerde des Led-Arrays. Mir scheint, als springe ich damit an irgend eine "zeitliche" Stelle in dem void ledBlink und dieser void scheint irgendwie stehen zu bleiben.
Weiß ja nicht mal, ob ich was richtiges vermute, geschweige denn, wie ich es lösen kann.

hi,

tlc_updateFades();
Tlc.update();

bist Du sicher, daß Du an dieser stelle beides brauchst? lass das zweite mal weg...

gruß stefan

Serial.println("arsch");

also wirklich...

Serial.println("arsch");

na endlich mal einer, der den Code komplett gelesen hat :wink:
Ja, da hatte gerade eine gewisse Abneigung gegen den Arduino

aber Dir ist schon klar, daß in diesem fall der arduino arsch zu Dir gesagt hat?

hihi doch, jedesmal wenn ich 'c' eingebe :wink:

ich habs auch schon geändert auf Blinker! da ich ja immerhin schon was geschafft hatte.

Nun habe ich auch
tlc_updateFades();
Tlc.update();
wie Du vorgeschlagen hast geändert. also nur noch tlc_updateFades();

aber nix. Selbes Ding: 'c' im Terminal ergibt nur dauerleuchtende Leds an ledPins[]. Und immer wenn ich 'c' nochmal eingebe, leuchten sie mit anderer Helligkeit

hi,

irgendwie versteh ich den code auch nicht, kann nur momentan nix probieren, hab' keinen zusammengebauten arduino zur hand.
aber:
Du setzt erst auf max, also 100
zwei sekunden nach dem senden von c soll die led von 4095 auf 100 faden, und zwar innerhalb von einenhalb zehntelsekunden.

versuch das fade erstmal für eine led in einem sonst leeren sketch.

gruß stefan

wenn ich den Code ganz ohne sämtliche Teile für die Eingaben bastel, also nur void Blinker habe, dann ergibt das einen Blitzer-Effekt für ledPins[]
Ich weiß, es mag nicht elegant sein, wie ich es gelöst habe, aber ich setz die ledPins auf einen Wert und "blitze" auf den Wert zurück. Geht bestimmt auch eleganter.
Momentan macht der void Blinker(void) genau einen durchlauf. Ich poste hier nochmal den hoffentlich anständigt bereinigten Code:

//import TLC libraries
#include "Tlc5940.h"
#include "tlc_fades.h" 
int ledPins[] = {2,3,4};
int pinCount = 3;
int max = 100;

void setup()
{
  // start communication with TLC chip
  Tlc.init();
  Serial.begin(115200);
}

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(5,4000);
       //Tlc.update();
       break;
     case 'b':    
       Serial.println("b");
       Tlc.set(5,500);
       //Tlc.update();
       break;
     case 'c':  
      ledBlink(); 
      Serial.println("Blinker");     
      break;
     }
  }

      tlc_updateFades();
      //delay(25);
      Tlc.update();
 }

void ledBlink(){
  //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();
}
}

[EDIT] CODE Tags hinzugefügt Grüße Uwe[/EDIT]

Ich habe jetzt folgenden Code, der aus irgend einem mir nicht ganz ersichtlichen Grund rudimentär das macht, was er soll

#include "Tlc5940.h"
#include "tlc_fades.h" 
#define interval 500


int fadingMode = 0; //Beginn mit TLC Reset
int ledPins[] = {2,3,4};
int pinCount = sizeof(ledPins)/sizeof(int);
int max = 100;
unsigned char x;
unsigned long startTime = 0;
unsigned long waitUntil=0;

//TLC_CHANNEL_TYPE channel;

void setup()   {                

   Tlc.init();
  Serial.begin(115200);
}



void loop()
{    
  if(Serial.available()){
    if(Serial.peek() == 'l'){
      Serial.flush();
    }
    else{
      fadingMode = Serial.parseInt(); 
      Serial.print("Mode set to "); 
      Serial.print(fadingMode); 
      Serial.print(": ");
      startTime = millis();
      switch(fadingMode){
      case 0:
        Serial.println("allet uff Null");
        break;
      case 1:
        Serial.println("Flash");
        break;
      case 2:
        Serial.println("Schalte Led an Pin 5 ein");
        break;
      case 3:
        Serial.println("Dimme Led an Pin 5");
        break;
      case 4:
        Serial.println("Slow Blinker");
        break;
      }
    } 
  }
  unsigned char brightness;
  switch(fadingMode){
  case 0:
    // TLC Resert, alles aus
    for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    Tlc.clear();
    tlc_removeFades(ledPins[thisPin]);
    Tlc.update();
    }
    break;
  case 1:
    Flash();
    break;
  case 2:
    ledset1();
    break;
  case 3:
    ledset2();
    break;
  case 4:
    slowBlink();
    break;
     
    break;   
  default:
    Serial.println("Unknown Mode!");
    delay(1000);
    break;
  }
}

void Flash(void){ // Flasher Variante
      for (int thisPin = 0; thisPin < pinCount; thisPin++) {
     // if (!tlc_isFading(ledPins[thisPin])) {
     // tlc_removeFades(ledPins[thisPin]);
      uint16_t duration = 150;
      uint32_t startMillis = millis()+ 2000;
      uint32_t endMillis = startMillis + duration;
      //Tlc.set (ledPins[thisPin], max);
      tlc_addFade(ledPins[thisPin], 4095, max, startMillis, endMillis);
      tlc_updateFades();
   //   Tlc.update(); 
}
    }
void ledset1(void){ // schaltet einfach nur die Led ein
      Tlc.set(5,4000);
      Tlc.update(); 
}

void ledset2(void){  // verändert einfach Led
     Tlc.set(5,500);
     Tlc.update(); 
}

void slowBlink(void){ //slower blinking
Tlc.clear();
    for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    if (!tlc_isFading(ledPins[thisPin])) {
    Tlc.set(ledPins[thisPin],0); //Versuch, die Leds komplett auschalten 
        uint16_t duration = 1000;
        uint32_t startMillis = millis()+ 2000;
        uint32_t endMillis = startMillis + duration;
      //tlc_removeFades(ledPins[thisPin]);
      //Tlc.set (ledPins[thisPin], max);
        tlc_addFade(ledPins[thisPin], 0, 4095, startMillis, endMillis);
        tlc_addFade(ledPins[thisPin], 4095, 0, startMillis, endMillis);
  }
        tlc_updateFades();
    //  Tlc.update(); 
  }
}

aber was jetzt seltsam ist: wenn ich zwischen Mode 1 und 4 hin und her schalte, wird das Blinken manchmal zufällig. bzw. passieren dann Doppelblitzer oder sowas. Ich hab teilweise auskommentierten Code dringelassen, damit ihr sehr, was ich versucht habe.

hi,

arduino zusammengebaut und probiert:

mit addFade setzt Du ein fade, aber das updateFade muß dann auch dauernd aufgerufen werden. ich frage mich, ob das, was Du willst, nicht unkomplizierter geht.

#include "Tlc5940.h"
#include "tlc_fades.h" 
int ledPins[] = {2,3,4};
int pinCount = 3;
int max = 100;
TLC_CHANNEL_TYPE channel;

void setup()
{
  // start communication with TLC chip
  Tlc.init();
  Serial.begin(9600);
}

void loop(){

 if (Serial.available() > 0) {
     int input1 = Serial.read(); 
     switch (input1) {
     case 'a':    
//       Serial.println("a");
       Tlc.set(4,4000);
       Tlc.update();
       break;
     case 'b':    
//       Serial.println("b");
       Tlc.set(3,4000);
       Tlc.update();
       break;
     case 'c':  
      ledBlink(); 
//      Serial.println("Blinker");     
      break;
     }
  }
  tlc_updateFades();

}

void ledBlink(){
      uint16_t duration = 2000;
      int maxValue = 4095;
      uint32_t startMillis = millis() + 50;
      uint32_t endMillis = startMillis + duration;
      tlc_addFade(3, 0, maxValue, startMillis, endMillis);
}

gruß stefan

forum_summ.ino (902 Bytes)

hi, summ

Du hast den letzten post geschrieben, während ich auf reply war. hab' ich also nicht beachtet.

gruß stefan

Doc_Arduino:
Hallo,

leg mal Deine LEDs nicht auf D0 / D1, das ist die serielle Schnittstelle.

Die LEDs hängen aber am TLC darum darf jeder Pin von 0 bis 16 des TLC verwendet werden.
Grüße Uwe

Du hast den letzten post geschrieben, während ich auf reply war. hab' ich also nicht beachtet.

gruß stefan

Hallo Stefan,

ich wette, dass das wirklich einfacher geht. Aber ich sag ja, ich bin absoluter Neuling und von daher weiß ich es nicht besser;)

Die ganze Konfiguration ist ja erstmal ein Testlauf. Was will ich erreichen? Erstmal habe ich ein Modellbau-Beleuchtung, die mehr Leds schalten und walten soll, als der Arduino Ports hat. PWM-Ports meine ich. Ich möchte dann das ganze per BT Mate Silver steuern. Also verschiedene Zustände abrufen. Das mit dem BT Mate Silver funktioniert problemlos. Jetzt versuche ich also zu ergründen, wie ich die per Blutooth (jetzt erstmal die Terminalbefehle) dazu nutzen kann, um auf dem TLC verschiedene Fade-Programme laufen zu lassen.
Und ich muss noch einen Weg finden, wie der Programmcode auf einen Input wartet, und wenn nach 1 Minute nichts kommt, er trotzdem einen bestimmen void anspringt.