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 | |
2 | |
3 | |
4 | |
5 | |
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
Das hier in der Header-Datei (Ausschnitt):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
und das hier in der cpp-Datei (Ausschnitt):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
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
#4477705
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
Vielen dank, nur der Code läuft nicht -.- Habe mal die Modifizierte Library angehängt, habe ich das alles richtig gemacht? mfg Jakob
Hat jetzt jemand den Code ausprobiert und verbessert? Mfg Jakob
Gast
#4477917
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 ...
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
Gast
#4477946
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.
So, hier ist das Testprogramm. Das umzuschreiben ist die einzige Möglichkeit an die RGB-Daten zukommen mfg Jakob
Gast
#4477966
Jakob P. schrieb: > nur der Code läuft nicht -.- Woran erkennst du das? Sollen wir alle Rätsel raten?
Gast
#4477970
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
Was willst Du wirklich erreichen?
Es kommt immer noch die gleiche Fehlermeldung: error: expected primary-expression before '.' token mfg Jakob
Gast
#4477975
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
Gast
#4477983
Michael U. schrieb: > Deine Funktionen finde ich in der RGBColor? Aus der RGBLED.cpp:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
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
Gast
#4477993
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
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 | |
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 | |
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
Jakob P. schrieb: > Das hat nur eine andere Fehlermeldung gebracht: > error: 'class RGBLED' has no member named
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Du musst natürlich die Funktionen genau so aufrufen wie du sie definiert hast. Fällt dir was auf?
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
Gast
#4478043
Jakob P. schrieb: > Er meckert deswegen rum weil ich "rgbLED" Kleingeschrieben habe. nein ..... ich erkenne das du nicht mal Fehlermeldungen lesen kannst.
Doch, aber er weiß dann nicht in welcher Klasse er sich befindet. außerdem kommt gleich danach die Gleiche Fehlermeldung wieder. mfg Jakob
Gast
#4478060
Mitlesa schrieb: > int RGBLED::getRed(void) > // ^^^^^^ > // ^
ne, läuft immer noch nicht, schreib mal bitte die Lösung ;) habe noch nie eine Arduino Library-Geschrieben mfg Jakob
Gast
#4478101
... alles will man auf dem Silbertablett serviert bekommen.
Ok, vielen Dank! Code läuft super! Du hast den Code einfach überall reingehauen, darauf wäre ich nicht gekommen ;) mfg Jakob
Gast
#4478126
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.