From 811f99f7d2c744bda3f9bc813eac655574f27e72 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 08:55:52 +0300 Subject: [PATCH 01/13] correct temperature readings for ICs with a fuse bit problem --- adafruit_dps310.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 6dd6a19..6fdf55e 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -203,6 +203,10 @@ class DPS310: _calib_coeff_temp_src_bit = ROBit(_DPS310_TMPCOEFSRCE, 7) + _reg0E = RWBits(8, 0x0E, 0) + _reg0F = RWBits(8, 0x0F, 0) + _reg62 = RWBits(8, 0x62, 0) + def __init__(self, i2c_bus, address=_DPS310_DEFAULT_ADDRESS): self.i2c_device = i2c_device.I2CDevice(i2c_bus, address) @@ -253,6 +257,21 @@ def initialize(self): while (self._temp_ready is False) or (self._pressure_ready is False): sleep(0.001) + # (https://github.com/Infineon/DPS310-Pressure-Sensor#temperature-measurement-issue) + # similar to DpsClass::correctTemp(void) from infineon's c++ library + def _correct_temp(self): + """Correct temperature readings on ICs with a fuse bit problem""" + self._reg0E = 0xA5 + self._reg0F = 0x96 + self._reg62 = 0x02 + self._reg0E = 0 + self._reg0F = 0 + + # perform a temperature measurement + # the most recent temperature will be saved internally + # and used for compensation when calculating pressure + unused = self._raw_temperature + def _reset(self): """Perform a soft-reset on the sensor""" self._reset_register = 0x89 @@ -260,6 +279,7 @@ def _reset(self): sleep(0.010) while not self._sensor_ready: sleep(0.001) + self._correct_temp() @property def pressure(self): From 0ae21598ac4feaff937db4952d62d3f54824a620 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 09:00:03 +0300 Subject: [PATCH 02/13] move calibration stuff from initialize() to reset() --- adafruit_dps310.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 6fdf55e..d628ebd 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -238,13 +238,9 @@ def __init__(self, i2c_bus, address=_DPS310_DEFAULT_ADDRESS): self.initialize() def initialize(self): - """Reset the sensor to the default state""" + """Initialize the sensor to continuous measurement""" - self._reset() - self._read_calibration() - - # make sure we're using the temperature source used for calibration - self._temp_measurement_src_bit = self._calib_coeff_temp_src_bit + self.reset() self.pressure_rate = Rate.RATE_64_HZ self.pressure_oversample_count = SampleCount.COUNT_64 @@ -272,14 +268,17 @@ def _correct_temp(self): # and used for compensation when calculating pressure unused = self._raw_temperature - def _reset(self): - """Perform a soft-reset on the sensor""" + def reset(self): + """Reset the sensor""" self._reset_register = 0x89 # wait for hardware reset to finish sleep(0.010) while not self._sensor_ready: sleep(0.001) self._correct_temp() + self._read_calibration() + # make sure we're using the temperature source used for calibration + self._temp_measurement_src_bit = self._calib_coeff_temp_src_bit @property def pressure(self): From e03ab8d701092480caa9b33150bf72022bd3d7d5 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 09:09:30 +0300 Subject: [PATCH 03/13] add self.wait_{temperature,pressure}_ready functions --- adafruit_dps310.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index d628ebd..a93c749 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -249,9 +249,8 @@ def initialize(self): self.mode = Mode.CONT_PRESTEMP # wait until we have at least one good measurement - - while (self._temp_ready is False) or (self._pressure_ready is False): - sleep(0.001) + self.wait_temperature_ready() + self.wait_pressure_ready() # (https://github.com/Infineon/DPS310-Pressure-Sensor#temperature-measurement-issue) # similar to DpsClass::correctTemp(void) from infineon's c++ library @@ -315,11 +314,19 @@ def temperature_ready(self): """Returns true if there is a temperature reading ready""" return self._temp_ready + def wait_temperature_ready(self): + while (self._temp_ready is False): + sleep(0.001) + @property def pressure_ready(self): """Returns true if pressure readings are ready""" return self._pressure_ready + def wait_pressure_ready(self): + while (self._pressure_ready is False): + sleep(0.001) + @property def mode(self): """The measurement mode. Must be a `Mode`. See the `Mode` documentation for details""" From e008d91861d8bfa83d8dcf58370c00d4f802c501 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 09:21:03 +0300 Subject: [PATCH 04/13] readme / add caveat about resetting IC when changing mode and sample rates --- README.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.rst b/README.rst index b3c46b6..ce0baec 100644 --- a/README.rst +++ b/README.rst @@ -73,6 +73,16 @@ Usage Example print("") time.sleep(1.0) +Caveat: by default the library initializes the IC with constant temperature and pressure measurements at 64Hz with 64 samples. It is not possible to change the IC's mode, temperature_oversample_count or pressure_oversample_count on-the-fly so resetting the IC and operation parameteres is required. For instance, to set the mode to continuous pressure measurement at 1Hz with 2 samples: + +.. code-block:: python3 + + dps310.reset() + dps310.pressure_oversample_count = SampleCount.COUNT_2 + dps310.pressure_rate = Rate.RATE_1_HZ + dps310.mode = Mode.CONT_PRESSURE + dps310.wait_pressure_ready() + Contributing ============ From 3eab93e7e0f35bcedf2058d0b4ca15bea92401d6 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 09:24:08 +0300 Subject: [PATCH 05/13] add low power weather station example --- examples/dps310_low_power_weather_station.py | 28 ++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 examples/dps310_low_power_weather_station.py diff --git a/examples/dps310_low_power_weather_station.py b/examples/dps310_low_power_weather_station.py new file mode 100644 index 0000000..6ab9205 --- /dev/null +++ b/examples/dps310_low_power_weather_station.py @@ -0,0 +1,28 @@ +# configure the sensor for continuous measurement for a +# low power weather station as recommended in the datasheet: +# https://www.infineon.com/dgdl/Infineon-DPS310-DS-v01_00-EN.pdf) + +import time +import board +import busio +import adafruit_dps310 + +i2c = busio.I2C(board.SCL, board.SDA) + +dps310 = adafruit_dps310.DPS310(i2c) + +dps310.reset() +dps310.pressure_oversample_count = SampleCount.COUNT_2 +dps310.pressure_rate = Rate.RATE_1_HZ +dps310.temperature_oversample_count = SampleCount.COUNT_16 +dps310.temperature_rate = Rate.RATE_1_HZ +dps310.mode = Mode.CONT_PRESTEMP +dps310.wait_temperature_ready() +dps310.wait_pressure_ready() + +while True: + print("Temperature = %.2f *C" % dps310.temperature) + print("Pressure = %.2f hPa" % dps310.pressure) + print("") + time.sleep(10.0) + From 85e178bbcd49c3b480fb6718fb90a51cac963146 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Sat, 9 May 2020 09:53:51 +0300 Subject: [PATCH 06/13] add mode test to wait_{pressure,temperature}_ready to avoid infinite wait --- adafruit_dps310.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index a93c749..8ced8d6 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -315,8 +315,14 @@ def temperature_ready(self): return self._temp_ready def wait_temperature_ready(self): - while (self._temp_ready is False): - sleep(0.001) + """Wait until a temperature measurement is available""" + if self._mode_bits == Mode.IDLE \ + or self._mode_bits == Mode.ONE_PRESSURE \ + or self._mode_bits == Mode.CONT_PRESSURE: + raise RuntimeError("Sensor mode is set to idle or pressure measurement, can't wait for a temperature measurement") + else: + while (self._temp_ready is False): + sleep(0.001) @property def pressure_ready(self): @@ -324,8 +330,14 @@ def pressure_ready(self): return self._pressure_ready def wait_pressure_ready(self): - while (self._pressure_ready is False): - sleep(0.001) + """Wait until a pressure measurement is available""" + if self._mode_bits == Mode.IDLE \ + or self._mode_bits == Mode.ONE_TEMPERATURE \ + or self._mode_bits == Mode.CONT_TEMP: + raise RuntimeError("Sensor mode is set to idle or temperature measurement, can't wait for a pressure measurement") + else: + while (self._pressure_ready is False): + sleep(0.001) @property def mode(self): From f30cee1a41d3cee5ae91d739d9eca7a3c4237488 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Tue, 12 May 2020 08:02:43 +0300 Subject: [PATCH 07/13] pylint fixes --- adafruit_dps310.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 8ced8d6..3e26a1f 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -203,8 +203,8 @@ class DPS310: _calib_coeff_temp_src_bit = ROBit(_DPS310_TMPCOEFSRCE, 7) - _reg0E = RWBits(8, 0x0E, 0) - _reg0F = RWBits(8, 0x0F, 0) + _reg0e = RWBits(8, 0x0E, 0) + _reg0f = RWBits(8, 0x0F, 0) _reg62 = RWBits(8, 0x62, 0) def __init__(self, i2c_bus, address=_DPS310_DEFAULT_ADDRESS): @@ -256,16 +256,16 @@ def initialize(self): # similar to DpsClass::correctTemp(void) from infineon's c++ library def _correct_temp(self): """Correct temperature readings on ICs with a fuse bit problem""" - self._reg0E = 0xA5 - self._reg0F = 0x96 + self._reg0e = 0xA5 + self._reg0f = 0x96 self._reg62 = 0x02 - self._reg0E = 0 - self._reg0F = 0 + self._reg0e = 0 + self._reg0f = 0 # perform a temperature measurement # the most recent temperature will be saved internally # and used for compensation when calculating pressure - unused = self._raw_temperature + _unused = self._raw_temperature def reset(self): """Reset the sensor""" @@ -319,10 +319,10 @@ def wait_temperature_ready(self): if self._mode_bits == Mode.IDLE \ or self._mode_bits == Mode.ONE_PRESSURE \ or self._mode_bits == Mode.CONT_PRESSURE: - raise RuntimeError("Sensor mode is set to idle or pressure measurement, can't wait for a temperature measurement") - else: - while (self._temp_ready is False): - sleep(0.001) + raise RuntimeError("Sensor mode is set to idle or pressure measurement,\ + can't wait for a temperature measurement") + while self._temp_ready is False: + sleep(0.001) @property def pressure_ready(self): @@ -334,10 +334,10 @@ def wait_pressure_ready(self): if self._mode_bits == Mode.IDLE \ or self._mode_bits == Mode.ONE_TEMPERATURE \ or self._mode_bits == Mode.CONT_TEMP: - raise RuntimeError("Sensor mode is set to idle or temperature measurement, can't wait for a pressure measurement") - else: - while (self._pressure_ready is False): - sleep(0.001) + raise RuntimeError("Sensor mode is set to idle or temperature measurement,\ + can't wait for a pressure measurement") + while self._pressure_ready is False: + sleep(0.001) @property def mode(self): From 178a0cfdb2ac4ea519d3431f34d4f9b1fe64fe90 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Tue, 12 May 2020 08:20:42 +0300 Subject: [PATCH 08/13] pylint/black fixes --- adafruit_dps310.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 3e26a1f..2d47d5b 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -316,11 +316,15 @@ def temperature_ready(self): def wait_temperature_ready(self): """Wait until a temperature measurement is available""" - if self._mode_bits == Mode.IDLE \ - or self._mode_bits == Mode.ONE_PRESSURE \ - or self._mode_bits == Mode.CONT_PRESSURE: - raise RuntimeError("Sensor mode is set to idle or pressure measurement,\ - can't wait for a temperature measurement") + if ( + self._mode_bits == Mode.IDLE + or self._mode_bits == Mode.ONE_PRESSURE + or self._mode_bits == Mode.CONT_PRESSURE + ): + raise RuntimeError( + "Sensor mode is set to idle or pressure measurement,\ + can't wait for a temperature measurement" + ) while self._temp_ready is False: sleep(0.001) @@ -331,11 +335,15 @@ def pressure_ready(self): def wait_pressure_ready(self): """Wait until a pressure measurement is available""" - if self._mode_bits == Mode.IDLE \ - or self._mode_bits == Mode.ONE_TEMPERATURE \ - or self._mode_bits == Mode.CONT_TEMP: - raise RuntimeError("Sensor mode is set to idle or temperature measurement,\ - can't wait for a pressure measurement") + if ( + self._mode_bits == Mode.IDLE + or self._mode_bits == Mode.ONE_TEMPERATURE + or self._mode_bits == Mode.CONT_TEMP + ): + raise RuntimeError( + "Sensor mode is set to idle or temperature measurement,\ + can't wait for a pressure measurement" + ) while self._pressure_ready is False: sleep(0.001) From 5ab5e920a79fdaf3d2fde5d19f22da638f6141d1 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Tue, 12 May 2020 08:30:25 +0300 Subject: [PATCH 09/13] pylint/black fix (remove trailing new line) --- examples/dps310_low_power_weather_station.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/dps310_low_power_weather_station.py b/examples/dps310_low_power_weather_station.py index 6ab9205..80944a2 100644 --- a/examples/dps310_low_power_weather_station.py +++ b/examples/dps310_low_power_weather_station.py @@ -25,4 +25,3 @@ print("Pressure = %.2f hPa" % dps310.pressure) print("") time.sleep(10.0) - From 43e0e072acf0270d1296dd6236503ada5fcf4aa6 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Tue, 12 May 2020 08:59:21 +0300 Subject: [PATCH 10/13] pylint: disable no-member for dynamically generated values --- README.rst | 6 +++--- examples/dps310_low_power_weather_station.py | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index ce0baec..f9fb794 100644 --- a/README.rst +++ b/README.rst @@ -78,9 +78,9 @@ Caveat: by default the library initializes the IC with constant temperature and .. code-block:: python3 dps310.reset() - dps310.pressure_oversample_count = SampleCount.COUNT_2 - dps310.pressure_rate = Rate.RATE_1_HZ - dps310.mode = Mode.CONT_PRESSURE + dps310.pressure_oversample_count = adafruit_dps310.SampleCount.COUNT_2 + dps310.pressure_rate = adafruit_dps310.Rate.RATE_1_HZ + dps310.mode = adafruit_dps310.Mode.CONT_PRESSURE dps310.wait_pressure_ready() diff --git a/examples/dps310_low_power_weather_station.py b/examples/dps310_low_power_weather_station.py index 80944a2..b17edb9 100644 --- a/examples/dps310_low_power_weather_station.py +++ b/examples/dps310_low_power_weather_station.py @@ -2,6 +2,10 @@ # low power weather station as recommended in the datasheet: # https://www.infineon.com/dgdl/Infineon-DPS310-DS-v01_00-EN.pdf) +# (disable pylint warnings for adafruit_dps310.{SampleCount,Rate,Mode}.* +# as they are generated dynamically) +# pylint: disable=no-member + import time import board import busio @@ -12,11 +16,11 @@ dps310 = adafruit_dps310.DPS310(i2c) dps310.reset() -dps310.pressure_oversample_count = SampleCount.COUNT_2 -dps310.pressure_rate = Rate.RATE_1_HZ -dps310.temperature_oversample_count = SampleCount.COUNT_16 -dps310.temperature_rate = Rate.RATE_1_HZ -dps310.mode = Mode.CONT_PRESTEMP +dps310.pressure_oversample_count = adafruit_dps310.SampleCount.COUNT_2 +dps310.pressure_rate = adafruit_dps310.Rate.RATE_1_HZ +dps310.temperature_oversample_count = adafruit_dps310.SampleCount.COUNT_16 +dps310.temperature_rate = adafruit_dps310.Rate.RATE_1_HZ +dps310.mode = adafruit_dps310.Mode.CONT_PRESTEMP dps310.wait_temperature_ready() dps310.wait_pressure_ready() From d76bd2f3c12980ea9aec7f7c78350c4d3c2b13aa Mon Sep 17 00:00:00 2001 From: taradiddles Date: Wed, 13 May 2020 07:31:57 +0300 Subject: [PATCH 11/13] add docstrings for the `wait_nnn_ready` methods about which modes are supported --- adafruit_dps310.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 2d47d5b..774b6e7 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -315,7 +315,13 @@ def temperature_ready(self): return self._temp_ready def wait_temperature_ready(self): - """Wait until a temperature measurement is available""" + """Wait until a temperature measurement is available. + + To avoid waiting indefinitely this function raises an + error if the sensor isn't configured for temperate measurements, + ie. `Mode.ONE_TEMPERATURE`, `Mode.CONT_TEMP` or `Mode.CONT_PRESTEMP`. + See the `Mode` documentation for details. + """ if ( self._mode_bits == Mode.IDLE or self._mode_bits == Mode.ONE_PRESSURE @@ -334,7 +340,13 @@ def pressure_ready(self): return self._pressure_ready def wait_pressure_ready(self): - """Wait until a pressure measurement is available""" + """Wait until a pressure measurement is available + + To avoid waiting indefinitely this function raises an + error if the sensor isn't configured for pressure measurements, + ie. `Mode.ONE_PRESSURE`, `Mode.CONT_PRESSURE` or `Mode.CONT_PRESTEMP` + See the `Mode` documentation for details. + """ if ( self._mode_bits == Mode.IDLE or self._mode_bits == Mode.ONE_TEMPERATURE From 631dfa3c1961793122ad476550c0f5a582c3de64 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Wed, 13 May 2020 07:32:40 +0300 Subject: [PATCH 12/13] convert comments into docstring --- examples/dps310_low_power_weather_station.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/dps310_low_power_weather_station.py b/examples/dps310_low_power_weather_station.py index b17edb9..41ca3b3 100644 --- a/examples/dps310_low_power_weather_station.py +++ b/examples/dps310_low_power_weather_station.py @@ -1,6 +1,9 @@ -# configure the sensor for continuous measurement for a -# low power weather station as recommended in the datasheet: -# https://www.infineon.com/dgdl/Infineon-DPS310-DS-v01_00-EN.pdf) +""" +Configure the sensor for continuous measurement with rates, +sampling counts and mode optmized for low power, as recommended +in Infineon's datasheet: +https://www.infineon.com/dgdl/Infineon-DPS310-DS-v01_00-EN.pdf +""" # (disable pylint warnings for adafruit_dps310.{SampleCount,Rate,Mode}.* # as they are generated dynamically) From 59631d72c4fa6faede39b845960796cc7a949239 Mon Sep 17 00:00:00 2001 From: taradiddles Date: Wed, 13 May 2020 08:22:56 +0300 Subject: [PATCH 13/13] docstring/wait_nnn_read: single backticks to double backticks --- adafruit_dps310.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_dps310.py b/adafruit_dps310.py index 774b6e7..222506f 100644 --- a/adafruit_dps310.py +++ b/adafruit_dps310.py @@ -319,7 +319,7 @@ def wait_temperature_ready(self): To avoid waiting indefinitely this function raises an error if the sensor isn't configured for temperate measurements, - ie. `Mode.ONE_TEMPERATURE`, `Mode.CONT_TEMP` or `Mode.CONT_PRESTEMP`. + ie. ``Mode.ONE_TEMPERATURE``, ``Mode.CONT_TEMP`` or ``Mode.CONT_PRESTEMP``. See the `Mode` documentation for details. """ if ( @@ -344,7 +344,7 @@ def wait_pressure_ready(self): To avoid waiting indefinitely this function raises an error if the sensor isn't configured for pressure measurements, - ie. `Mode.ONE_PRESSURE`, `Mode.CONT_PRESSURE` or `Mode.CONT_PRESTEMP` + ie. ``Mode.ONE_PRESSURE``, ``Mode.CONT_PRESSURE`` or ``Mode.CONT_PRESTEMP`` See the `Mode` documentation for details. """ if (