Estoy usando un sensor de temperatura Microchip MCP9808 I2C ( https://learn.adafruit.com/adafruit-mcp9808-precision-i2c-temperature-sensor-guide/overview ).
Tengo problemas para calcular la temperatura usando los valores que estoy leyendo del sensor.
La temperatura es de 13 bits de ancho. De acuerdo con la hoja de datos, necesito enviar dos comandos de lectura, la primera lectura 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 se utiliza para indicar el signo de la lectura (positivo o negativo).
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 obtengo son incorrectos. Tampoco puedo obtener temperaturas negativas, así que creo que mi código tiene algún problema.
Estoy usando un adaptador USB->I2C y he escrito 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 dice al sensor que apunte el indicador de registro al registro de temperatura, de modo que cuando envíe los dos comandos de lectura, lea desde ese registro.
Y cuando leo los datos, obtengo 0xC1 0x24
. Cuando paso estos valores a la función, obtengo 17.0625 grados C. Teniendo en cuenta que estoy sosteniendo un cubo de hielo en el sensor. (Actualmente no tengo una forma más precisa). Básicamente, mi cálculo es defectuoso, pero no sé por dónde empezar para solucionarlo.
Cualquier ayuda sería apreciada.
(EDITAR: para verificar que puedo leer el chip correctamente, leo el registro de ID del fabricante y obtengo el 0x54 esperado)
Me he encontrado con este problema recientemente. El error se origina en la hoja de datos del fabricante. Cuando se establece el indicador 'negativo', el cálculo adecuado es:
temp -= 256; // correct!
en lugar de
temp = 256 - temp; // incorrect! But this is the example in the datasheet!
Aquí hay un par de ejemplos de código de control para el MCP9808 en Github:
Eugenio Sh.
CLEAR_SIGN_MASK
apariencia es incorrecta. Debería ser0x1F
scott seidman
usuario9993
Eugenio Sh.
Majenko
usuario9993
Majenko
Eugenio Sh.
Spehro Pefhany
chupacabras
usuario9993
chupacabras