diff --git a/Adafruit_BMP085/Adafruit_BMP085_example.py b/Adafruit_BMP085/Adafruit_BMP085_example.py index 5e0d0bef..62ccaf8b 100755 --- a/Adafruit_BMP085/Adafruit_BMP085_example.py +++ b/Adafruit_BMP085/Adafruit_BMP085_example.py @@ -1,7 +1,20 @@ #!/usr/bin/python +from time import sleep from Adafruit_BMP085 import BMP085 +def C_to_F(C): + return C * (180.0 / 100.0) + 32.0 + +def m_to_ft(m): + return 3.2808399 * m + +def hPa_to_inHg(hPa): + return hPa / 33.86389 + +def hPa_to_psi(hPa): + return hPa / 0.0145037 + # =========================================================================== # Example Code # =========================================================================== @@ -16,10 +29,12 @@ # bmp = BMP085(0x77, 2) # HIRES Mode # bmp = BMP085(0x77, 3) # ULTRAHIRES Mode -temp = bmp.readTemperature() -pressure = bmp.readPressure() -altitude = bmp.readAltitude() +while True: + temp = bmp.readTemperature() + pressure = bmp.readPressure() + altitude = bmp.readAltitude() -print "Temperature: %.2f C" % temp -print "Pressure: %.2f hPa" % (pressure / 100.0) -print "Altitude: %.2f" % altitude + print "Temperature: %.2f C / %.2f F" % (temp, C_to_F(temp)) + print "Pressure: %.2f hPa / %.2f inHg" % ((pressure / 100.0), hPa_to_inHg(pressure / 100.0)) + print "Altitude: %.2f m / %.1f ft" % (altitude, m_to_ft(altitude)) + sleep(2.0) diff --git a/Adafruit_I2C/Adafruit_I2C.py b/Adafruit_I2C/Adafruit_I2C.py index 3423461d..525e6b7a 100755 --- a/Adafruit_I2C/Adafruit_I2C.py +++ b/Adafruit_I2C/Adafruit_I2C.py @@ -1,6 +1,7 @@ #!/usr/bin/python import smbus +from ctypes import c_short # =========================================================================== # Adafruit_I2C Class @@ -61,11 +62,11 @@ def write8(self, reg, value): def write16(self, reg, value): "Writes a 16-bit value to the specified register/address pair" + value = ((value << 8) & 0xff00) | ((value >> 8) & 0xff) try: self.bus.write_word_data(self.address, reg, value) if self.debug: - print ("I2C: Wrote 0x%02X to register pair 0x%02X,0x%02X" % - (value, reg, reg+1)) + print ("I2C: Wrote 0x%04X to register 0x%02X" % (value, reg)) except IOError, err: return self.errMsg() @@ -117,9 +118,10 @@ def readS8(self, reg): def readU16(self, reg): "Reads an unsigned 16-bit value from the I2C device" try: - hibyte = self.readU8(reg) - lobyte = self.readU8(reg+1) - result = (hibyte << 8) + lobyte + result = self.bus.read_word_data(self.address, reg) + hibyte = 0xff & result + lobyte = 0xff & (result >> 8) + result = (hibyte << 8) | lobyte if (self.debug): print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) return result @@ -129,9 +131,13 @@ def readU16(self, reg): def readS16(self, reg): "Reads a signed 16-bit value from the I2C device" try: - hibyte = self.readS8(reg) - lobyte = self.readU8(reg+1) - result = (hibyte << 8) + lobyte + #hibyte = self.readS8(reg) + #lobyte = self.readU8(reg+1) + #result = (hibyte << 8) + lobyte + result = self.bus.read_word_data(self.address, reg) + hibyte = 0xff & result + lobyte = 0xff & (result >> 8) + result = c_short((hibyte << 8) + lobyte).value if (self.debug): print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) return result diff --git a/Adafruit_TMP006/Adafruit_I2C.py b/Adafruit_TMP006/Adafruit_I2C.py new file mode 120000 index 00000000..77f06164 --- /dev/null +++ b/Adafruit_TMP006/Adafruit_I2C.py @@ -0,0 +1 @@ +../Adafruit_I2C/Adafruit_I2C.py \ No newline at end of file diff --git a/Adafruit_TMP006/Adafruit_TMP006.py b/Adafruit_TMP006/Adafruit_TMP006.py new file mode 100644 index 00000000..b7256420 --- /dev/null +++ b/Adafruit_TMP006/Adafruit_TMP006.py @@ -0,0 +1,134 @@ +#!/usr/bin/python + +import time +from Adafruit_I2C import Adafruit_I2C +from math import sqrt + +# =========================================================================== +# TMP006 Class +# =========================================================================== + +class TMP006 : + i2c = None + + # TMP006 Registers + __TMP006_REG_VOBJ = 0x00 + __TMP006_REG_TAMB = 0x01 + __TMP006_REG_CONFIG = 0x02 + __TMP006_REG_MANID = 0xFE + __TMP006_REG_DEVID = 0xFF + + # CONFIG Register Values + __TMP006_CFG_RESET = 0x8000 + __TMP006_CFG_MODEON = 0x7000 + __TMP006_CFG_1SAMPLE = 0x0000 + __TMP006_CFG_2SAMPLE = 0x0200 + __TMP006_CFG_4SAMPLE = 0x0400 + __TMP006_CFG_8SAMPLE = 0x0600 + __TMP006_CFG_16SAMPLE = 0x0800 + __TMP006_CFG_DRDYEN = 0x0100 + __TMP006_CFG_DRDY = 0x0080 + + # Manufacturer ID + __TMP006_MANID = 0x5449 + + # Device ID + __TMP006_DEVID = 0x0067 + + # Internal Data + __TMP006_B0 = -0.0000294 + __TMP006_B1 = -0.00000057 + __TMP006_B2 = 0.00000000463 + __TMP006_C2 = 13.4 + __TMP006_TREF = 298.15 + __TMP006_A2 = -0.00001678 + __TMP006_A1 = 0.00175 + __TMP006_S0 = 6.4 # * 10^-14 + + # Constructor + def __init__(self, address=0x40, mode=1, debug=False): + self.i2c = Adafruit_I2C(address) + + self.address = address + self.debug = debug + self.started = False + + # Destructor + def __del__(self): + if self.started: + self.i2c.write16(self.__TMP006_REG_CONFIG, 0); + + # Start Sampling + def begin(self, samplerate=__TMP006_CFG_16SAMPLE): + self.i2c.write16(self.__TMP006_REG_CONFIG, + self.__TMP006_CFG_MODEON | self.__TMP006_CFG_DRDYEN | samplerate); + + self.started = True + + mid = self.i2c.readU16(self.__TMP006_REG_MANID) + did = self.i2c.readU16(self.__TMP006_REG_DEVID) + + if self.debug: + print "mid = 0x%x" % mid + print "did = 0x%x" % did + + if mid != self.__TMP006_MANID: + print "WARN TMP006: Manufacturer ID Mismatch (%04X)" % mid + if did != self.__TMP006_DEVID: + print "WARN TMP006: Device ID Mismatch (%04X)" % did + + def readRawDieTemperature(self): + "Read the raw die temperature" + raw = self.i2c.readS16(self.__TMP006_REG_TAMB) + raw >>= 2 + if self.debug: + C = raw * 0.03125 + print "Raw Tambient: 0x%04X (%f C)" % (raw, C) + return raw + + def readRawVoltage(self): + "Read the raw voltage" + raw = self.i2c.readS16(self.__TMP006_REG_VOBJ) + if self.debug: + v = raw + v *= 156.25 + v /= 1000 + print "Raw voltage: 0x%04X (%f uV)" % (raw, v) + return raw + + def readDieTempC(self): + Tdie = self.readRawDieTemperature() + Tdie *= 0.03125 # convert to celsius + if self.debug: + print "Tdie = ", Tdie + return Tdie + + def readObjTempC(self): + Tdie = self.readRawDieTemperature() + Vobj = self.readRawVoltage() + Vobj *= 156.25 # 156.25 nV per LSB + Vobj /= 1000 # nV -> uV + Vobj /= 1000 # uV -> mV + Vobj /= 1000 # mV -> V + Tdie *= 0.03125 # convert to celsius + Tdie += 273.15 # convert to kelvin + + if self.debug: + print "Vobj = ", Vobj * 1000000, "uV" + print "Tdie = ", Tdie, " C" + + tdie_tref = Tdie - self.__TMP006_TREF + S = 1 + self.__TMP006_A1 * tdie_tref \ + + self.__TMP006_A2 * tdie_tref * tdie_tref + S *= self.__TMP006_S0 + S /= 10000000 + S /= 10000000 + + Vos = self.__TMP006_B0 + self.__TMP006_B1 * tdie_tref \ + + self.__TMP006_B2 * tdie_tref * tdie_tref + + fVobj = (Vobj - Vos) + self.__TMP006_C2 * (Vobj-Vos)*(Vobj-Vos) + Tobj = sqrt(sqrt(Tdie * Tdie * Tdie * Tdie + fVobj/S)) + + Tobj -= 273.15 # Kelvin -> *C + return Tobj diff --git a/Adafruit_TMP006/Adafruit_TMP006_example.py b/Adafruit_TMP006/Adafruit_TMP006_example.py new file mode 100755 index 00000000..8965a0b6 --- /dev/null +++ b/Adafruit_TMP006/Adafruit_TMP006_example.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +from Adafruit_TMP006 import TMP006 +from time import sleep + +def C_to_F(C): + return C * (180.0 / 100.0) + 32.0 + +# =========================================================================== +# Example Code +# =========================================================================== + +# Initialise the TMP006 and use defaults +# tmp = TMP006(0x40, debug=True) +tmp = TMP006(0x41) + +# Start sampling +tmp.begin() + +# Wait a short bit for sample averaging +while True: + print "Pausing 2.0 s..." + sleep(2.0) + + dietemp = tmp.readDieTempC() + objtemp = tmp.readObjTempC() + + print "Die Temperature: %.2f C / %.2f F" % (dietemp, C_to_F(dietemp)) + print "Object Temperature: %.2f C / %.2f F" % (objtemp, C_to_F(objtemp)) +