Skip to content

Commit

Permalink
Merge pull request #12 from LBertrandDC/asynchronous-functions
Browse files Browse the repository at this point in the history
Add asynchhronous functions
  • Loading branch information
tannewt authored Aug 7, 2019
2 parents a035aa4 + 972f828 commit 711af84
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
15 changes: 15 additions & 0 deletions adafruit_ds18x20.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand All @@ -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.')

Expand Down Expand Up @@ -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()
6 changes: 5 additions & 1 deletion docs/examples.rst
Original file line number Diff line number Diff line change
@@ -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:
31 changes: 31 additions & 0 deletions examples/ds18x20_asynctest.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 711af84

Please sign in to comment.