Thermoelement Typ K Umrechnung mV in °C

Hallo,
ich habe einen ADS1118 an den 2 Thermoelemente sollen. Auslesen des Chips funktioniert, ich bekomme die interne Temperatur und Spannung in mV zurück.
Diese wollte ich nun mit der library https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjl_tvUz-btAhVMAWMBHaFNAV8QFjACegQIAxAC&url=https%3A%2F%2Fforum.arduino.cc%2Findex.php%3Faction%3Ddlattach%3Btopic%3D416363.0%3Battach%3D176183&usg=AOvVaw0ase9uC-QzsnOE3P6k0DGT bzw. https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwi9pKGx0ebtAhXE4uAKHaO9D2YQFjAAegQIAhAC&url=https%3A%2F%2Fforum.arduino.cc%2Findex.php%3Faction%3Ddlattach%3Btopic%3D416363.0%3Battach%3D176184&usg=AOvVaw2PNghNH9S9D7Qni1bgUP6i (sorry, ich finde keinen direkten link, obwohl Google hierher verweist) in Temp umrechnen und mir das selber programmieren ersparen.
Leider bekomme ich die Lib nicht angesprochen. Bibliothek Thermocouple ist eingebunden aber mein Versuch

#include <thermocouple.h>

void setup() {
Serial.begin(115200);
}

void loop() {
    Serial.println(tcBase().Temp_C(0,0));
//    Serial.println(typeK().absTemp_C(0));
}

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.

Gruß,
Dieter

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

Hallo
werfe eine Blick in die Biblothek wie der Author die Aufrufe programmiert hat.
In dem Aufruf

tcBase().Temp_C(0,0)

wird kein Wert im Datentyp FLOAT übergeben.

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

Ich weiß nicht wie die Schaltung ist.
Anstatt einen AD-Wandler zu nehmen würde ich einen Termokopplerwandler wie den MAX31855 nehmen.

Grüße Uwe

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”.

Ich finde einen Max31855 geeigneter für die Messung mittels Thermoelement.

Er gibt direkt die Temperatur aus und macht intern die Korrektur der Nichtlinearität des Thermoelements.

Grüße Uwe

Ja, gut...
Es gibt schon unterschiedliche Augen und Ärsche.

Hallo
Und eine einfache Frage:
Warum nutzt du nicht den linearen Zusammenhang zwischen K und °C und verwendest die map()-Funktion?

  1. Hast Du Deinen Rat mal ausprobiert? Der Zusammenhang ist nicht linear im Sinne von map, sondern additiv. Falsche Eingabe.
  2. map ist nur für Ganzzahlen.

Gruß Tommy

Warum nutzt du nicht den linearen Zusammenhang zwischen K und °C und verwendest die map()-Funktion?

Ich mach mal weiter was combie angefangen hat:
Das ist wie mit Kanonen aus Spatzen zu schießen.

Die Beziehung von Kelvin zu °C ist ein lineares.

0 °C sind 273,15K.

Grüße Uwe

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.

Dann gib uns mal nicht den Link auf die Files der Bibliothek sondern auf den Beitrag des Forums.
Grüße Uwe

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.

War etwas Gefummel.
Ist das hier der Beitrag?

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.

Hallo,

ich habe den Aufruf der Temperaturabfrage im Original-code nun eingebaut und erhalte folgendes

#include <thermocouple.h>

tcBase * tc;

void setup() {
Serial.begin(115200);
}

void loop() {

float myTemp = tc->Temp_F(0,25);
    
    Serial.println(myTemp);
}

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:

#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#include <avr/pgmspace.h>
tcBase * tc;

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
? ? ?

Was willst du überhaupt mit Zeigern?

So erstellt man Objekt einer Klasse:

Klasse objekt;

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