Greetings,
just for the fun of it i wanted to see if i could make a small usb temperature sensor, using the MCP2221A Usb to I2C bridge and a MCP9808 temperature sensor. I think i have the hardware working, i can read the data for the temperature. However I have trouble with the conversion of the temperature, i have included my code and the schematic, and the output. The temperature output contains two bytes, a high and a low. The high byte contains alerts[b15-b13] and sign[b12] and the top part of the temperature is in [b11-b8], as far i can see, that is only used at temperatures over 30C. The lower byte is all temperature, and it should be set at 0.0625C per bit. But this seems odd, when i calculate, i get a value of 6.375 for a temperature of ~23C.
Anyone that can see what im doing wrong?
I have attached the schematic for the sensor board, and the datasheet for the MCP9808 sensor. Not for the MCP2221a as communication seems to work
br
Lasse
#############################################################
# MIT License #
# Copyright (c) 2017 Yuta KItagami #
#############################################################
from PyMCP2221A import PyMCP2221A
import time
print('-'*50)
print('MCP2221(A) with MCP9808 ')
print('-'*50)
mcp2221 = PyMCP2221A.PyMCP2221A()
mcp2221.Reset()
mcp2221 = PyMCP2221A.PyMCP2221A()
usbdata=[0] * 2
usbdata[0] = 0x05
#usbdata[1] = 0x05
addressdata=[0] * 2
mcp2221.I2C_Init()
print()
#Point to resolution register
#usbdata[0] = 0x08
#usbdata[0] = 0x03
#mcp2221.I2C_Write(0x18,usbdata)
#Setting resolution at 0.625 as per the datasheet page 29
usbdata[0] = 0x08
usbdata[1] = 0x03
mcp2221.I2C_Write(0x18,usbdata)
resolution = mcp2221.I2C_Read(0x18,1)
print("Resolution Data: " + str(resolution))
#check that the chip has the right Manfucaturer data, MCP9804 should be 0x54 or 84 in DEC
addressdata[0] = 0x06
mcp2221.I2C_Write(0x18,addressdata)
mfgdata = mcp2221.I2C_Read(0x18,3)
print("MFG Data: " + str(mfgdata))
# Point to temperature register and read temperature data
addressdata[0] = 0x05
mcp2221.I2C_Write(0x18,addressdata)
rdata = mcp2221.I2C_Read(0x18,3)
#Below is the dataconversion datasheet looks like C but i have "ported" it to Python
print("Read Data: " + str(rdata))
uppertempbyte = rdata[0]
#Zeroing Alert Bits.
print("Read Data Upper pre mask " + str(uppertempbyte))
uppertempbyte = uppertempbyte & 0x1f
print("Read Data Upper post mask: " + str(uppertempbyte))
lowertempbyte = rdata[1]
if ((uppertempbyte & 0x10) == 0x10):
uppertempbyte = uppertempbyte & 0x0f
tempperatureminus = 256 - ( uppertempbyte * 16 + lowertempbyte /16)
print("Negative Temperature: " + str(tempperatureminus))
else:
tempperatureplus = ( uppertempbyte * 16 + lowertempbyte /16)
print("Positive Temperature: " + str(tempperatureplus))
# At ~23c i get a positive temp of 6.375
print("Read Data Upper: " + str(uppertempbyte))
print("Read Data Lower: " + str(lowertempbyte))
--------------------------------------------------
MCP2221(A) with MCP9808
--------------------------------------------------
Reset
Resolution Data: [3]
MFG Data: [0, 84, 1]
Read Data: [192, 102, 1]
Read Data Upper pre mask 192
Read Data Upper post mask: 0
Positive Temperature: 6.375
Read Data Upper: 0
Read Data Lower: 102
Process finished with exit code 0
link to mcp9908 datasheet
http://ww1.microchip.com/downloads/en/DeviceDoc/25095A.pdf