Skip to content

Add asynchhronous functions #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 7, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)