There are two separate issues at play here: the calibration of the Si7005 sensor and device heating due to thermal conductivity. The calibration of the Si7005 chips proper is done during the the Si7005's manufacturing process, so we have no control over it. There are a few other options, though.
First, some context:
- The offset you're seeing is a result of heat generated by Tessel being conducted to the Climate Module.
- The largest sources of heat on Tessel are, in descending order, the CC3000 (WiFi radio), the LPC1830 (main processor), and the power plant.
- You can compensate for this in hardware or in software.
We think we know a way good way to compensate in software, but implementing it in a way that guarantees accuracy will take a long time. We've actually already redesigned the Climate Module hardware to address this bug.
Hardware options, in order of simplicity (and probably from least effective to most effective):
Move the module to a different port
By increasing the distance between the heat source and the sensor, we allow more heat to be radiated off the board, rather than conducted into the sensor. Port B is probably the coolest, followed by port D. The outer row of the GPIO bank is a good option thermally, but it's less ideal for other reasons.
Move the module offboard
It's a lot harder for heat from the Tessel to reach the sensor if they're connected through thin wires rather than the headers directly. These male to female jumper wires would let you build four sets of "extension cables." Putting the module on a breadboard is equivalent.
Modify the climate module hardware
WE HAVE NOT TESTED THIS, SO DO NOT DO ANYTHING UNTIL I REPORT BACK
One way that will likely reduce thermal conduction is reducing the number of connections the sensor has to the ground plane. I'll leave it at that for now...
Again, in descending simplicity, increasing effectiveness:
A simple offset (or series thereof)
To calibrate, measure the environmental temperature by other means, then, after the Tessel has been on and running code for a while, subtract the measured difference from all future measurements. This offset will only work for a narrow range of temperatures.
For increased accuracy, a different offset should be used for each port and temperature range (I'll propose 4 deg C brackets, "starting" with 20-23 C). These offsets shouldn't vary tremendously from Tessel to Tessel for any given temperature range, so please share what you find.
It would be possible to generate a thermal model of the Tessel + Climate Module + environment system and estimate the true environmental temperature by subtracting an externally-generated thermal model of Tessel from the measurement. Please respond if you're interested in helping with this, as it is a nontrivial engineering problem.