Go Down

Topic: Hygrosens I2C TEMOD I2C wie korrekte Temperatur Ausgabe? (Read 1 time) previous topic - next topic

joh371

Hallo

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

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

mime

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 ;) ):
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?

joh371

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

joh371

so sieht der sketch jetzt aus

Code: [Select]
#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


mime

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

joh371

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


mkl0815

Mit folgender Formel:
b1 << 8 , das entspricht der Multiplikation mit 256, also 14*256
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

mime

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

Code: [Select]
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 ;) )

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

joh371

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

markusk

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:

Code: [Select]

#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);
}

BlackDice

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

Go Up