wird mir einem Fehler “invalid cast to abstract class type ‘tcBase’” quittiert. Und jetzt weiß ich nicht weiter, aber vielleicht kann mir jemand weiterhelfen.
Was mir weiterhin nicht klar wird: eigentlich müsste ich als Parameter auch noch den Thermoelemente Typ (also K) übergeben. Aber keine Ahnung wie das rein soll.
Du musst erst mal ein Objekt der Klasse erzeugen. Wie fast überall anders auch. Vielleicht mal generell anschauen wie das in C++ funktioniert. Da gibt es sehr viele Anleitungen
Außerdem ist die Basis-Klasse tcBase eben abstrakt, wodurch man sie nicht direkt verwenden kann. Erst die Kinder-Klassen haben spezifischen Code für bestimmte Thermoelement-Typen
eigentlich müsste ich als Parameter auch noch den Thermoelemente Typ (also K) übergeben. Aber keine Ahnung wie das rein soll.
Nein. Jeder Typ hat eine eigene Klasse die von einer gemeinsamen Klasse abgeleitet ist:
class typeK : public tcBase
class typeT : public tcBase
class typeJ : public tcBase
Dann erstellt man ein z.B. ein Objekt der Klasse typeK und verwendet dieses. Die gemeinsame Basis-Klasse stellt im Prinzip nur sicher dass sich alle Klassen gleich verhalten. Außerdem kann man Kind-Klassen über Zeiger/Referenzen auf die Basis-Klasse ansprechen, aber das ist hier irrelevant
Hmm, ich verstehe es immer noch nicht. Libs ohne entsprechende Beispiele sind mir ein Graus.
Ich meinte bisher, das Objekt der Klasse wird in der Lib erzeugt, und ich kann es dann entsprechend benutzen? Der (auskommentierte) Versuch die nicht abstrakte Klasse typeK aufzurufen, ging ebenso wenig weil “protected”.
Ich würde ja nicht fragen, wenn ich verstehen würde, wie es programmiert ist.
tcBase().Temp_C(0,0)
soll ja auch 2 Werte übergeben. Müsste ich da explizit angeben, dass sie float sind?
paulpaulson:
wird kein Wert im Datentyp FLOAT übergeben.
Das ist nicht das eigentliche Problem. Das mit den zwei Nullen als Argumente kompiliert wenigstens, auch wenn es zu nichts führt
paulpaulson:
Ich meinte bisher, das Objekt der Klasse wird in der Lib erzeugt, und ich kann es dann entsprechend benutzen?
Und wo wird das gemacht? Dass Bibliotheken automatisch Instanzen erzeugen gibt es in der Arduino Software. Aber nicht hier. Die kann ja nicht wissen welchen Typ du verwenden willst
Geht vielleicht so:
typeK thermo; //am besten global und nicht in loop() !
Serial.println(thermo.Temp_C(...));
Dann muss man laut Header die Spannung in mV übergeben
Bibliotheken kommen auch oft mit Beispielen. Wenn da also sonst noch was dabei ist mal da reinschauen
Das ist Unsinn:
tcBase().Temp_C(0,0)
Erst mal kannst du mit abstrakten Klassen so nichts direkt machen. Selbst wenn es eine normale Klasse wäre ruft das direkt den Konstruktor auf. Das macht was ganz anderes als du denkst
Also, wenn ich mir das Datenblatt so anschaue, muss ich schon sagen, dass dieser ADC recht gut für diesen Zweck geeignet ist.
Passt, wie “Faust aufs Auge”, oder “Arsch auf Eimer”.
Schade ist schon mal, dass man aktuell für den MAX31855 irgendwelchen Ramsch/Fake angedreht bekommt und geraume Zeit braucht bis man feststellt, dass man nicht der einzige damit ist. Dann weiß man zu schätzen, dass der ADS wenigstens richtig funktioniert, auch wenn man in China bestellt hat.
Und was könnte der MAX31855 mehr wie der ADS1118, außer direkt einen Wert direkt als T zurückzugeben?
Der ADS hat ebenso einen internen Temp-sensor zur Kompensation, aber dazu noch 2 differenzielle Themoelementeingänge, nicht nur einen.
Und bitte nochmal lesen, es geht primär darum die Thermoelementspannung in °C umzurechnen, und das ist leider nur sehr begrenzt bzw. nur in engen Bereichen linear. Ein Blick in die Tabelle zum TypK Element reicht dazu aus. Allein der Fehler den der MAX31855 durch die Schmalspurumrechnung, hinzufügt braucht kein Mensch. Höchstens er kann nicht rechnen, aber dazu habe ich ja Unterstützung und käme somit auf <1K Fehler über den ganzen Bereich. Theorie wohlgemerkt - praktische Umsetzung ist zweierlei, aber besser als das wird es nunmal nicht mehr.
Aber nachdem ich diese Lib nicht zum laufen bekomme und ich leider kein Beispiel kenne, habe ich mir eine zu-Fußmethode aus einer MAX31855 lib geliehen, die nun mV in °C umrechnet wie es nach NIST sein soll. Nicht state-of-the-art, ganz ohne Klassen, ohne Fehlerbehandlung, aber rechnet den Wert richtig für mein Element um.
Und diese Routine hatte jemand geschrieben, um den fehlerhaften Temperaturwert des MAX zu korrigieren. Also, was kann der MAX jetzt besser: nichts.
Aber schade um obige lib, hätte gut werden können.
uwefed:
Dann gib uns mal nicht den Link auf die Files der Bibliothek sondern auf den Beitrag des Forums.
Grüße Uwe
Zitat: sorry, ich finde keinen direkten link, obwohl Google hierher verweist.
Und es ist ja nicht so, dass ich nicht die Forumssuche bemüht habe, aber ich finde den Post nur über Google obwohl er von forums.arduino.cc geladen wird.
ja, danke. Das scheint der Beitrag zu sein, woher meine Link kommen. Ich hatte den ja nie gesehen, nur eben die angehängten Files. Dass ich den per Suche nicht gefunden habe, wundert mich allerdings nicht. Keines meiner gesuchten Stichworte taucht im Text direkt auf.
Allerdings sind dort ja auch keine Beispiele erwähnt, und wie in dem auf Github verlinkten ArtisanQ die Libs verwendet werden, versuche ich gerade noch herauszufinden.
Fehlermeldungen bzgl. der Objekte sind zumindest mal weg, damit kompiliert das Programm aber nun immer noch nicht. Aber stimmt zumindest schon mal grundsätzlich mein Aufruf der Lib?
Und das sind die reporteten Fehler:
“Fehler beim Kompilieren für das Board Arduino Nano.”
und mehrere ähnliche
"…/Thermocouple/thermocouple.h:155:27: error: variable ‘typeJ::range_dir’ must be const in order to be put into read-only section by means of ‘attribute((progmem))’
static PROGMEM PFLOAT range_dir[2][2];
^~~~~~~~~
Testweise hatte ich das folgende in der lib schon auskommentiert, aber ohne Änderung:
Das Problem mit Zeigern ist, dass man sie definieren kann und darf, ohne dass sie irgendwohin zeigen.
So wie du hier, macht es vermutlich aber keiner der Beispielsketche, fürchte ich.
Den beschriebenen Fehler in deiner Bibliothek könntest du durch static[b] const [/b]PROGMEM PFLOAT range_dir[2][2]; beheben, aber ob das alles ist ?
Alternativ kannst du auch rauskriegen, wie alt diese lib ist, und eine entsprechend alte Arduino IDE suchen.
1.5.x
? ? ?
Oder wenn man in einem Konstruktor Parameter übergeben muss:
Klasse objekt(...);
Siehe auch: Objektorientiertes Programmieren mit C++
Das mit Zeigern und new macht man auf dem Arduino sehr selten. Wenn du das nicht verstehst braucht du es auch nicht. Am besten immer alles statisch anlegen
Die Bibliothek scheint sehr alt zu sein. Das sieht man daran:
#if defined(ARDUINO) && ARDUINO >= 100
...
#endif
Am Anfang war das const mal optional, auch wenn da schon richtiger war. Später wurde es dann obligatorisch