Forum: Mikrocontroller und Digitale Elektronik MLX90614 IR Thermometer


von Enrico E. (enrico_e)


Lesenswert?

Hallo Leute,

ich bin gerade ein bisschen am verzweifeln und hoffe ihr könnt mir 
helfen :)

Ich habe folgendes Programm zum Messen der Temperatur:

#include <i2cmaster.h>

const int analogpin = 0;  // Analog input pin
void setup(){
Serial.begin(9600);
Serial.println("Herzlich willkommen. Zeig mir einen Gegenstand") ;
Serial.println("und ich zeig dir wie warm er ist : )");
i2c_init(); //Initialise the i2c bus

PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups
}

void loop(){
int dev = 0x5A<<1;
int data_low = 0;
int data_high = 0;
int pec = 0;


i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x07);
i2c_rep_start(dev+I2C_READ);


data_low = i2c_readAck(); //Read 1 byte and then send ack
//read one byte from the I2C device, request more data from device
data_high = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
//read one byte from the I2C device, read is followed by a stop 
condition
i2c_stop();
//set stop conditon = release bus


//This converts high and low bytes together and processes temperature, 
MSB is a error bit and is ignored for temps
float tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution 
of the MLX90614)
float tempData = 0x0000; // zero out the data
int frac; // data past the decimal point

// This masks off the error bit of the high byte, then moves it left 8 
bits and adds the low byte.
tempData = (double)(((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;

float celcius = tempData - 273.15;


Serial.print("Celcius: ");
Serial.println(celcius);

delay(1000); // wait a second before printing again

}

Aber leider verstehe ich nciht alles davon : (
Besonders dieser Teil verwirrt mich:

// This masks off the error bit of the high byte, then moves it left 8 
bits and adds the low byte.
tempData = (double)(((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;

Ich meine ich verstehe das soweit. Data_high wird aus dem Sensor zu 
einem bestimmten Zeitpunkt gelesen und dann mit der Hexadezimalzahl 
bitweise addiert. Das alles wird dann um 8 Stellen nach links verschoben 
und schlussendlich wird dann noch der 2. Byte data_low dazu addiert. 
Aber wiso? Was bewirkt diese Operation? Wiso muss man das verschieben?

Ich hoffe ihr könnt mir helfen.
Schon mal vielen Dank im Voraus ;)

von Krapao (Gast)


Lesenswert?

> Besonders dieser Teil verwirrt mich:
>
> // This masks off the error bit of the high byte, then moves it left 8
> bits and adds the low byte.
> tempData = (double)(((data_high & 0x007F) << 8) + data_low);
> tempData = (tempData * tempFactor)-0.01;
>
> Ich meine ich verstehe das soweit. Data_high wird aus dem Sensor zu
> einem bestimmten Zeitpunkt gelesen und dann mit der Hexadezimalzahl
> bitweise addiert. Das alles wird dann um 8 Stellen nach links verschoben
> und schlussendlich wird dann noch der 2. Byte data_low dazu addiert.
> Aber wiso? Was bewirkt diese Operation? Wiso muss man das verschieben?

Der Sensor scheint sein Ergebnis als 15-Bit Ganzzahl zu liefern und zwar 
als hochwertiges Datenbyte mit 7-Bit und als niederwertiges Datenbyte 
mit 8-Bit.

Das oberste Bit des hochwertige Datenbytes ist also aus zu maskieren. 
Das wird mit (data_high & 0x007F) gemacht.

Dann ist das hochwertige Datenbit und das niederwertige Datenbit zu dem 
15-Bit Ergebnis (das in einer 16-Bit Zwischenvariable gespeichert wird) 
zusammen zu setzen. Das kann man machen durch

hochwertiges Datenbyte * 256 + niederwertiges Datenbyte

oder durch eine Schieben der Bits um 8 (256 = 2^8) nach links

(hochwertiges Datenbyte << 8) + niederwertiges Datenbyte

Das zusammengesetzte Ergebnis ist noch eine Ganzzahl. Die wird durch den 
cast (double) in ein Gleitkommaergebnis tempData umgewandelt.

Anschliessend wird eine Korrektur (die wohl im Datenblatt beschrieben 
ist) berechnet

tempData = (tempData * tempFactor)-0.01;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.