Timing and Formatadaptions

This commit is contained in:
Dirk Alders 2021-10-13 08:53:50 +02:00
parent afedf43bdf
commit 6ab2629fb1
2 changed files with 155 additions and 155 deletions

298
bmp.py
View File

@ -1,148 +1,150 @@
import logging import logging
import time import time
try: try:
from config import APP_NAME as ROOT_LOGGER_NAME from config import APP_NAME as ROOT_LOGGER_NAME
except ImportError: except ImportError:
ROOT_LOGGER_NAME = 'root' ROOT_LOGGER_NAME = 'root'
logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__)
from . import background_task from . import background_task
try: try:
import smbus import smbus
except ImportError: except ImportError:
logger.warning("Could not import smbus. DEBUG set to True.") logger.warning("Could not import smbus. DEBUG set to True.")
DEBUG = True DEBUG = True
else: else:
from . import DEBUG from . import DEBUG
class bmp_180(background_task): class bmp_180(background_task):
RUN_SLEEP_TIME = 0.5 RUN_SLEEP_TIME = 2.0
SMBUS_DELAY = 0.5 SMBUS_DELAY = 0.5
MIN_REFRESH_RATE = RUN_SLEEP_TIME + 3 * SMBUS_DELAY MIN_REFRESH_RATE = RUN_SLEEP_TIME + 3 * SMBUS_DELAY
KEY_TEMPERATURE = 'temperature' KEY_TEMPERATURE = 'temperature'
KEY_PRESSURE = 'pressure' KEY_PRESSURE = 'pressure'
KEY_TIME = 'time' KEY_TIME = 'time'
def __init__(self, data_callback=None): def __init__(self, data_callback=None):
self.__data_callback__ = data_callback self.__data_callback__ = data_callback
# Initialise background_task # Initialise background_task
background_task.__init__(self) background_task.__init__(self)
def __run__(self): def __run__(self):
data = self.__bmp_data_transmission__() data = self.__bmp_data_transmission__()
if data is not None: if data is not None:
logger.debug('BMP-Communication: Successfully: %s', repr(data)) logger.info('BMP-Communication successful: %s', repr(data))
if self.__data_callback__ is not None: if self.__data_callback__ is not None:
self.__data_callback__(**data) self.__data_callback__(**data)
else:
def __bmp_data_transmission__(self): logger.debug('BMP-Communication failed: No data received')
if not DEBUG:
rv = {} def __bmp_data_transmission__(self):
# Get I2C bus if not DEBUG:
bus = smbus.SMBus(1) rv = {}
# Get I2C bus
# BMP180 address, 0x77(119) bus = smbus.SMBus(1)
# 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
# Convert the data data = bus.read_i2c_block_data(0x77, 0xAA, 22)
AC1 = data[0] * 256 + data[1]
if AC1 > 32767 : # Convert the data
AC1 -= 65535 AC1 = data[0] * 256 + data[1]
AC2 = data[2] * 256 + data[3] if AC1 > 32767 :
if AC2 > 32767 : AC1 -= 65535
AC2 -= 65535 AC2 = data[2] * 256 + data[3]
AC3 = data[4] * 256 + data[5] if AC2 > 32767 :
if AC3 > 32767 : AC2 -= 65535
AC3 -= 65535 AC3 = data[4] * 256 + data[5]
AC4 = data[6] * 256 + data[7] if AC3 > 32767 :
AC5 = data[8] * 256 + data[9] AC3 -= 65535
AC6 = data[10] * 256 + data[11] AC4 = data[6] * 256 + data[7]
B1 = data[12] * 256 + data[13] AC5 = data[8] * 256 + data[9]
if B1 > 32767 : AC6 = data[10] * 256 + data[11]
B1 -= 65535 B1 = data[12] * 256 + data[13]
B2 = data[14] * 256 + data[15] if B1 > 32767 :
if B2 > 32767 : B1 -= 65535
B2 -= 65535 B2 = data[14] * 256 + data[15]
MB = data[16] * 256 + data[17] if B2 > 32767 :
if MB > 32767 : B2 -= 65535
MB -= 65535 MB = data[16] * 256 + data[17]
MC = data[18] * 256 + data[19] if MB > 32767 :
if MC > 32767 : MB -= 65535
MC -= 65535 MC = data[18] * 256 + data[19]
MD = data[20] * 256 + data[21] if MC > 32767 :
if MD > 32767 : MC -= 65535
MD -= 65535 MD = data[20] * 256 + data[21]
if MD > 32767 :
time.sleep(self.SMBUS_DELAY) MD -= 65535
# BMP180 address, 0x77(119) time.sleep(self.SMBUS_DELAY)
# Select measurement control register, 0xF4(244)
# 0x2E(46) Enable temperature measurement # BMP180 address, 0x77(119)
bus.write_byte_data(0x77, 0xF4, 0x2E) # Select measurement control register, 0xF4(244)
# 0x2E(46) Enable temperature measurement
time.sleep(self.SMBUS_DELAY) bus.write_byte_data(0x77, 0xF4, 0x2E)
# BMP180 address, 0x77(119) time.sleep(self.SMBUS_DELAY)
# Read data back from 0xF6(246), 2 bytes
# temp MSB, temp LSB # BMP180 address, 0x77(119)
data = bus.read_i2c_block_data(0x77, 0xF6, 2) # Read data back from 0xF6(246), 2 bytes
# temp MSB, temp LSB
# Convert the data data = bus.read_i2c_block_data(0x77, 0xF6, 2)
temp = data[0] * 256 + data[1]
# Convert the data
# BMP180 address, 0x77(119) temp = data[0] * 256 + data[1]
# Select measurement control register, 0xF4(244)
# 0x74(116) Enable pressure measurement, OSS = 1 # BMP180 address, 0x77(119)
bus.write_byte_data(0x77, 0xF4, 0x74) # Select measurement control register, 0xF4(244)
# 0x74(116) Enable pressure measurement, OSS = 1
time.sleep(self.SMBUS_DELAY) bus.write_byte_data(0x77, 0xF4, 0x74)
# BMP180 address, 0x77(119) time.sleep(self.SMBUS_DELAY)
# Read data back from 0xF6(246), 3 bytes
# pres MSB1, pres MSB, pres LSB # BMP180 address, 0x77(119)
data = bus.read_i2c_block_data(0x77, 0xF6, 3) # Read data back from 0xF6(246), 3 bytes
# pres MSB1, pres MSB, pres LSB
rv[self.KEY_TIME] = int(time.time()) data = bus.read_i2c_block_data(0x77, 0xF6, 3)
# Convert the data rv[self.KEY_TIME] = int(time.time())
pres = ((data[0] * 65536) + (data[1] * 256) + data[2]) / 128
# Callibration for Temperature # Convert the data
X1 = (temp - AC6) * AC5 / 32768.0 pres = ((data[0] * 65536) + (data[1] * 256) + data[2]) / 128
X2 = (MC * 2048.0) / (X1 + MD) # Callibration for Temperature
B5 = X1 + X2 X1 = (temp - AC6) * AC5 / 32768.0
rv[self.KEY_TEMPERATURE] = ((B5 + 8.0) / 16.0) / 10.0 X2 = (MC * 2048.0) / (X1 + MD)
B5 = X1 + X2
# Calibration for Pressure rv[self.KEY_TEMPERATURE] = ((B5 + 8.0) / 16.0) / 10.0
B6 = B5 - 4000
X1 = (B2 * (B6 * B6 / 4096.0)) / 2048.0 # Calibration for Pressure
X2 = AC2 * B6 / 2048.0 B6 = B5 - 4000
X3 = X1 + X2 X1 = (B2 * (B6 * B6 / 4096.0)) / 2048.0
B3 = (((AC1 * 4 + X3) * 2) + 2) / 4.0 X2 = AC2 * B6 / 2048.0
X1 = AC3 * B6 / 8192.0 X3 = X1 + X2
X2 = (B1 * (B6 * B6 / 2048.0)) / 65536.0 B3 = (((AC1 * 4 + X3) * 2) + 2) / 4.0
X3 = ((X1 + X2) + 2) / 4.0 X1 = AC3 * B6 / 8192.0
B4 = AC4 * (X3 + 32768) / 32768.0 X2 = (B1 * (B6 * B6 / 2048.0)) / 65536.0
B7 = ((pres - B3) * (25000.0)) X3 = ((X1 + X2) + 2) / 4.0
pressure = 0.0 B4 = AC4 * (X3 + 32768) / 32768.0
if B7 < 2147483648: B7 = ((pres - B3) * (25000.0))
pressure = (B7 * 2) / B4 pressure = 0.0
else : if B7 < 2147483648:
pressure = (B7 / B4) * 2 pressure = (B7 * 2) / B4
X1 = (pressure / 256.0) * (pressure / 256.0) else :
X1 = (X1 * 3038.0) / 65536.0 pressure = (B7 / B4) * 2
X2 = ((-7357) * pressure) / 65536.0 X1 = (pressure / 256.0) * (pressure / 256.0)
rv[self.KEY_PRESSURE] = (pressure + (X1 + X2 + 3791) / 16.0) / 100 X1 = (X1 * 3038.0) / 65536.0
X2 = ((-7357) * pressure) / 65536.0
return rv rv[self.KEY_PRESSURE] = (pressure + (X1 + X2 + 3791) / 16.0) / 100
else:
time.sleep(3 * self.SMBUS_DELAY) return rv
return { else:
self.KEY_PRESSURE: 1717., time.sleep(3 * self.SMBUS_DELAY)
self.KEY_TEMPERATURE: 17.17, return {
self.KEY_TIME: int(time.time()) self.KEY_PRESSURE: 1717.,
} self.KEY_TEMPERATURE: 17.17,
self.KEY_TIME: int(time.time())
}

12
dht.py
View File

@ -19,7 +19,7 @@ else:
from . import DEBUG from . import DEBUG
class dht_22(background_task): class dht_22(background_task):
RUN_SLEEP_TIME = 2.0 RUN_SLEEP_TIME = 4.0
MIN_REFRESH_RATE = RUN_SLEEP_TIME MIN_REFRESH_RATE = RUN_SLEEP_TIME
KEY_TEMPERATURE = 'temperature' KEY_TEMPERATURE = 'temperature'
KEY_HUMIDITY = 'humidity' KEY_HUMIDITY = 'humidity'
@ -43,15 +43,15 @@ class dht_22(background_task):
# check data # check data
if self.__temp_monitor__.process(data[self.KEY_TEMPERATURE], data[self.KEY_TIME]) and self.__hum_monitor__.process(data[self.KEY_HUMIDITY], data[self.KEY_TIME]): if self.__temp_monitor__.process(data[self.KEY_TEMPERATURE], data[self.KEY_TIME]) and self.__hum_monitor__.process(data[self.KEY_HUMIDITY], data[self.KEY_TIME]):
# #
logger.debug('DHT-Communication: Successfully: %s', repr(data)) logger.info('DHT-Communication successful: %s', repr(data))
self.__monitor__.process(data) self.__monitor__.process(data)
if self.__data_callback__ is not None: if self.__data_callback__ is not None:
self.__data_callback__(**data) self.__data_callback__(**data)
if self.__monitor__.status(): if self.__monitor__.status():
logger.warning("DHT measurement stopped caused by too many identical values!") logger.warning("DHT-Communication failed: Measurement stopped caused by suspicious constant values!")
self.close() self.close()
else: else:
logger.warning("DHT-Gradient to high: Ignoring data %s!", repr(data)) logger.debug("DHT-Communication failed: Gradient to high. Ignoring data %s!", repr(data))
@ -69,7 +69,7 @@ class dht_22(background_task):
time.sleep(self.RUN_SLEEP_TIME) time.sleep(self.RUN_SLEEP_TIME)
except RuntimeError as error: except RuntimeError as error:
# Errors happen fairly often, DHT's are hard to read, just keep going # Errors happen fairly often, DHT's are hard to read, just keep going
logger.debug('DHT-Communication: ' + error.args[0]) logger.debug('DHT-Communication failed: ' + error.args[0])
time.sleep(2.0) time.sleep(2.0)
except Exception as error: except Exception as error:
self.__dht_device__.exit() self.__dht_device__.exit()
@ -127,8 +127,6 @@ class dht_22_monitor(object):
else: else:
self.__init_statevars__() self.__init_statevars__()
if self.__max_const_measurements__ > self.__max_const_treshold__: if self.__max_const_measurements__ > self.__max_const_treshold__:
if not self.__fail__:
logger.warning("DHT measurement values are suspicious constant!")
self.__fail__ = True self.__fail__ = True
def status(self): def status(self):