function-definition Error

Hi, habe ein Problem mit meinem Arduino Code.

Ich habe ein fertiges Projekt genommen, mit dem ich meine im Auto verbauten WS2812b LED streifen per Bluetooth über eine Android App steuern kann.

Jetzt will ich aber, dass diese LEDs an gehen, wenn die Tür auf geht. Versucht habe ich das mit einer if - else Methode:

void setup1() {
  pinMode(tasterPin, INPUT);
}


void TuerKontakt() {
      if (digitalRead(tasterPin) == HIGH) {
        fill_solid( leds, num, CRGB(50, 50, 50));
      } else {

Nach dem Else geht der normale Code weiter. Jedoch kommen jetzt lauter Fehler an stellen des Codes, wo die IDE vorher nicht gemeckert hat.

Den kompletten Code gibts hier:

Ich hoffe Ihr könnt mir Helfen, bin noch ein Greenhorn in der ganzen Programmiergeschichte

MfG
Sebi

Also bei dem bisschen Code kann kein Mensch eine Aussage treffen.
Wer ruft setup1 auf ???

Den Code bitte per CodeTags einstellen.

Ulli

So auf den ersten Blick würde ich mal sagen, dass die Struktur der geschweiften Klammern {...} nicht stimmt.

Also mal geschaut.
Erst mal setup1 wird nie aufgerufen.

Wenn du sie setup nennst wird sie am Programmstart einmal ausgeführt.

Die Funktion "Tuerkontakt" schließt du nicht ordentlich. Hinter dem
else hast du den kompletten restlichen Code (einschließlich loop() )

Die endgültig schließende Klammer steht ganz unten mit ; das stört zwar nicht
aber das hier ist c/c++ und kein Pascal :wink: .

Ich glaube ich verstehe was du willst : Wenn nicht Türkontakt dann Programm soll tun wie früher.
Aber so geht das nicht. Ich glaube du musst doch Programmieren lernen.

Um die Compilerfehler loszuwerden die Klammer mit dem ; wegnehmen und statt des else
einfügen. Die Klammer nach dem else weg !

Also statt } else { "Alles alte" };

}}

Dann wird es wahrscheinlich erst mal fehlerfrei compilieren, aber noch lange nicht tun was du willst.

Ulli

Hi,

bitte pack den Sketch zukünftig in Code-Tags: [code]Codeabschnitt[/code] (ohne *), auch wäre ein anklickbarer Link komfortabel.

Aber zu deinem Problem:
Du hast den Eingang für den Türkontakt in einer Funktion setup1() eingetragen (ab Zeile 34), diese wird im Sketch aber nie aufgerufen, also auch nicht ausgeführt.

Packe

pinMode(tasterPin, INPUT);

in die dafür vorgesehene Funktion setup() und teste erneut.

Edit: Zu langsam :wink:

Hi, danke schonmal für die Antworten!

Hier nochmal der komplette Code. Habe ich das mit dem Else so richtig verstanden?

#include<FastLED.h>
#include<AltSoftSerial.h>

#define NUM_LEDS_1   10
#define NUM_LEDS_2   10

// AltSoftSerial RX_PIN 9, TX_PIN 8

#define DATA_PIN_1   2
#define DATA_PIN_2   3

#define COLOR        0
#define GRADIENT     1
#define ANIMATION    2
#define FADE         3

#define DEV_A        0
#define DEV_1        1
#define DEV_2        2

#define NUM_PALETTES 7
int tasterPin = 44;
DEFINE_GRADIENT_PALETTE( RedOrangeColors_gp ) {
  0, 255, 89, 0,  64, 255, 183, 0,  128, 255, 17, 0,  191, 255, 183, 0,  255, 237, 38, 3,
};
DEFINE_GRADIENT_PALETTE( BlueGreenColors_gp ) {
  0, 0, 255, 102,  10, 0, 255, 102,  64, 0, 166, 255,  128, 0, 255, 191,  191, 0, 123, 255,  245, 5, 235, 78,  255, 5, 235, 78,
};
DEFINE_GRADIENT_PALETTE( MagentaColors_gp ) {
  0, 221, 0, 255,  10, 221, 0, 255,  64, 89, 0, 255,  128, 255, 0, 72,  191, 102, 0, 255,  245, 235, 7, 201,  255, 235, 7, 201,
};

void setup() {
  pinMode(tasterPin, INPUT);
}

class LED {
  private:
    /*const CRGBPalette16 p = RainbowColors_p;
      const CRGBPalette16 palettes[] = {p};//, PartyColors_p, CloudColors_p, LavaColors_p, OceanColors_p, ForestColors_p, HeatColors_p};*/
    CRGB *leds;
    byte num;
    CRGB dest = CRGB::White;
    CRGB current = CRGB::Black;
    byte state = FADE;
    byte op = 0;
    byte m = 0;
    float phi = 0;
    float phi2 = 0;
    float lastphi = 0;
    short cyc = 0;
    bool active = true;

    float sp = 1;
    float opt1 = 1;
    float opt2 = 1;



  public:
    LED(CRGB * _leds, byte _num) {
      leds = _leds;
      num = _num;
    }

    void TuerKontakt() {
      if (digitalRead(tasterPin) == HIGH) {
        fill_solid( leds, num, CRGB(50, 50, 50));
      } else {
        
        void setColor(CRGB color) {
          if (!active) return;
          current = color;
          state = COLOR;
        }

        void setGradient(byte _op) {
          if (!active) return;
          phi = lastphi = 0;
          op = _op;
          state = GRADIENT;
        }

        void setAnimation(byte _op) {
          if (!active) return;
          phi = 0;
          op = _op;
          state = ANIMATION;
        }

        //[...]

        void sinelon() {
          fadeToBlackBy( leds, num, opt1 * 10);
          int pos = (int)((sin(phi2 * 2 * PI / 255) + 1) / 2.0 * num);
          leds[pos] += CHSV( phi, 255, 192);
        }


        CRGBPalette16 getPalette(byte i) {
          switch (i) {
            case 0: return (CRGBPalette16) RainbowColors_p;
            case 1: return (CRGBPalette16) PartyColors_p;
            case 2: return (CRGBPalette16) RedOrangeColors_gp;
            case 3: return (CRGBPalette16) BlueGreenColors_gp;
            case 4: return (CRGBPalette16) MagentaColors_gp;
            case 5: return (CRGBPalette16) CloudColors_p;
            case 6: return (CRGBPalette16) ForestColors_p;
            case 7: return (CRGBPalette16) HeatColors_p;
            case 8: return (CRGBPalette16) LavaColors_p;
            case 9: return (CRGBPalette16) OceanColors_p;
            case 10: return (CRGBPalette16) RainbowStripeColors_p;

            default: return (CRGBPalette16)RainbowColors_p;
          }
        }

      };

      CRGB leds1[NUM_LEDS_1];
      CRGB leds2[NUM_LEDS_2];

      unsigned long t;
      long s = 0;
      short c = 0;

      CRGB readCol;

      /* SoftwareSerial Serial(5, 4); */
      AltSoftSerial btSerial;

      LED *strip1;
      LED *strip2;

      void setup() {
        FastLED.addLeds<WS2812B, DATA_PIN_1, GRB>(leds1, NUM_LEDS_1);//.setCorrection( 0xAFFFC0 );
        FastLED.addLeds<WS2812B, DATA_PIN_2, GRB>(leds2, NUM_LEDS_2);

        strip1 = new LED(leds1, NUM_LEDS_1);
        strip2 = new LED(leds2, NUM_LEDS_2);

        FastLED.show();

        btSerial.begin(9600);
        Serial.begin(9600);
        t = micros();
      }

      byte readByte() {
        byte c = 0;
        while (!btSerial.available()) {
          delayMicroseconds(500);
          c++;
          if (c > 100) {
            return 0;
          }
        }
        return btSerial.read();
      }

      CRGB readColor() {
        byte r = readByte();
        byte g = readByte();
        byte b = readByte();
        return CRGB(r, g, b);
      }

      void handleInput() {
        char c = btSerial.read();
        /* Serial.println(c); */
        if (c == 'c') {
          CRGB c = readColor();
          byte check = readByte();
          if (check == ('c' + c.r + c.g + c.b) % 256) {
            strip1->setColor(c);
            strip2->setColor(c);
          }
        } else if (c == 'g') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('g' + n) % 256) {
            strip1->setGradient(n);
            strip2->setGradient(n);
          }
        } else if (c == 'a') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('a' + n) % 256) {
            strip1->setAnimation(n);
            strip2->setAnimation(n);
          }
        } else if (c == 'f') {
          CRGB c = readColor();
          byte check = readByte();
          if (check == ('f' + c.r + c.g + c.b) % 256) {
            strip1->setFade(c);
            strip2->setFade(c);
          }
        } else if (c == 'd') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('d' + n) % 256) {
            if (n == 0) {
              strip1->setActive(true);
              strip2->setActive(true);
            } else if (n == 1) {
              strip1->setActive(true);
              strip2->setActive(false);
            } else if (n == 2) {
              strip1->setActive(false);
              strip2->setActive(true);
            }
          }
        } else if (c == 'm') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('m' + n) % 256) {
            strip1->setMode(n);
            strip2->setMode(n);
          }
        } else if (c == 's') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('s' + n) % 256) {
            strip1->setSpeed(n);
            strip2->setSpeed(n);
          }
        } else if (c == 'o') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('o' + n) % 256) {
            strip1->setOpt1(n);
            strip2->setOpt1(n);
          }
        } else if (c == 'p') {
          byte n = readByte();
          byte check = readByte();
          if (check == ('p' + n) % 256) {
            strip1->setOpt2(n);
            strip2->setOpt2(n);
          }
        }
      }


      void fps() {
        int dt1 = micros() - t;
        int wait = (16666 - dt1) / 1000;
        if (wait > 0) delay(wait);
        //delay(10);
        s += micros() - t;
        if (c == 0) {
          /* Serial.println(100000000/s); */
          s = 0;
        }
        c++;
        c %= 100;
        t = micros();
      }

      void loop() {
        while (btSerial.available()) {
          handleInput();
          /* Serial.println("handleInput"); */
        }
        bool a = strip1->loop_1();
        bool b = strip2->loop_1();
        if (a || b) {
          FastLED.show();
          strip1->closeLoop();
          strip2->closeLoop();
        }
        FastLED.show();
        fps();
      };
    }
}

Diese Fehler haut er trotzdem noch raus:

led_control_slave:416:5: error: expected '}' at end of input

exit status 1
expected ';' after class definition

Sorry falls ich mich blöd anstelle xD

P.S. der gesamte Code ist zu lang zum einfügen, hab in der Mitte was von den Effekten rausgelöscht

Hi

Ist loop() Sind loop() und setup() INNERHALB der Struktur/Klasse??

MfG

postmaster-ino:
Hi

Ist loop() Sind loop() und setup() INNERHALB der Struktur/Klasse??

MfG

Ja... alles ab dem else in TuerKontakt ist da drin, da es ja nur dann aufgerufen werden soll, wenn die Türen geschlossen sind. Falls es da einen anderen Ansatz gibt, gerne her damit :stuck_out_tongue:

Jetzt hast du die Funktion setup() 2x im Sketch, hau pinMode(tasterPin, INPUT); in die bereits vorhandene setup() weiter unten, wundert mich aber das dazu keine Fehlermeldung ausgegeben wird.

Aber grundsätzlich ist dein Sketch komplett vermurkst, neben loop() und setup() in der Klasse, wie postmaster-ino schon geschrieben hat, hast du noch alle anderen Funktion dort eingebaut und zusätzlich hast du Funktionen innerhalb von Funktionen gesetzt z.B.:

   void TuerKontakt() {
      if (digitalRead(tasterPin) == HIGH) {
        fill_solid( leds, num, CRGB(50, 50, 50));
      } else {
        
        void setColor(CRGB color) {
          if (!active) return;
          current = color;
          state = COLOR;
        }

        void setGradient(byte _op) {
          if (!active) return;
          phi = lastphi = 0;
          op = _op;
          state = GRADIENT;
        }

        void setAnimation(byte _op) {
          if (!active) return;
          phi = 0;
          op = _op;
          state = ANIMATION;
        }

Die fehlende } in Zeile 416 ist noch das kleinste Problem.

Hi,

wiegesagt, der Sketch ist nicht von mir, ich würde sowas überhaupt nicht hinbekommen xD

Das einzige was ich geändert habe ist das mit dem Türkontakt. Das habe ich aber auch nur so gemacht, da mir sonst nichts eingefallen ist.

Verlinke bitte mal den ursprünglichen Sketch, also den bevor du Änderungen gemacht hast. War der lauffähig?

Das ist der ursprüngliche sketch: led-control/led_control_slave.ino at master · dbucher97/led-control · GitHub

Der hat so einwandfrei ohne Fehler funktioniert

Ich sehe schon einige Unterschiede, das Funktionen in Klassen gesetzt werden können, wusste ist bisher nicht, aber mit Klassen bin ich noch nicht fit.

Die Funktionen innerhalb einer Klasse heißen Methoden. Falls Du mal über den Begriff stolperst.

Gruß Tommy

Tommy56:
Die Funktionen innerhalb einer Klasse heißen Methoden. Falls Du mal über den Begriff stolperst.

Gruß Tommy

Ah! Danke, jeden Tag was neues! :wink:

An Klassen habe ich mich noch nicht rangetraut, auf jeden Fall gut zu wissen.

Du arbeitest aber ständig damit: z.B. ist Serial eine Klasse. Serial.begin(115200) ist eine Methode davon.

Ganz grob vereinfacht gesagt ist alles was variablenname.methodenname(...) heißt, ist der Aufruf einer Methode einer Klasse. Das musst Du grundlegend verstehen lernen.

Gruß Tommy

Ich weiß schon dass ich ständig damit arbeite, aber um eigene Klassen zu erstellen oder eventuell welche zu verändern, hab ich mich noch nicht gewagt. Aber wird irgendwann auch noch werden.

Auch wenn es etwas teuer ist, dieses Buch "Der C++-Programmierer" kann ich wirklich empfehlen.

Gruß Tommy

Was sind schon 40,-? Wenn ich es mal besser beherrschen sollte, lässt es sich vielleicht auch mal beruflich nutzen, also könnte es doppelt nützlich sein.

Hi

So hätte ich die 40€ nun nicht betrachtet - unter Den Umständen sollte ich kein Geld mehr ausgeben :wink:
(bin aber ganz zufrieden mit meinem Tun)
Ich sehe Das so: Hobby kostet Geld - außerdem habe ich schon wesentlich mehr Geld für wesentlich sinnlosere Dinge ausgegeben - irgendwo gibt's hier noch ein englisches Assembler-Buch, meine zum 8086 oder 80286 ... wobei Das schon ein Unterschied wäre ...

MfG