Forum: Mikrocontroller und Digitale Elektronik Hilfe zu Arduino Library


von Jakob P. (jako_e)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe ein Problem mit einer Arduino Library.
Ich möchte gerne 3 Variablen Exportieren.
Das sind die hier:

int _redValue;
int _greenValue;
int _blueValue;

Nur ich bekomme die nicht raus.
Habe es schon versucht mit einer kleinen Funktion:
Im Header:
int* getRed();
int* getGreen();
int* getBlue();

Im Source-File:

int* RGBLED::getRed()
{
   return _redValue;
}

int* RGBLED::getBlue()
{
   return _blueValue;
}

int* RGBLED::getGreen()
{
   return _greenValue;
}

Wenn ich versuche mit int* green = getGreen(); den Wert aufzurufen,
bekomme ich immer die Fehlermeldung:

error: expected primary-expression before '.' token

Was mache ich Falsch?
Die zu modifizierende Library habe ich angefügt.
Danke für die Hilfe im Voraus!

von Mark B. (markbrandis)


Lesenswert?

Jakob P. schrieb:
> Nur ich bekomme die nicht raus.
> Habe es schon versucht mit einer kleinen Funktion:
> Im Header:
> int* getRed();
> int* getGreen();
> int* getBlue();

Der Stern hat da nichts verloren. Die Variablen sind so deklariert:

1
    private:
2
  
3
    int _redValue;
4
    int _greenValue;
5
    int _blueValue;

Also werden Deine Funktionen auch einfach int-Werte zurückgeben wollen 
und keine Zeiger.

: Bearbeitet durch User
von Jakob P. (jako_e)


Lesenswert?

Habe es ohne die Sterne ausprobiert,
es kommt immer noch der gleiche Fehler.
Das Programm wurde mit Der IDE 1.6.5 kompiliert.
die Variablen zum auslesen stehen in der Private.

mfg Jakob

von Mark B. (markbrandis)


Lesenswert?

Das hier in der Header-Datei (Ausschnitt):

1
private:
2
  
3
    int _redValue;
4
    int _greenValue;
5
    int _blueValue;
6
7
public:
8
9
    int getRed(void);
10
    int getGreen(void);
11
    int getBlue(void);

und das hier in der cpp-Datei (Ausschnitt):

1
int RGBLED::getRed(void)
2
{
3
    return _redValue;
4
}
5
6
int RGBLED::getGreen(void)
7
{
8
    return _greenValue;
9
}
10
11
int RGBLED::getBlue(void)
12
{
13
    return _blueValue;
14
}

müsste tun.

Für den Aufruf muss natürlich zur Laufzeit erstmal ein Objekt 
existieren. Einfach nur getGreen() im luftleeren Raum aufrufen klappt 
natürlich nicht.

: Bearbeitet durch User
von Christian (Gast)


Lesenswert?

Einfach wie schon obene geschrieben wurde,  Objekt von der Klasse RGBLed 
mit einer beliebigen Variablenname erzeugen und dann diese Variablenname 
Punkt und deine getter Funktion

von Jakob P. (jako_e)


Angehängte Dateien:

Lesenswert?

Vielen dank,

nur der Code läuft nicht -.-
Habe mal die Modifizierte Library angehängt,
habe ich das alles richtig gemacht?

mfg Jakob

von Jakob P. (jako_e)


Lesenswert?

Hat jetzt jemand den Code ausprobiert und verbessert?

Mfg Jakob

von Schlaumeier (Gast)


Lesenswert?

Christian schrieb:
> Einfach wie schon obene geschrieben wurde,  Objekt von der Klasse RGBLed
> mit einer beliebigen Variablenname erzeugen und dann diese Variablenname
> Punkt und deine getter Funktion

Jakob P. schrieb:
> Hat jetzt jemand den Code ausprobiert und verbessert?

Das ist Dein Job als Programmierer ...

von Jakob P. (jako_e)


Lesenswert?

Da ich den Code getestet habe und immer noch die gleiche Fehlermeldung 
bekomme, und arduino mir nicht sagen kann woran es liegt, hoffe ich das 
mir jemand mit dem lästigen Problem hilft.

Mfg Jakob

von Schlaumeier (Gast)


Lesenswert?

Du solltest Dein vollständiges Testprogramm als ino-Datei hier anhängen. 
Dann kann man Dir helfen.

btw: Die Bibliothek umschreiben ist sinnlos und falsch.

von Jakob P. (jako_e)


Angehängte Dateien:

Lesenswert?

So, hier ist das Testprogramm.
Das umzuschreiben ist die einzige Möglichkeit an die RGB-Daten zukommen

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Jakob P. schrieb:
> nur der Code läuft nicht -.-

Woran erkennst du das? Sollen wir alle Rätsel raten?

von Schlaumeier (Gast)


Lesenswert?

Dein sketch ist ziemlich sinnlos. Du läßt eine Funktion einmalig im 
setup laufen, die ihrerseits einmal durch die Farben läuft. (siehe 
unten) Nach dem Ablauf dieser Funktion rufst Du in der loop zyklisch 
die Farben auf und gibst sie über die serielle aus. Was Du da zyklisch 
abrufst, hat mit den Farben innerhalb des crossfade-Effekts nichts mehr 
zu tun.
1
void RGBLED::crossfade(RGBColor &color) {
2
  // map color to values from 0 to 255
3
  int R = _mapColor(color.getRed());
4
  int G = _mapColor(color.getGreen());
5
  int B = _mapColor(color.getBlue());
6
  
7
  int stepR = _calculateStep(_prevRed, R);
8
  int stepG = _calculateStep(_prevGreen, G); 
9
  int stepB = _calculateStep(_prevBlue, B);
10
11
  for (int i = 0; i <= 1020; i++) {
12
    _redValue = _calculateVal(stepR, _redValue, i);
13
    _greenValue = _calculateVal(stepG, _greenValue, i);
14
    _blueValue = _calculateVal(stepB, _blueValue, i);
15
16
    // Write current values to LED pins
17
    analogWrite(_redPin, _redValue);
18
    analogWrite(_greenPin, _greenValue);      
19
    analogWrite(_bluePin, _blueValue); 
20
21
    // Pause for 'wait' milliseconds before resuming the loop
22
#ifdef TimeAlarms_h    
23
    Alarm.delay(_wait);
24
#else
25
    delay(_wait);
26
#endif
27
  }


Was willst Du wirklich erreichen?

von Jakob P. (jako_e)


Lesenswert?

Es kommt immer noch die gleiche Fehlermeldung:
error: expected primary-expression before '.' token

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Jakob P. schrieb:
> Es kommt immer noch die gleiche Fehlermeldung:
> error: expected primary-expression before '.' token

Dann musst du erst mal lernen zu unterscheiden ob ein Code sich
compilieren lässt oder ob er "läuft". Letzteres würde die Ausführung
im Prozessor bedeuten. Deine Fehlermeldung ist aber eine vom
Compiler.

von Michael U. (amiga)


Lesenswert?

Hallo,

irgendwie blicke ich nicht durch:

        int _redValue;
        int _greenValue;
        int _blueValue;

sind Bestandteil der RGBLED.

Deine Funktionen finde ich in der RGBColor?

Gruß aus Berlin
Michael

von Jakob P. (jako_e)


Lesenswert?

Wie gesagt, der Sketch gibt zuerst die Farben aus, und wenn ich die 
Funktion aufrufe, ist der Crossfade im Endzustand das heißt, ich bekomme 
die schon Fertige, auf das PWM zugeschnittene Farbe, diese wird benutzt, 
um die Helligkeit zu Aktualisieren und um beim wiedereinschalten die 
Gleiche Farbe aufzurufen, alternativ könnte man die R,G,B Variablen 
anzapfen, das wäre genauso kompliziert.

mfg Jakob

von Schlaumeier (Gast)


Lesenswert?

Michael U. schrieb:
> Deine Funktionen finde ich in der RGBColor?

Aus der RGBLED.cpp:
1
int RGBLED::getRed(void)
2
{
3
    return _redValue;
4
}
5
6
int RGBLED::getGreen(void)
7
{
8
    return _greenValue;
9
}
10
11
int RGBLED::getBlue(void)
12
{
13
    return _blueValue;
14
}

von Jakob P. (jako_e)


Lesenswert?

Diese Funktion von RGBColor wollte ich auch benutzen, aber sie fasst nur 
die 3 werte in eine variable "zusammen" da das eigentliche Programm die 
Farben mischt, muss ich direkt die Farben abgreifen.

mfg Jakob

von Schlaumeier (Gast)


Lesenswert?

Die Farben, mit denen der Effekt endet, lassen sich berechnen, wenn die 
Startfarbe wie bei Dir vorgegeben ist.

Zitat:
"* The red rises from 0 to 10 in ten steps, the green from
 * 0-5 in 5 steps, and the blue falls from 10 to 7 in three steps.
 *
 * In the real program, the color percentages are converted to
 * 0-255 values, and there are 1020 steps (255*4)."

von Mitlesa (Gast)


Lesenswert?

Mark B. schrieb:
> Für den Aufruf muss natürlich zur Laufzeit erstmal ein Objekt
> existieren.

... und das Objekt wird in der Setup-Funktion so angelegt:
1
RGBLED rgbLED = RGBLED(9, 10, 11, 0, 2, 1); //Pins vom Arduino 9,10,11

Wenn man dann eine Funktion dieses Objektes aufrufen will muss
das Objekt auch "vorne dranstehen" und nicht der Klassentyp.

RGBLED wäre also der Typ.

rgbLED wäre das Objekt, auch Instanz genannt.

Der aufruf müsste also lauten:
1
RED = rgbLED.GetRed();

von Jakob P. (jako_e)


Lesenswert?

Das hat nur eine andere Fehlermeldung gebracht:
error: 'class RGBLED' has no member named

Habe gerade etwas ausprobiert:

void RGBLED::crossfade(RGBColor &color) {
  // map color to values from 0 to 255
  int R = _mapColor(color.getRed());
  int G = _mapColor(color.getGreen());
  int B = _mapColor(color.getBlue());

  EEPROM.update(1,R);
  EEPROM.update(2,G);
  EEPROM.update(3,B);

  int stepR = _calculateStep(_prevRed, R);
  int stepG = _calculateStep(_prevGreen, G);
  int stepB = _calculateStep(_prevBlue, B);

  for (int i = 0; i <= 1020; i++) {
    _redValue = _calculateVal(stepR, _redValue, i);
    _greenValue = _calculateVal(stepG, _greenValue, i);
    _blueValue = _calculateVal(stepB, _blueValue, i);

    // Write current values to LED pins
    analogWrite(_redPin, _redValue);
    analogWrite(_greenPin, _greenValue);
    analogWrite(_bluePin, _blueValue);

    // Pause for 'wait' milliseconds before resuming the loop
#ifdef TimeAlarms_h
    Alarm.delay(_wait);
#else
    delay(_wait);
#endif
  }
  // Update current values for next loop
  _prevRed = _redValue;
  _prevGreen = _greenValue;
  _prevBlue = _blueValue;
  // Pause for optional 'wait' milliseconds before resuming the loop
#ifdef TimeAlarms_h
    Alarm.delay(_hold);
#else
    delay(_hold);
#endif
}

Das EEPROM wird jetzt direkt beschrieben, und es Funktioniert!!
Ich möchte aber nicht, das er immer das EEPROM beschreibt, später laufen 
da drauf Effekte und am Ende ist das EEPROM kaputt.
Gibt es dafür noch eine andere Lösung?

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Jakob P. schrieb:
> Das hat nur eine andere Fehlermeldung gebracht:
> error: 'class RGBLED' has no member named
1
int RGBLED::getRed(void)
2
//          ^^^^^^
3
//          ^
4
{
5
    return _redValue;
6
}
7
8
int RGBLED::getGreen(void)
9
{
10
    return _greenValue;
11
}
12
13
int RGBLED::getBlue(void)
14
{
15
    return _blueValue;
16
}

Du musst natürlich die Funktionen genau so aufrufen wie du sie
definiert hast. Fällt dir was auf?

von Jakob P. (jako_e)


Lesenswert?

Ne, der Code müsste soweit laufen, mir persönliche wäre da nichts 
aufgefallen... Der Teufel steckt im Detail.
Er meckert deswegen rum weil ich "rgbLED" Kleingeschrieben habe.

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Jakob P. schrieb:
> Er meckert deswegen rum weil ich "rgbLED" Kleingeschrieben habe.

nein ..... ich erkenne das du nicht mal Fehlermeldungen lesen kannst.

von Jakob P. (jako_e)


Lesenswert?

Doch, aber er weiß dann nicht in welcher Klasse er sich befindet.
außerdem kommt gleich danach die Gleiche Fehlermeldung wieder.

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Mitlesa schrieb:
> int RGBLED::getRed(void)
> //          ^^^^^^
> //          ^

von Jakob P. (jako_e)


Lesenswert?

ne, läuft immer noch nicht,
schreib mal bitte die Lösung ;)
habe noch nie eine Arduino Library-Geschrieben

mfg Jakob

von Mitlesa (Gast)


Angehängte Dateien:

Lesenswert?

... alles will man auf dem Silbertablett serviert bekommen.

von Jakob P. (jako_e)


Lesenswert?

Ok, vielen Dank!
Code läuft super!
Du hast den Code einfach überall reingehauen,
darauf wäre ich nicht gekommen ;)

mfg Jakob

von Mitlesa (Gast)


Lesenswert?

Jakob P. schrieb:
> Du hast den Code einfach überall reingehauen,

Nö.

Ich habe die Fehlermeldungen des Compilers sorgfältig gelesen
und meine Schlussfolgerungen daraus gezogen.

Dann nur noch einige wenige Zeichen im Quellcode geändert.

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.