Yet Another WebIOPi+
 All Classes Namespaces Files Functions Variables Macros Pages
bmp085.py
Go to the documentation of this file.
1 # Copyright 2012-2013 Eric Ptak - trouch.com
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 import time
16 from webiopi.utils.types import signInteger
17 from webiopi.devices.i2c import I2C
18 from webiopi.devices.sensor import Temperature, Pressure
19 
21  def __init__(self, altitude=0, external=None):
22  I2C.__init__(self, 0x77)
23  Pressure.__init__(self, altitude, external)
24 
25  self.ac1 = self.readSignedInteger(0xAA)
26  self.ac2 = self.readSignedInteger(0xAC)
27  self.ac3 = self.readSignedInteger(0xAE)
28  self.ac4 = self.readUnsignedInteger(0xB0)
29  self.ac5 = self.readUnsignedInteger(0xB2)
30  self.ac6 = self.readUnsignedInteger(0xB4)
31  self.b1 = self.readSignedInteger(0xB6)
32  self.b2 = self.readSignedInteger(0xB8)
33  self.mb = self.readSignedInteger(0xBA)
34  self.mc = self.readSignedInteger(0xBC)
35  self.md = self.readSignedInteger(0xBE)
36 
37  def __str__(self):
38  return "BMP085"
39 
40  def __family__(self):
41  return [Temperature.__family__(self), Pressure.__family__(self)]
42 
43  def readUnsignedInteger(self, address):
44  d = self.readRegisters(address, 2)
45  return d[0] << 8 | d[1]
46 
47  def readSignedInteger(self, address):
48  d = self.readUnsignedInteger(address)
49  return signInteger(d, 16)
50 
51  def readUT(self):
52  self.writeRegister(0xF4, 0x2E)
53  time.sleep(0.01)
54  return self.readUnsignedInteger(0xF6)
55 
56  def readUP(self):
57  self.writeRegister(0xF4, 0x34)
58  time.sleep(0.01)
59  return self.readUnsignedInteger(0xF6)
60 
61  def getB5(self):
62  ut = self.readUT()
63  x1 = ((ut - self.ac6) * self.ac5) / 2**15
64  x2 = (self.mc * 2**11) / (x1 + self.md)
65  return x1 + x2
66 
67  def __getKelvin__(self):
68  return self.Celsius2Kelvin()
69 
70  def __getCelsius__(self):
71  t = (self.getB5() + 8) / 2**4
72  return float(t) / 10.0
73 
74  def __getFahrenheit__(self):
75  return self.Celsius2Fahrenheit()
76 
77  def __getPascal__(self):
78  b5 = self.getB5()
79  up = self.readUP()
80  b6 = b5 - 4000
81  x1 = (self.b2 * (b6 * b6 / 2**12)) / 2**11
82  x2 = self.ac2 * b6 / 2**11
83  x3 = x1 + x2
84  b3 = (self.ac1*4 + x3 + 2) / 4
85 
86  x1 = self.ac3 * b6 / 2**13
87  x2 = (self.b1 * (b6 * b6 / 2**12)) / 2**16
88  x3 = (x1 + x2 + 2) / 2**2
89  b4 = self.ac4 * (x3 + 32768) / 2**15
90  b7 = (up-b3) * 50000
91  if b7 < 0x80000000:
92  p = (b7 * 2) / b4
93  else:
94  p = (b7 / b4) * 2
95 
96  x1 = (p / 2**8) * (p / 2**8)
97  x1 = (x1 * 3038) / 2**16
98  x2 = (-7357*p) / 2**16
99  p = p + (x1 + x2 + 3791) / 2**4
100  return int(p)
101 
102 class BMP180(BMP085):
103  def __init__(self, altitude=0, external=None):
104  BMP085.__init__(self, altitude, external)
105 
106  def __str__(self):
107  return "BMP180"
108