Pages: [1]   Go Down
Author Topic: Hygrosens I2C TEMOD I2C wie korrekte Temperatur Ausgabe?  (Read 1510 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo

ich habe an meinem Arduino ein I2C Temperaturmodul (mit PT1000) von Hygrosens angeschlossen und diesen mit folgendem Sketch programmiert.
Code:
#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?
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ne hat leider nicht geholfen
habe die abfrage entsprechend geändert ich erhalte immer noch unlogische Werte......
 smiley-kitty
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so sieht der sketch jetzt aus

Code:
#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

Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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 smiley-wink )

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 1
Robotiklabor - The (German) podcast around robotics
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: