Estoy utilizando un sensor de temperatura Microchip MCP9808 I2C (> ).
Tengo problemas para poder calcular la temperatura utilizando los valores que estoy leyendo del sensor.
La temperatura es de 13 bits de ancho. De acuerdo con la hoja de datos, debo enviar dos comandos de lectura, la primera lectura para devolver el byte superior y la segunda lectura devolverá el byte inferior. 3 de los bits restantes se utilizan para indicar alarmas de temperatura y 1 bit para indicar el signo de la lectura (positiva o negativa).
Puedo leer los dos bytes, usando el código de muestra de la hoja de datos como punto de partida. Sin embargo, los valores que estoy obteniendo de ella son incorrectos. Tampoco puedo obtener temperaturas negativas, así que creo que mi código tiene algo de malo.
Estoy usando un adaptador I2C USB > y escribí una implementación en C # del código de muestra de la hoja de datos para calcular la temperatura.
Y luego mi código (que aparte de algunas conversiones adicionales necesarias debido a la forma en que C # maneja los tipos de datos) creo que es idéntico.
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;
}
Entonces, para probar el código, he estado enviando los bytes: START_BIT 0x3E (the address) 0x05 (the address of the temperature register)
Esto le indica al sensor que apunte el puntero del registro al registro de temperatura, de modo que cuando envío los dos comandos de lectura, se lee desde ese registro.
Y cuando leo los datos, obtengo 0xC1 0x24
. Cuando le paso estos valores a la función, obtengo 17.0625 grados C. Teniendo en cuenta que tengo un cubo de hielo en el sensor. (Actualmente no tienen una forma más precisa). Básicamente, mi cálculo es defectuoso, pero no sé por dónde empezar a solucionarlo.
Cualquier ayuda sería apreciada.
(EDITAR: para comprobar que puedo leer el chip correctamente, leí el registro de ID del fabricante y recupero el 0x54 esperado)