Ich verwende einen Microchip MCP9808 I2C Temperatursensor ( https://learn.adafruit.com/adafruit-mcp9808-precision-i2c-temperature-sensor-guide/overview ).
Ich habe Probleme, die Temperatur anhand der Werte zu berechnen, die ich vom Sensor ablese.
Die Temperatur ist 13 Bit breit. Laut Datenblatt muss ich zwei Lesebefehle senden, das erste Lesen, um das obere Byte zurückzugeben, und das zweite Lesen, um das untere Byte zurückzugeben. 3 der verbleibenden Bits werden verwendet, um Temperaturalarme anzuzeigen, und 1 Bit wird verwendet, um das Vorzeichen des Messwerts anzuzeigen (positiv oder negativ).
Ich kann die beiden Bytes lesen, indem ich den Beispielcode aus dem Datenblatt als Ausgangspunkt verwende. Die Werte, die ich daraus bekomme, sind jedoch falsch. Ich kann auch keine negativen Temperaturen bekommen, also denke ich, dass mein Code etwas falsch macht.
Ich verwende einen USB->I2C-Adapter und habe eine C#-Implementierung des Datenblatt-Beispielcodes geschrieben, um die Temperatur zu berechnen.
Und dann ist mein Code (der abgesehen von einigen zusätzlichen notwendigen Castings aufgrund der Art und Weise, wie C# Datentypen verarbeitet) meiner Meinung nach identisch ist.
public static double CalculateAmbientTemperature(byte upperByte, byte lowerByte)
{
const byte ALERT_MASK_VALUE = 0x1F;
const byte CLEAR_SIGN_MASK = 0x0F;
double temperature = 0.00;
upperByte = (byte)(upperByte & ALERT_MASK_VALUE);
// Ambient temperature less than 0 degrees
if((upperByte & (byte)(upperByte & 0x10)) == 0x10)
{
upperByte = (byte)(upperByte & CLEAR_SIGN_MASK);
temperature = 256.0 - ((double)upperByte * 16.0 + (double)lowerByte / 16.0);
}
else
{
temperature = ((double)upperByte * 16.0 + (double)lowerByte / 16.0);
}
return temperature;
}
Um den Code zu testen, habe ich die Bytes gesendet: START_BIT 0x3E (the address) 0x05 (the address of the temperature register)
Dies weist den Sensor an, den Registerzeiger auf das Temperaturregister zu zeigen, so dass, wenn ich die beiden Lesebefehle sende, er aus diesem Register liest.
Und wenn ich die Daten zurücklese, bekomme ich 0xC1 0x24
. Wenn ich diese Werte an die Funktion übergebe, erhalte ich 17,0625 Grad C. Bedenke, dass ich einen Eiswürfel auf den Sensor halte. (Habe derzeit keinen genaueren Weg). Im Grunde genommen ist meine Berechnung fehlerhaft, aber ich weiß nicht, wo ich anfangen soll, sie zu beheben.
Jede Hilfe wäre willkommen.
(BEARBEITEN: Um zu überprüfen, ob ich den Chip richtig lesen kann, lese ich das Hersteller-ID-Register und erhalte die erwarteten 0x54)
Ich bin kürzlich selbst auf dieses Problem gestoßen. Der Fehler stammt aus dem Datenblatt des Herstellers. Wenn das 'Negativ'-Flag gesetzt ist, lautet die richtige Berechnung:
temp -= 256; // correct!
anstatt
temp = 256 - temp; // incorrect! But this is the example in the datasheet!
Hier sind ein paar Beispiele für Steuercode für den MCP9808 auf Github:
Eugen Sch.
CLEAR_SIGN_MASK
Aussehen ist falsch. Es sollte sein0x1F
Scott Seidmann
Benutzer9993
Eugen Sch.
Majenko
Benutzer9993
Majenko
Eugen Sch.
Spehro Pefhany
Chupacabras
Benutzer9993
Chupacabras