Pages: [1]   Go Down
Author Topic: Hygrosens Byts auswerten  (Read 637 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 Gemeinde

ich hab wieder mal ein Modul von Hygrosens
(http://www.produktinfo.conrad.com/datenblaetter/500000-524999/502479-da-01-de-THERM_MOD_THMOD_I2C_1370_270_1360C.pdf)

nach der letzten Anfrage http://arduino.cc/forum/index.php/topic,90805.0.html hatte ich gedacht ich hätts kappiert dann leider doch nicht

das neue Modul hat 4 bytes und ich hab nu ma l Grundsätzliche Fragen dazu

ich frage die Bytes mit folgendem Sketch ab und lass diese auf dem Display anzeigen:

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display

int b0 = 0; // byte 1 I2C Sensor für MSB Thermospannung
int b1 = 0; // byte 2 I2C Sensor für LSB Thermospannung
int b2 = 0; // byte 3 I2C Sensor für MSB Ausgleichstellen- Temperatur
int b3 = 0; // byte 4 I2C Sensor für LSB Ausgleichstellen Temperatur
float Thermospannung = 0;// Variable für b0 und b1
float Temperaturwert = 0;// Variable für b2 und b3
float temp = 0; //Variable für Temperatur

void setup()
{

  lcd.init();                      // initialize the lcd
  lcd.backlight();
}

void loop()
{
  Wire.requestFrom(0x78,4); // lese von adresse 0x78 4 bytes aus
  b0 = Wire.read(); // lese 1. byte
  b1 = Wire.read(); // lese 2. byte
  b2 = Wire.read(); // lese 3. byte
  b3 = Wire.read(); // lese 4. byte


  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print (b0,HEX); //anzeige b0 als Hex wert
  lcd.print(" ");
  lcd.print(b0);    // anzeige b0 wird als dezimalwert angezeigt

  lcd.setCursor(0,1);
  lcd.print(b1,HEX);
  lcd.print(" ");
  lcd.print(b0);

  lcd.setCursor(0,2);
  lcd.print(b2,HEX);
  lcd.print(" ");
  lcd.print(b2);

  lcd.setCursor(0,3);
  lcd.print(b3,HEX);
  lcd.print(" ");
  lcd.print(b3);

  delay(1000);

}

soweit so gut ich hab 4 Hex werte und 4 Dez Werte die passen auch soweit...

nun die 1. Frage:
was ist denn nun wirklich in den Variablen gespeichert? Dezimal oder Hexadezimal oder gar binär und wird dann nur zur Anzeige entsprechend umgerechnet?

die 2. Frage:

die Hex Anzeige ist z. Bsp für
b0 = 0F und
b1 = BC

wie führe ich diese Zusammen um in einer Varable 0FBC zu erhalten damit ich diesen Wert in Dezimal umrechnen kann, und wie erfolgt die Umrechnung?
« Last Edit: December 30, 2012, 11:36:54 am by joh371 » Logged

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

ok die Frage der Zusammenführung der von b0 und b1 habe ich gerade selbst herausgefunden

b0*256+b1 mit der anzeige in Hex kommt da der richtige Wert raus und auch der große Dezimalwert
Logged

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

so weiter
auch die Ausgleichstellentemperatur konnte ich auf Grund der Erkenntnisse und der Formel aus den 1. Tread errechnen

(b2*256+b3)/256-32

der neue Sketch sieht jetzt so aus
Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display

int b0 = 0; // byte 1 I2C Sensor für MSB Thermospannung
int b1 = 0; // byte 2 I2C Sensor für LSB Thermospannung
int b2 = 0; // byte 3 I2C Sensor für MSB Ausgleichstellen- Temperatur
int b3 = 0; // byte 4 I2C Sensor für LSB Ausgleichstellen Temperatur
float Thermospannung = 0;// Variable für b0 und b1
float Temperaturwert = 0;// Variable für b2 und b3
float temp = 0; //Variable für Temperatur

void setup()
{

  lcd.init();                      // initialize the lcd
  lcd.backlight();
}

void loop()
{
  Wire.requestFrom(0x78,4); // lese von adresse 0x78 4 bytes aus
  b0 = Wire.read(); // lese 1. byte
  b1 = Wire.read(); // lese 2. byte
  b2 = Wire.read(); // lese 3. byte
  b3 = Wire.read(); // lese 4. byte


  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print (b0,HEX); //anzeige b0 als Hex wert
  lcd.print(" ");
  lcd.print(b0);    // anzeige b0 wird als dezimalwert angezeigt


  lcd.setCursor(0,1);
  lcd.print(b1,HEX);
  lcd.print(" ");
  lcd.print(b1);
  lcd.print(" ");
  lcd.print(b0*256+b1,HEX);
  lcd.print(" ");
  lcd.print(b0*256+b1);

  lcd.setCursor(0,2);
  lcd.print(b2,HEX);
  lcd.print(" ");
  lcd.print(b2);

  lcd.setCursor(0,3);
  lcd.print(b3,HEX);
  lcd.print(" ");
  lcd.print(b3);
  lcd.print(" ");
  lcd.print(b2*256+b3,HEX);
  lcd.print(" ");
  lcd.print(b2*256+b3);
 
  delay(1000);

}

da hab ich zumindest schon mal die Digits zur Temperatur Berechnung
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zahlen werden in Computern immer binär gespeichert und verarbeitet. Binär, oktal, dezimal oder hexadezimal sind Darstellungsarten, die von Fall zu Fall vorteile bieten.
Grüße Uwe
Logged

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

nach rumfummeln mit Gleichungssystemen habe ich herausgefunden wie Thermospannung in mV errechnet wird

(b0*256+b1)/1000-12,5

somit habe ich aus dem Datenblatt aus den Tabellen folgende Werte:

Tabelle 1
Digit = b0*256+b1
Temp = Digit/256-32

Tabelle 2 die Digits stehen hier in Spalte -300 (denke ich)
Digit = b2*256+b3
mV = Digit/1000-12,5

beide Formeln stimmen so weit ich hab die Werte mit verschiedenen Werten aus der Tabelle geprüft

der Sketch sieht jetzt so aus
Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display

int b0 = 0; // byte 1 I2C Sensor
int b1 = 0; // byte 2 I2C Sensor
int b2 = 0; // byte 3 I2C Sensor
int b3 = 0; // byte 4 I2C Sensor
float Thermospannung = 0;// Variable für b0 und b1
float Temperaturwert = 0;// Variable für b2 und b3
float temp = 0; //Variable für Temperatur

void setup()
{

  lcd.init();                      // initialize the lcd
  lcd.backlight();
}

void loop()
{
  Wire.requestFrom(0x78,4); // lese von adresse 0x78 2 bytes aus
  b0 = Wire.read(); // lese 1. byte
  b1 = Wire.read(); // lese 2. byte
  b2 = Wire.read(); // lese 3. byte
  b3 = Wire.read(); // lese 4. byte
  

  lcd.clear();
  // für Tabelle 1
  lcd.setCursor(0,2);
  lcd.print(b2*256+b3);// Digits
  lcd.print(" ");
  lcd.print((b2*256+b3)/256-32);// Temperatur
  
  // für Tabelle 2
  lcd.setCursor(0,0);
  lcd.print(b0*256+b1); //Digits
  lcd.print(" ");
  lcd.print((b0*256+b1)/1000-12.5); // mV

  delay(1000);
}


Ausgabe Display:
4014    -8.50

14405   24

jetzt bin ich mit meinem Latein am Ende ich verstehe die Anleitung ab hier nicht mehr bzw stehe ich aufm Schlauch

wie bekomme ich diese Werte zusammen gemäß der Anleitung müssen die irgendwie miteinander verrechnet werden

Vielen Dank für eure Hilfe im  Vorraus
Logged

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

Hallo Uwe,
Danke , ich war anfangs völlig verwirrt weil ich für jedes Byte einen Dezimalwert hatte und mit dem nicht weiter kam. Konnte diese beiden Werte nicht zur Hex Zahl Vereinen aber das ist ja soweit gelöst.
Jetzt Brauch ich nur noch die Initialzündung wie ich die 4 Byte s zur gesamt Temperatur verrechne. Am Ende will ich 15- 1200 Grad messen.

 Danke
« Last Edit: December 30, 2012, 03:34:17 pm by joh371 » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich nehme mal an Du hast das Typ -1360 Modul.
http://www.produktinfo.conrad.com/datenblaetter/500000-524999/502479-da-01-de-THERM_MOD_THMOD_I2C_1370_270_1360C.pdf

Jedes Thermoelement besteht aus der Verbindung 2 verschiedener Metalle. Wenn Du es Dir überlegst hat man 2 Berührungspunkte der verschiedenen Metalle: Vorne am Meßpunkt und nochmal irgendwo auf der Platine. Darum mißt das Thermoelemnt nicht absolut die Temperatur sondern die Temperaturdifferenz der 2 verscheidenen Berührungspunkte.

Das Modul gibt für die Thermospannung einen 14Bit Wert. Die 2 niederwertigsten Bytes sind zu eliminieren (einfach divison durch 4) Thermospannung = (b0*256+b1)/4.
Für die Referenztemperatur gibt es einen 12Bit Wert. Die 3 niederwertigsten Bytes sind zu eliminieren (einfach divison durch 8 )
ADCReferenztemperatur = (b2*256+b3)/8
Die Referenztemperatur erhälst Du durch die Formel: T (°C)=ADCReferenztemperatur / 256 - 32

Das Modul mißt 2 Spannungen. Du mußt der Temperatur des Meßthermoelements die Ausgleichsstellen-Temperatur (Referenztemperatur) addieren .

[Grrr]Wieso müssen die eine Tabella angeben und keine Formel [/Grrr]

Bin zu müde die Formel jetzt zu errechenen.

Du weißt schon, daß die migelieferte Meßsonde nicht für 1200 Grad geeignet ist (Kunststoffisolierung)

Ein guter Ratschlag fürs nächst mal: kauf Dir einen MAX6675

Grüße Uwe
Logged

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

Hallo Uwe

so früh halb 5 hätt ich erst recht keinen Kopf für Formeln smiley

Deinen Vorschlag die Formel nochmal durch 4 und die andere durch 8 zu teilen bringt keine guten Werte
Displayanzeige gemäß letztem Sketch mit der Formelanpassung:
509    -12,.5

3205   -20

Quote
[Grrr]Wieso müssen die eine Tabella angeben und keine Formel [/Grrr]

jo das ist auch mein Problem

ich hab keine Werte zum addieren heraus bekommen

ich hab eben nur aus Tabelle 1 die digits und die Temperatur
und Tabelle 2 die Digits und die mV

ich habs noch nicht geschafft aus Tabelle 2 die Formel zu finden die mir die Temperatur errechnet

es sollte dann ja reichen wenn ich diese beiden Temperaturen addiere

Quote
Du weißt schon, daß die migelieferte Meßsonde nicht für 1200 Grad geeignet ist (Kunststoffisolierung)

ja die gelieferte ist nur zum testen, es ist eingebaut eine mit entsprechender Hülse und Kabelisolierung eingebaut



« Last Edit: December 31, 2012, 03:08:02 am by joh371 » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Deinen Vorschlag die Formel nochmal durch 4 und die andere durch 8 zu teilen bringt keine guten Werte
Was soll ich Dir sagen, laut Datenblatt sind die 2 bzw 3 niederwertigsten Bit ohne Bedeutung.
Grüße Uwe
Logged

Pages: [1]   Go Up
Jump to: