MAX31855K Probleme beim Auslesen über SPI

Hallo Community,

ich habe das Vergnügen nach längerem mal wieder was mit meinem Arduino zu machen. Hierbei muss ich eine Temperaturmessung durchführen. (0-150°C). Hab mir dafür ein Thermoelement Typ K und den MAX 31855K geholt (nicht den von Adafruit). Ich habe dann erst versucht über die Library von Adafruit für den MAX31855K diesen in Betrieb zu nehmen hat jedoch nicht funktioniert. Habe mich deshalb selber mal hingesetzt. Nachdem ich noch nie etwas mit SPI Bus gemacht habe hoffe ich das ich alles richtig gemacht habe. Hier der Code

int SSPin = 10; // SS = CS (MAX31855); low = data transmission
byte val[4]; 

#include <SPI.h>

void setup() 
{
pinMode(SSPin, OUTPUT);
digitalWrite(SSPin, HIGH);
Serial.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV16); 
delay(100);
}

void loop() 
{
digitalWrite(SSPin, LOW);
delay(50);
val[0] = SPI.transfer(0x00);
val[1] = SPI.transfer(0x00);
val[2] = SPI.transfer(0x00);
val[3] = SPI.transfer(0x00);
delay(500);
Serial.println("Byte 1");
Serial.println(val[0]);
Serial.println("Byte 2");
Serial.println(val[1]);
Serial.println("Byte 3");
Serial.println(val[2]);
Serial.println("Byte 4");
Serial.println(val[3]);
Serial.println("--------------");
digitalWrite (SSPin, HIGH);
delay(5000);
}

Hier entsprechen die Werte der Bytes egal in welcher Anordnung nicht dem Schema vom Datenblatt des MAX31855. Ich habe dann etwas gegoogelt und noch einen anderen Code gefunden. Hier schwanken die Werte aber auch mit jedem Einlesen

int SSPin = 10;
unsigned long someValue;
union FourByte
{
    unsigned long bit32;
    unsigned int bit16[2];
    unsigned char bit8[4];
};


#include <SPI.h>


void setup() 
{
pinMode(SSPin, OUTPUT);
digitalWrite(SSPin, HIGH);
Serial.begin(9600);
SPI.begin();
}

void loop() 
{
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
delay(500);
digitalWrite(SSPin, LOW);
delay(50);
someValue = transfer(0);
delay(500);
Serial.println(someValue);
SPI.endTransaction();
digitalWrite (SSPin, HIGH);
delay(5000);
}


unsigned long transfer(unsigned long value){
  FourByte data = {value};
  for(byte i = 0; i < 4; i++){
    data.bit8[i] = SPI.transfer(data.bit8[i]);
  }
  return data.bit32;
}

Jemand eine Idee woran das liegen könnte?

Versuche doch mal per Software zu glätten. Bei den Thermospannungen geht es um Änderengen von Bruchteilen eines Millivolts von Grad zu Grad. Zwar sind die Ströme, die ein Thermoelement liefern kann, recht hoch, aber da kann allerlei elektrischer Störnebel durchschlagen. Desweiteren muß die Stromversorgung vom Analogteil, also dem MAX sehr gut gesiebt und stabil sein. Wenn dessen Versorgungsspannung rauscht und pendelt, wie ein Lämmerschwanz, ist das als wenn du in einem fahrenden Auto mit einer Feinwaage was abwiegen willst ;)

Sagen wir 41µV pro °C.

Mich wunderts daß die Bibliothek von Adafruit und dessen Baispielprogramm nicht funktionieren sollte.

Welchen Arduino benutzt Du?

Grüße Uwe

Ja wundert mich auch das die nicht funktioniert. Also um genauer zu sein es läuft schon bloss geben dei Werte keinen Sinn und das nicht nur um ein paar Grad +/-

Verwende den Arduino Uno

Versuche doch mal per Software zu glätten. Bei den Thermospannungen geht es um Änderengen von Bruchteilen eines Millivolts von Grad zu Grad. Zwar sind die Ströme, die ein Thermoelement liefern kann, recht hoch, aber da kann allerlei elektrischer Störnebel durchschlagen.

Okay schau ich mal aber selbst dann glaub ich kaum das es solche krassen Änderungen bewirkt da ja auch allgemein sonst keine Schaltung mit dran hängt bzw. Störquellen sich in der nähe befinden

Vielleicht passt deine Version vom MAX und der Fühler nicht zusammen? Es gibt ja mehrere Thermoelementtypen, die je nach Materialkombination eine unterschiedliche Steilheit haben. Nickel CromNickel ist nur eine davon. Wenn's Chinaware ist, würde mich das nicht wundern.