Hilfe zu Arduino Library

OP #4477634
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!
Angehängte Dateien:
#4477656
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.
#4477691
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.
Gast #4477970
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?
Gast #4477975
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.
OP #4477982
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
Gast #4477993
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)."
Gast #4477998
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();
OP #4478009
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
Gast #4478021
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren