diff --git a/adafruit_ds18x20.py b/adafruit_ds18x20.py index f1494b2..6dd0111 100644 --- a/adafruit_ds18x20.py +++ b/adafruit_ds18x20.py @@ -40,6 +40,8 @@ _WR_SCRATCH = b'\x4E' _CONVERSION_TIMEOUT = const(1) RESOLUTION = (9, 10, 11, 12) +# Maximum conversion delay in seconds, from DS18B20 datasheet. +_CONVERSION_DELAY = {9:0.09375, 10:0.1875, 11:0.375, 12:0.750} class DS18X20(object): """Class which provides interface to DS18X20 temperature sensor.""" @@ -49,6 +51,7 @@ def __init__(self, bus, address): self._address = address self._device = OneWireDevice(bus, address) self._buf = bytearray(9) + self._conv_delay = _CONVERSION_DELAY[12] # pessimistic default else: raise ValueError('Incorrect family code in device address.') @@ -111,3 +114,15 @@ def _write_scratch(self, buf): with self._device as dev: dev.write(_WR_SCRATCH) dev.write(buf, end=3) + + def start_temperature_read(self): + """Start asynchronous conversion, returns immediately. + Returns maximum conversion delay [seconds] based on resolution.""" + with self._device as dev: + dev.write(_CONVERT) + return _CONVERSION_DELAY[self.resolution] + + def read_temperature(self): + """Read the temperature. No polling of the conversion busy bit + (assumes that the conversion has completed).""" + return self._read_temp() diff --git a/docs/examples.rst b/docs/examples.rst index ca75b12..f7315c1 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,8 +1,12 @@ Simple test ------------ -Ensure your device works with this simple test. +Ensure your device works with these simple tests. .. literalinclude:: ../examples/ds18x20_simpletest.py :caption: examples/ds18x20_simpletest.py :linenos: + +.. literalinclude:: ../examples/ds18x20_asynctest.py + :caption: examples/ds18x20_asynctest.py + :linenos: diff --git a/examples/ds18x20_asynctest.py b/examples/ds18x20_asynctest.py new file mode 100644 index 0000000..c066fe9 --- /dev/null +++ b/examples/ds18x20_asynctest.py @@ -0,0 +1,31 @@ +# Simple demo of printing the temperature from the first found DS18x20 sensor every second. +# Using the asynchronous functions start_temperature_read() and +# read_temperature() to allow the main loop to keep processing while +# the conversion is in progress. +# Author: Louis Bertrand, based on original by Tony DiCola + +import time + +import board + +from adafruit_onewire.bus import OneWireBus +from adafruit_ds18x20 import DS18X20 + + +# Initialize one-wire bus on board pin D1. +ow_bus = OneWireBus(board.D1) + +# Scan for sensors and grab the first one found. +ds18 = DS18X20(ow_bus, ow_bus.scan()[0]) +ds18.resolution = 12 + +# Main loop to print the temperature every second. +while True: + conversion_delay = ds18.start_temperature_read() + conversion_ready_at = time.monotonic() + conversion_delay + print("waiting", end="") + while time.monotonic() < conversion_ready_at: + print(".", end="") + time.sleep(0.1) + print('\nTemperature: {0:0.3f}C\n'.format(ds18.read_temperature())) + time.sleep(1.0)