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!
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.
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
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.
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
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 FunktionJakob P. schrieb:> Hat jetzt jemand den Code ausprobiert und verbessert?
Das ist Dein Job als Programmierer ...
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
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.
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
voidRGBLED::crossfade(RGBColor&color){
2
// map color to values from 0 to 255
3
intR=_mapColor(color.getRed());
4
intG=_mapColor(color.getGreen());
5
intB=_mapColor(color.getBlue());
6
7
intstepR=_calculateStep(_prevRed,R);
8
intstepG=_calculateStep(_prevGreen,G);
9
intstepB=_calculateStep(_prevBlue,B);
10
11
for(inti=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
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.
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
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
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
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)."
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
RGBLEDrgbLED=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:
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
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
Jakob P. schrieb:> Er meckert deswegen rum weil ich "rgbLED" Kleingeschrieben habe.
nein ..... ich erkenne das du nicht mal Fehlermeldungen lesen kannst.
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.