Introduce OpenPythonSensor Library

Introduce the Python driven, I2C focused, Embedded Linux application level library for digital sensors – OpenPythonLibrary.

The very first version includes supports for:

  • BMP180 Barometric Pressure sensor;
  • HTU21D Relative Humidity sensor (Only support Beaglebone Black at this moment);
  • SI1145 Proximity/UV/Ambient Light sensor;
  • TMP007 Infrared Thermopile sensor;
  • HMC6352 Digital Compass;
  • MPU6050 Six-Axis (Gyro + Accelerometer) MEMS;

The I2C bus is set to 1 in OpenPythonSensor / ops_base / and can be modified to support more development platforms. The python-smbus is a prerequisite of this library.

The library can be found at Github under MIT License.

Example usage of the library
from lib_htu21d import HTU21D
# Initialize the library
htu = HTU21D()
temp = htu.readTemperatureData()
rh = htu.readHumidityData()
print "Temperature: %.2f C, Humidity: %.2f %%" % (temp, rh)
Clone the code
git clone
Download the library

Click -> GitHub_Logo to download

Part of the library is ported from Adafruit-Raspberry-Pi-Python-Code and should remain it’s original license. Some driver is referenced from both Adafruit and Sparkfun and thanks to their original work.

More sensor support will coming soon!


python powered Boris_Tux_PNG
Beaglebone Black with Sensors

Python Library for HTU21D Humidity Sensor on Beaglebone Black and Raspberry Pi with Adafruit_I2C

Here is a python library for the HTU21D Humidity Sensor Module with data output of temperature and relative humidity. Code works well with Beaglebone Black and should also works with Raspberry Pi.

Looks like there is some I2C address issue with this driver on the Pi. Please use with caution. I only did some test for this code on a Beaglebone Black with a Sparkfun HTU21D sensor module.

The HTU21D has an I2C address of 0x40, but it won’t respond to the i2cdetect command on Beaglebone Black stock image.

Also note this module will not accept any unexpected i2c data write/read.

Library and example code can be checked out at Github.

import time
from Adafruit_I2C import Adafruit_I2C
# ===========================================================================
# HTU21D Class
# ===========================================================================
class HTU21D:
	i2c = None
	# HTU21D Address
	address = 0x40
	# Commands
	# Constructor
	def __init__(self):
		self.i2c = Adafruit_I2C(self.address)
	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)
		if not self.crc8check(value):
			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):
		# value[0], value[1]: Raw relative humidity data
		# value[2]: CRC
		value = self.i2c.readList(self.TRIGGER_HUMD_MEASURE_HOLD, 3)
		if not self.crc8check(value):
			return -255
		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
	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
			return False

Read heading output from compass IC HMC6352 on Beaglebone Black / Raspberry Pi with Adafruit_I2C

Note: Although the datasheet has an I2C address 0x42 on file, the recognized address for this HMC6352 is actually 0x42>>1 which is 0x21.

Also looks like this IC doesn’t care about the register address at all, so put 0x0 in the register address field would be fine.

Code/Driver tested with Beaglebone Black and Sparkfun HMC6352 Module.

The HMC6352 library can be checked out at Github.

import time
from Adafruit_I2C import Adafruit_I2C
# ===========================================================================
# HMC6352 Class
# ===========================================================================
class HMC6352 :
	i2c = None
	# HMC6352 Address
	address = 0x42 >> 1
	# Commands
	# Constructor
	def __init__(self):
		self.i2c = Adafruit_I2C(self.address)
	def userCalibration(self):
		"Write 0x45 for calibration and write 0x4C for leave after 20s"
		self.i2c.write8(0x0, self.CMD_ENTER_USER_CALIBRATION)
		self.i2c.write8(0x0, self.CMD_EXIT_USER_CALIBRATION)
	def readData(self):
		"Read the heading data by write a 0x41 first"
		self.i2c.write8(0x0, self.CMD_READ_DATA)
		# Wait 6 ms
		# Read 2 bytes
		value = self.i2c.readU16(0x0)
		# Reverse the data byte order
		value = self.i2c.reverseByteOrder(value)
		# Convert to 360.0 range from the raw integer value
		value = float('%0.1f'%value)/10
		return value