Pages: [1] 2   Go Down
Author Topic: Anfänger: hab was übersehen bei Serial.available  (Read 1318 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
//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]
« Last Edit: February 24, 2013, 03:19:02 pm by uwefed » Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Code:
//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]
« Last Edit: February 24, 2013, 03:18:34 pm by uwefed » Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 989
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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

Logged

Tschau
Doc Arduino

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: February 23, 2013, 05:46:49 pm by summ » Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

     tlc_updateFades();
     Tlc.update();

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

gruß stefan
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Serial.println("arsch");     

also wirklich...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

>>>Serial.println("arsch");

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

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hihi doch, jedesmal wenn ich 'c' eingebe smiley-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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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]
« Last Edit: February 24, 2013, 03:17:23 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe jetzt folgenden Code, der aus irgend einem mir nicht ganz ersichtlichen Grund rudimentär das macht, was er soll
Code:
#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.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
#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 (0.88 KB - downloaded 6 times.)
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1921
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi, summ

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

gruß stefan
Logged

Pages: [1] 2   Go Up
Jump to: