Reading I2C device with HOLD/NO HOLD gives different values?

I have two Python codes for reading a SHT21 temp/hum sensor, but they give different readings! I know the difference seems to be small, but the sensor is located in a place where temperature is very stable, and both of the scripts show the same reading almost all the time (the sensor is not broken). And when I tested this earlier, the difference was for the temperature about 1.1 degree C and for the humidity about 6 % RH. So what does cause this difference?

Here’s one:

`
import smbus
import time

class SHT21:
“”“Class to read temperature and humidity from SHT21.
Ressources:
http://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity/Sensirion_Humidity_SHT21_Datasheet_V3.pdf
https://github.com/jaques/sht21_python/blob/master/sht21.py
Martin Steppuhn’s code from http://www.emsystech.de/raspi-sht21"”"

#control constants
_SOFTRESET = 0xFE
_I2C_ADDRESS = 0x40
_TRIGGER_TEMPERATURE_NO_HOLD = 0xF3
_TRIGGER_HUMIDITY_NO_HOLD = 0xF5

def init(self, bus):
“”“According to the datasheet the soft reset takes less than 15 ms.”""
self.bus = bus
self.bus.write_byte(self._I2C_ADDRESS, self._SOFTRESET)
time.sleep(0.015)

def read_temperature(self):
“”“Reads the temperature from the sensor. Not that this call blocks
for 250ms to allow the sensor to return the data”""
data = []
self.bus.write_byte(self._I2C_ADDRESS, self._TRIGGER_TEMPERATURE_NO_HOLD)
time.sleep(0.250)
data.append(self.bus.read_byte(self._I2C_ADDRESS))
data.append(self.bus.read_byte(self._I2C_ADDRESS))
return self._get_temperature_from_buffer(data)

def read_humidity(self):
“”“Reads the humidity from the sensor. Not that this call blocks
for 250ms to allow the sensor to return the data”""
data = []
self.bus.write_byte(self._I2C_ADDRESS, self._TRIGGER_HUMIDITY_NO_HOLD)
time.sleep(0.250)
data.append(self.bus.read_byte(self._I2C_ADDRESS))
data.append(self.bus.read_byte(self._I2C_ADDRESS))
return self._get_humidity_from_buffer(data)

def _get_temperature_from_buffer(self, data):
“”“This function reads the first two bytes of data and
returns the temperature in C by using the following function:
T = =46.82 + (172.72 * (ST/2^16))
where ST is the value from the sensor
“””
unadjusted = (data[0] << 8) + data[1]
unadjusted *= 175.72
unadjusted /= 65536 # divide by 2^16
unadjusted -= 46.85
return unadjusted

def _get_humidity_from_buffer(self, data):
“”“This function reads the first two bytes of data and returns
the relative humidity in percent by using the following function:
RH = -6 + (125 * (SRH / 2 ^16))
where SRH is the value read from the sensor
“””
unadjusted = (data[0] << 8) + data[1]
unadjusted *= 125.0
unadjusted /= 1 << 16 # divide by 2^16
unadjusted -= 6.0
return unadjusted

def close(self):
“”“Closes the i2c connection”""
self.bus.close()

def enter(self):
“”“used to enable python’s with statement support”""
return self

def exit(self, type, value, traceback):
“”“with support”""
self.close()

def crc8check(self, value):
remainder = ( ( value[0] << 8 ) + value[1] ) << 8
remainder |= value[2]

POLYNOMIAL = 0x0131 = x^8 + x^5 + x^4 + 1

divsor = 0x988000 is the 0x0131 polynomial shifted to farthest left of three bytes

divsor = 0x988000

for i in range(0, 16):
if( remainder & 1 << (23 - i) ):
remainder ^= divsor
divsor = divsor >> 1

if remainder == 0:
return True
else:
return False

if name == “main”:
try:
bus = smbus.SMBus(1)
with SHT21(bus) as sht21:

print sht21.read_humidity()

print sht21.read_temperature()

except IOError, e:
print e
print ‘Error creating connection to i2c.’

`

That gives me just now these values:
49.1910400391
5.99255615234

The second:

`
import time
from Adafruit_I2C import Adafruit_I2C
import math

class HTU21D():

HTU21D Address

address = 0x40

Commands

TRIGGER_TEMP_MEASURE_HOLD = 0xE3
TRIGGER_HUMD_MEASURE_HOLD = 0xE5
READ_USER_REG = 0xE7
WRITE_USER_REG = 0xE6

Constructor

def init(self):
self.i2c = Adafruit_I2C(self.address)

def writeUserRegister(self, value):
self.i2c.write8(self.WRITE_USER_REG, value)

def readUserRegister(self):

Read a byte

value = self.i2c.readU8(self.READ_USER_REG)

return value

def readTemperatureData(self):

value[0], value[1]: Raw temperature data

value[2]: CRC

value = self.i2c.readList(self.TRIGGER_TEMP_MEASURE_HOLD, 3)

return -255

rawTempData = ( value[0] << 8 ) + value[1]

Zero out the status bits but keep them in place

#rawTempData = rawTempData & 0xFFFC;

Calculate the actual temperature

actualTemp = -46.85 + (175.72 * rawTempData / 65536)

return actualTemp

def readHumidityData(self, korjaus=0):

value[0], value[1]: Raw relative humidity data

value[2]: CRC

value = self.i2c.readList(self.TRIGGER_HUMD_MEASURE_HOLD, 3)

rawRHData = ( value[0] << 8 ) + value[1]

Zero out the status bits but keep them in place

rawRHData = rawRHData & 0xFFFC;

Calculate the actual RH

actualRH = -6 + (125.0 * rawRHData / 65536)

return actualRH

sensor = HTU21D()

a = sensor.readHumidityData()
b = sensor.readTemperatureData()
print a
print b

`

And this prints:
49.549621582
5.45361999512