Advertisement
saper_2

HTU21D python test code

Mar 18th, 2016
960
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.08 KB | None | 0 0
  1. #!/usr/bin/python
  2. import struct, array, time, io, fcntl
  3.  
  4. I2C_SLAVE=0x0703
  5. HTU21D_ADDR = 0x40
  6. CMD_READ_TEMP_HOLD = "\xE3"
  7. CMD_READ_HUM_HOLD = "\xE5"
  8. CMD_READ_TEMP_NOHOLD = "\xF3"
  9. CMD_READ_HUM_NOHOLD = "\xF5"
  10. CMD_WRITE_USER_REG = "\xE6"
  11. CMD_READ_USER_REG = "\xE7"
  12. CMD_SOFT_RESET= "\xFE"
  13.  
  14. class i2c(object):
  15.    def __init__(self, device, bus):
  16.  
  17.           self.fr = io.open("/dev/i2c-"+str(bus), "rb", buffering=0)
  18.           self.fw = io.open("/dev/i2c-"+str(bus), "wb", buffering=0)
  19.  
  20.           # set device address
  21.  
  22.           fcntl.ioctl(self.fr, I2C_SLAVE, device)
  23.           fcntl.ioctl(self.fw, I2C_SLAVE, device)
  24.  
  25.    def write(self, bytes):
  26.           self.fw.write(bytes)
  27.  
  28.    def read(self, bytes):
  29.           return self.fr.read(bytes)
  30.  
  31.    def close(self):
  32.           self.fw.close()
  33.           self.fr.close()
  34.  
  35. class HTU21D(object):
  36.    def __init__(self):
  37.           self.dev = i2c(HTU21D_ADDR, 1) #HTU21D 0x40, bus 1
  38.           self.dev.write(CMD_SOFT_RESET) #soft reset
  39.           time.sleep(.1)
  40.  
  41.    def ctemp(self, sensorTemp):
  42.           tSensorTemp = sensorTemp / 65536.0
  43.           return -46.85 + (175.72 * tSensorTemp)
  44.  
  45.    def chumid(self, sensorHumid):
  46.           tSensorHumid = sensorHumid / 65536.0
  47.           return -6.0 + (125.0 * tSensorHumid)
  48.  
  49.    def crc8check(self, value):
  50.           # Ported from Sparkfun Arduino HTU21D Library: https://github.com/sparkfun/HTU21D_Breakout
  51.           remainder = ( ( value[0] << 8 ) + value[1] ) << 8
  52.           remainder |= value[2]
  53.  
  54.           # POLYNOMIAL = 0x0131 = x^8 + x^5 + x^4 + 1
  55.           # divsor = 0x988000 is the 0x0131 polynomial shifted to farthest left of three bytes
  56.           divsor = 0x988000
  57.  
  58.           for i in range(0, 16):
  59.                  if( remainder & 1 << (23 - i) ):
  60.                         remainder ^= divsor
  61.                  divsor = divsor >> 1
  62.  
  63.           if remainder == 0:
  64.                  return True
  65.           else:
  66.                  return False
  67.  
  68.    def read_tmperature(self):
  69.           self.dev.write(CMD_READ_TEMP_NOHOLD) #measure temp
  70.           time.sleep(.1)
  71.  
  72.           data = self.dev.read(3)
  73.           buf = array.array('B', data)
  74.  
  75.           if self.crc8check(buf):
  76.                  temp = (buf[0] << 8 | buf [1]) & 0xFFFC
  77.                  return self.ctemp(temp)
  78.           else:
  79.                  return -255
  80.  
  81.    def read_humidity(self):
  82.           self.dev.write(CMD_READ_HUM_NOHOLD) #measure humidity
  83.           time.sleep(.1)
  84.  
  85.           data = self.dev.read(3)
  86.           buf = array.array('B', data)
  87.  
  88.           if self.crc8check(buf):
  89.                  humid = (buf[0] << 8 | buf [1]) & 0xFFFC
  90.                  return self.chumid(humid)
  91.           else:
  92.                  return -255
  93.  
  94. if __name__ == "__main__":
  95.         # Create humdity sensor object
  96.         obj = HTU21D()
  97.         while True:
  98.                 # Read temp and humidity and log to file
  99.                 temp = obj.read_tmperature()
  100.                 humid = obj.read_humidity()
  101.                 out_string = "Temp=%.1f Humi=%.1f" % (temp, humid)
  102.                 print out_string
  103.                 time.sleep(1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement