Hygrosens I2C TEMOD I2C wie korrekte Temperatur Ausgabe?

Hallo

ich habe an meinem Arduino ein I2C Temperaturmodul (mit PT1000) von Hygrosens angeschlossen und diesen mit folgendem Sketch programmiert.

#include <Wire.h>
int b1 = 0;
int b2 = 0;
void setup()
{
 Serial.begin(9600);
 Wire.begin();
}

void loop()
{
 
 Wire.requestFrom(0x78,2); // read 2 bytes
 b1 = Wire.read(); // receive 1st byte
 b2 = Wire.read(); // receive 2nd byte

 Serial.print("byte 1 =");
 Serial.println(b1);
 Serial.print("byte 2 =");
 Serial.println(b2);
 
 delay(1000);
}

jetzt erhalte ich bei b1 den Wert 13 und bei b2 einen 3 stelligen Wert, beide steigen bzw verändern sich bei Temperatur Änderungen, die Werte haben aber nichts mit der realen Temperatur zu tun.

Wie erhalte ich den richtigen Temperaturwert?

http://www.produktinfo.conrad.com/datenblaetter/500000-524999/502001-da-01-de-TEMPERATURMODUL_I2C_32_96_C.pdf
Viel gibt das Datenblatt ja nicht her.
Der Wert besteht aus 14 Bit aus Bytes 0 und 1, also erst mal:
temp = b1 << 8 | b2;

Das höchste bit ist 0 (OK) oder 1 (Fehler) und wird wie das letzte Bit (für die Temperatur) ignoriert (Auswerten würde ich das erste Bit aber schon :wink: ):
temp = (temp &0x7FFE);

Die 14 Bit die nun in temp stehen sind die "Temperaturdaten".

Letzte Tabelle "Ausgangsskalierung PT1000 Temperatur"
je nach Sensor (R1-R3): T(°C)=V/256-32 bzw. T(°C)=V/128-32 bzw. T(°C)=V/64-32

hilft Dir das weiter?

ne hat leider nicht geholfen
habe die abfrage entsprechend geändert ich erhalte immer noch unlogische Werte......
:slight_smile:

so sieht der sketch jetzt aus

#include <Wire.h>
int b1 = 0;
int b2 = 0;
int temp = 0;
int temp1 = 0;
int temp2 = 0;
void setup()
{
 Serial.begin(9600);
 Wire.begin();
}

void loop()
{
 
 Wire.requestFrom(0x78,2); // read 2 bytes

 b1 = Wire.read(); // receive 1st byte
 b2 = Wire.read(); // receive 2nd byte
 temp = (b1 << 8 | b2);
 temp1 = (temp &0x7FFE);
 temp2 = (b1 << 8 | b2)*5/64-32;

 Serial.print("byte 1 =");
 Serial.println(b1);
 Serial.print("byte 2 =");
 Serial.println(b2);
 Serial.print("Temp ");
 Serial.println(temp);
 Serial.print("Temp1 ");
 Serial.println(temp1);
 Serial.print("Temp2 ");
 Serial.println(temp2);
 delay(1000);
}

die serielle Ausgabe dazu:

byte 1 = 14
byte 2 = 46
temp 3626
temp1 3626
temp2 251

gemessene reale Temperatur ist 23,4 C

Also ich komme mit b1 = 14 und b2 = 46 auf 24.72°C.

mmh sorry wenn ich so doof Frage
aber wie kommst Du auf diesen Wert?

mir ist schon klar das sich die richtige temperatur versteckt????
Ich beschäftige mich halt erst seit ein paar Monaten in meiner Freizeit mit Micrcontrolern und habe da wenig Vorbildung und mir bisher alles angelesen oder hier mitgelesen

kannst du mir bitte näheres erklären

Mit folgender Formel:
b1 << 8 , das entspricht der Multiplikation mit 256, also 14256
das ganze plus b2, also + 46
Dann die Formel aus dem Datenblatt für den Sensor R3 (ist geraten, denn hier passt der Wert zum gemessenen Wert)
V/64 - 32
das entspricht dann:
(14
256+46)/64-32 = 24,71875 ~ 24,72°C

Nur eine kurze Antwort, da ich jetzt malochen muss, aber mkl0815 hat es schon richtig beschrieben.
Mein Code sieht so aus:

int temp;
int b1=14;
int b2=46;
void setup() {                
  Serial.begin(115200);   
  byte error = (b1 >> 7);
  if (error == 1) {
    Serial.println("Es ist ein Fehler aufgetreten!");
  } else {
    temp = b1 << 8 | b2;
    temp = temp &0x3FFE;
    float temperatur = temp / 64.0 - 32.0;
    Serial.print("Die Temperatur betr");
    Serial.write(228);
    Serial.print("gt: ");
    Serial.print(temperatur);
    Serial.write(186);
    Serial.println("C");
  }
}

void loop() {
}

Natürlich ohne das ganze wire-Gedöns, da ich das Modul ja nicht habe. Probiere es doch mal aus und sag uns ein paar Werte, die Du so findest, im Vergleich zu einem anderen Thermometer.

Aber schreib bitte nicht "reale" Temperatur, da jedes Messgerät einen Fehler hat und man im Prinzip den Messwert immer mit Fehler angeben müsste, wir den tatsächlichen Wert also gar nicht kennen (sorry, bin in so Sachen durch ein Ingenieursstudium vorbelastet :wink: )

Gegen was vergleichst Du denn überhaupt Deine Ergebnisse, also wo sind diese 23.4°C her?

nu hab ichs kapiert Danke

die "reale" Temperatur ist natürlich keine es war einfag ein Digitalthermometer welchen neben dem Sensor lag, ich hatte halt das Problem das die ausgelesenen Werte nicht annähern mit dem Termometer zu hatten. Jetzt funktioniert es ja.

Mein Microcontroler soll die Steuerung eines Holzvergasers ersetzten diese ist für die Abgastemperatur gedacht. In weiteren Anfragen habe ich andere Module der Steuerung hinterfragt mal sehen wann ich alle zusammenfügen kann.

Also Danke nochmals jetzt istwieder ein Eingang frei, das I2C Display läuft schon......

Klasse, genau das habe ich gerade gesucht!

Und auch wenn der Thread sehr alt is, hier noch einmal der "komplette" Code, für die, die es interessiert:

#include <Wire.h>
int b1 = 0;
int b2 = 0;
int temp = 0;
int temp1 = 0;
int temp2 = 0;
void setup()
{
 Serial.begin(9600);
 Wire.begin();
}


void loop()
{
  Wire.requestFrom(0x78,2); // read 2 bytes

  b1 = Wire.read(); // receive 1st byte
  b2 = Wire.read(); // receive 2nd byte

  byte error = (b1 >> 7);
  
  if (error == 1)
  {
    Serial.println("Es ist ein Fehler aufgetreten!");
  }
  else
  {
    temp = b1 << 8 | b2;
    temp = temp &0x3FFE;
    float temperatur = temp / 64.0 - 32.0;
    Serial.print("Die Temperatur betr");
    Serial.write(228);
    Serial.print("gt: ");
    Serial.print(temperatur);
    Serial.write(186);
    Serial.println("C");
  }
  
  delay(1000);
}

Wo hast du denn den Sensor angeschlossen und welches Board hast du benutzt?

Hallo alle,

würde mich noch interessieren was die Zeile:

temp = temp &0x3FFE;

im obige Code von Mime für Auswirkungen hat?

Danke, Mondeo

Mondeo:
würde mich noch interessieren was die Zeile:

temp = temp &0x3FFE;

im obige Code von Mime für Auswirkungen hat?

Blendet ein paar Bit aus.
Im ersten Byte das nicht gesetzte Fehler-Bit 0x80 und das Bit 0x40, im zweiten das niederwertigste ( 1/64 ·C )