Htu21d.py

From Federal Burro of Information
Revision as of 15:38, 5 September 2016 by David (talk | contribs) (Created page with "<pre. #!/usr/bin/python import struct, array, time, io, fcntl I2C_SLAVE=0x0703 HTU21D_ADDR = 0x40 CMD_READ_TEMP_HOLD = "\xE3" CMD_READ_HUM_HOLD = "\xE5" CMD_READ_TEMP_NOHOLD...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

<pre.

  1. !/usr/bin/python

import struct, array, time, io, fcntl

I2C_SLAVE=0x0703 HTU21D_ADDR = 0x40 CMD_READ_TEMP_HOLD = "\xE3" CMD_READ_HUM_HOLD = "\xE5" CMD_READ_TEMP_NOHOLD = "\xF3" CMD_READ_HUM_NOHOLD = "\xF5" CMD_WRITE_USER_REG = "\xE6" CMD_READ_USER_REG = "\xE7" CMD_SOFT_RESET= "\xFE"

class i2c(object):

  def __init__(self, device, bus):
     self.fr = io.open("/dev/i2c-"+str(bus), "rb", buffering=0)
     self.fw = io.open("/dev/i2c-"+str(bus), "wb", buffering=0)
     # set device address
     fcntl.ioctl(self.fr, I2C_SLAVE, device)
     fcntl.ioctl(self.fw, I2C_SLAVE, device)
  def write(self, bytes):
     self.fw.write(bytes)
  def read(self, bytes):
     return self.fr.read(bytes)
  def close(self):
     self.fw.close()
     self.fr.close()

class HTU21D(object):

  def __init__(self):
     self.dev = i2c(HTU21D_ADDR, 1) #HTU21D 0x40, bus 1
     self.dev.write(CMD_SOFT_RESET) #soft reset
     time.sleep(.1)
  def ctemp(self, sensorTemp):
     tSensorTemp = sensorTemp / 65536.0
     return -46.85 + (175.72 * tSensorTemp)
  def chumid(self, sensorHumid):
     tSensorHumid = sensorHumid / 65536.0
     return -6.0 + (125.0 * tSensorHumid)
  def crc8check(self, value):
     # Ported from Sparkfun Arduino HTU21D Library: https://github.com/sparkfun/HTU21D_Breakout
     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
  
  def read_tmperature(self):
     self.dev.write(CMD_READ_TEMP_NOHOLD) #measure temp
     time.sleep(.1)
     data = self.dev.read(3)
     buf = array.array('B', data)
     if self.crc8check(buf):
        temp = (buf[0] << 8 | buf [1]) & 0xFFFC
        return self.ctemp(temp)
     else:
        return -255
        
  def read_humidity(self):
     self.dev.write(CMD_READ_HUM_NOHOLD) #measure humidity
     time.sleep(.1)
     data = self.dev.read(3)
     buf = array.array('B', data)
     
     if self.crc8check(buf):
        humid = (buf[0] << 8 | buf [1]) & 0xFFFC
        return self.chumid(humid)
     else:
        return -255
        

if __name__ == "__main__":

  obj = HTU21D()
  print "Temp:", obj.read_tmperature(), "C"
  print "Humid:", obj.read_humidity(), "% rH"

Category;Script