diff --git a/bmp.py b/bmp.py index 18ed94e..21cdce6 100644 --- a/bmp.py +++ b/bmp.py @@ -1,3 +1,5 @@ +import smbus +from . import background_task import logging import time @@ -8,16 +10,6 @@ except ImportError: logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) -from . import background_task - -try: - import smbus -except ImportError: - logger.warning("Could not import smbus. DEBUG set to True.") - DEBUG = True -else: - from . import DEBUG - class bmp_180(background_task): RUN_SLEEP_TIME = 2.0 @@ -29,6 +21,7 @@ class bmp_180(background_task): def __init__(self, data_callback=None): self.__data_callback__ = data_callback + self.DEBUG = False # Initialise background_task background_task.__init__(self) @@ -42,109 +35,113 @@ class bmp_180(background_task): logger.debug('BMP-Communication failed: No data received') def __bmp_data_transmission__(self): - if not DEBUG: + if not self.DEBUG: rv = {} # Get I2C bus - bus = smbus.SMBus(1) + try: + bus = smbus.SMBus(1) + except PermissionError: + logger.warning("Switching to DEBUG mode due to permission error...") + self.DEBUG = True + else: + # BMP180 address, 0x77(119) + # Read data back from 0xAA(170), 22 bytes + data = bus.read_i2c_block_data(0x77, 0xAA, 22) - # BMP180 address, 0x77(119) - # Read data back from 0xAA(170), 22 bytes - data = bus.read_i2c_block_data(0x77, 0xAA, 22) + # Convert the data + AC1 = data[0] * 256 + data[1] + if AC1 > 32767: + AC1 -= 65535 + AC2 = data[2] * 256 + data[3] + if AC2 > 32767: + AC2 -= 65535 + AC3 = data[4] * 256 + data[5] + if AC3 > 32767: + AC3 -= 65535 + AC4 = data[6] * 256 + data[7] + AC5 = data[8] * 256 + data[9] + AC6 = data[10] * 256 + data[11] + B1 = data[12] * 256 + data[13] + if B1 > 32767: + B1 -= 65535 + B2 = data[14] * 256 + data[15] + if B2 > 32767: + B2 -= 65535 + MB = data[16] * 256 + data[17] + if MB > 32767: + MB -= 65535 + MC = data[18] * 256 + data[19] + if MC > 32767: + MC -= 65535 + MD = data[20] * 256 + data[21] + if MD > 32767: + MD -= 65535 - # Convert the data - AC1 = data[0] * 256 + data[1] - if AC1 > 32767 : - AC1 -= 65535 - AC2 = data[2] * 256 + data[3] - if AC2 > 32767 : - AC2 -= 65535 - AC3 = data[4] * 256 + data[5] - if AC3 > 32767 : - AC3 -= 65535 - AC4 = data[6] * 256 + data[7] - AC5 = data[8] * 256 + data[9] - AC6 = data[10] * 256 + data[11] - B1 = data[12] * 256 + data[13] - if B1 > 32767 : - B1 -= 65535 - B2 = data[14] * 256 + data[15] - if B2 > 32767 : - B2 -= 65535 - MB = data[16] * 256 + data[17] - if MB > 32767 : - MB -= 65535 - MC = data[18] * 256 + data[19] - if MC > 32767 : - MC -= 65535 - MD = data[20] * 256 + data[21] - if MD > 32767 : - MD -= 65535 + time.sleep(self.SMBUS_DELAY) - time.sleep(self.SMBUS_DELAY) + # BMP180 address, 0x77(119) + # Select measurement control register, 0xF4(244) + # 0x2E(46) Enable temperature measurement + bus.write_byte_data(0x77, 0xF4, 0x2E) - # BMP180 address, 0x77(119) - # Select measurement control register, 0xF4(244) - # 0x2E(46) Enable temperature measurement - bus.write_byte_data(0x77, 0xF4, 0x2E) + time.sleep(self.SMBUS_DELAY) - time.sleep(self.SMBUS_DELAY) + # BMP180 address, 0x77(119) + # Read data back from 0xF6(246), 2 bytes + # temp MSB, temp LSB + data = bus.read_i2c_block_data(0x77, 0xF6, 2) - # BMP180 address, 0x77(119) - # Read data back from 0xF6(246), 2 bytes - # temp MSB, temp LSB - data = bus.read_i2c_block_data(0x77, 0xF6, 2) + # Convert the data + temp = data[0] * 256 + data[1] - # Convert the data - temp = data[0] * 256 + data[1] + # BMP180 address, 0x77(119) + # Select measurement control register, 0xF4(244) + # 0x74(116) Enable pressure measurement, OSS = 1 + bus.write_byte_data(0x77, 0xF4, 0x74) - # BMP180 address, 0x77(119) - # Select measurement control register, 0xF4(244) - # 0x74(116) Enable pressure measurement, OSS = 1 - bus.write_byte_data(0x77, 0xF4, 0x74) + time.sleep(self.SMBUS_DELAY) - time.sleep(self.SMBUS_DELAY) + # BMP180 address, 0x77(119) + # Read data back from 0xF6(246), 3 bytes + # pres MSB1, pres MSB, pres LSB + data = bus.read_i2c_block_data(0x77, 0xF6, 3) - # BMP180 address, 0x77(119) - # Read data back from 0xF6(246), 3 bytes - # pres MSB1, pres MSB, pres LSB - data = bus.read_i2c_block_data(0x77, 0xF6, 3) + rv[self.KEY_TIME] = int(time.time()) - rv[self.KEY_TIME] = int(time.time()) + # Convert the data + pres = ((data[0] * 65536) + (data[1] * 256) + data[2]) / 128 + # Callibration for Temperature + X1 = (temp - AC6) * AC5 / 32768.0 + X2 = (MC * 2048.0) / (X1 + MD) + B5 = X1 + X2 + rv[self.KEY_TEMPERATURE] = ((B5 + 8.0) / 16.0) / 10.0 - # Convert the data - pres = ((data[0] * 65536) + (data[1] * 256) + data[2]) / 128 - # Callibration for Temperature - X1 = (temp - AC6) * AC5 / 32768.0 - X2 = (MC * 2048.0) / (X1 + MD) - B5 = X1 + X2 - rv[self.KEY_TEMPERATURE] = ((B5 + 8.0) / 16.0) / 10.0 + # Calibration for Pressure + B6 = B5 - 4000 + X1 = (B2 * (B6 * B6 / 4096.0)) / 2048.0 + X2 = AC2 * B6 / 2048.0 + X3 = X1 + X2 + B3 = (((AC1 * 4 + X3) * 2) + 2) / 4.0 + X1 = AC3 * B6 / 8192.0 + X2 = (B1 * (B6 * B6 / 2048.0)) / 65536.0 + X3 = ((X1 + X2) + 2) / 4.0 + B4 = AC4 * (X3 + 32768) / 32768.0 + B7 = ((pres - B3) * (25000.0)) + pressure = 0.0 + if B7 < 2147483648: + pressure = (B7 * 2) / B4 + else: + pressure = (B7 / B4) * 2 + X1 = (pressure / 256.0) * (pressure / 256.0) + X1 = (X1 * 3038.0) / 65536.0 + X2 = ((-7357) * pressure) / 65536.0 + rv[self.KEY_PRESSURE] = (pressure + (X1 + X2 + 3791) / 16.0) / 100 - # Calibration for Pressure - B6 = B5 - 4000 - X1 = (B2 * (B6 * B6 / 4096.0)) / 2048.0 - X2 = AC2 * B6 / 2048.0 - X3 = X1 + X2 - B3 = (((AC1 * 4 + X3) * 2) + 2) / 4.0 - X1 = AC3 * B6 / 8192.0 - X2 = (B1 * (B6 * B6 / 2048.0)) / 65536.0 - X3 = ((X1 + X2) + 2) / 4.0 - B4 = AC4 * (X3 + 32768) / 32768.0 - B7 = ((pres - B3) * (25000.0)) - pressure = 0.0 - if B7 < 2147483648: - pressure = (B7 * 2) / B4 - else : - pressure = (B7 / B4) * 2 - X1 = (pressure / 256.0) * (pressure / 256.0) - X1 = (X1 * 3038.0) / 65536.0 - X2 = ((-7357) * pressure) / 65536.0 - rv[self.KEY_PRESSURE] = (pressure + (X1 + X2 + 3791) / 16.0) / 100 - - return rv + return rv else: time.sleep(3 * self.SMBUS_DELAY) return { self.KEY_PRESSURE: 1717., self.KEY_TEMPERATURE: 17.17, self.KEY_TIME: int(time.time()) - } + } diff --git a/dht.py b/dht.py index 52d0e4d..d67b38a 100644 --- a/dht.py +++ b/dht.py @@ -1,3 +1,5 @@ +import adafruit_dht +from . import background_task import logging import time @@ -8,16 +10,6 @@ except ImportError: logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) -from . import background_task - -try: - import adafruit_dht -except ImportError: - logger.warning("Could not import adafruit_dht. DEBUG set to True") - DEBUG = True -else: - from . import DEBUG - class dht_22(background_task): RUN_SLEEP_TIME = 4.0 @@ -32,8 +24,12 @@ class dht_22(background_task): self.__temp_monitor__ = gradient_monitor(.5) self.__hum_monitor__ = gradient_monitor(5) self.__monitor__ = dht_22_monitor(300) + self.DEBUG = gpio is None + if self.DEBUG: + logger.warning("Switching to DEBUG mode due to gpio is None...") + # Initial the dht device, with data pin connected to: - if not DEBUG: + if not self.DEBUG: self.__dht_device__ = adafruit_dht.DHT22(gpio, use_pulseio=False) # Initialise background_task background_task.__init__(self) @@ -55,7 +51,7 @@ class dht_22(background_task): logger.debug("DHT-Communication failed: Gradient to high. Ignoring data %s!", repr(data)) def __dht_data_transmission__(self): - if not DEBUG: + if not self.DEBUG: while self.__active__: try: # Store the values