mirror of
https://github.com/KevinMidboe/python-gpiozero.git
synced 2025-10-29 17:50:37 +00:00
Merge pull request #16 from waveform80/when-light-when-dark
When light when dark
This commit is contained in:
@@ -154,13 +154,17 @@ while True:
|
||||
Retrieve light sensor value:
|
||||
|
||||
```python
|
||||
from time import sleep
|
||||
from gpiozero import LightSensor
|
||||
|
||||
light = LightSensor(6)
|
||||
sensor = LightSensor(18)
|
||||
led = LED(16)
|
||||
|
||||
sensor.when_dark = led.on
|
||||
sensor.when_light = led.off
|
||||
|
||||
while True:
|
||||
if light.light_detected:
|
||||
print("Light detected")
|
||||
sleep(1)
|
||||
```
|
||||
|
||||
### Temperature Sensor
|
||||
|
||||
@@ -28,18 +28,6 @@ class InputDevice(GPIODevice):
|
||||
def pull_up(self):
|
||||
return self._pull_up
|
||||
|
||||
def wait_for_input(self):
|
||||
GPIO.wait_for_edge(self.pin, self._edge)
|
||||
|
||||
def add_callback(self, callback=None, bouncetime=1000):
|
||||
if callback is None:
|
||||
raise InputDeviceError('No callback function given')
|
||||
self.remove_callback()
|
||||
GPIO.add_event_detect(self.pin, self._edge, callback, bouncetime)
|
||||
|
||||
def remove_callback(self):
|
||||
GPIO.remove_event_detect(self.pin)
|
||||
|
||||
|
||||
class Button(InputDevice):
|
||||
pass
|
||||
@@ -120,6 +108,11 @@ class LightSensor(InputDevice):
|
||||
self._queue = deque(maxlen=queue_len)
|
||||
self._queue_full = Event()
|
||||
self._queue_thread = GPIOThread(target=self._fill_queue)
|
||||
self._last_state = None
|
||||
self._when_light = None
|
||||
self._when_dark = None
|
||||
self._when_light_event = Event()
|
||||
self._when_dark_event = Event()
|
||||
self._queue_thread.start()
|
||||
|
||||
@property
|
||||
@@ -140,6 +133,27 @@ class LightSensor(InputDevice):
|
||||
def light_detected(self):
|
||||
return self.value > self.threshold
|
||||
|
||||
def _get_when_light(self):
|
||||
return self._when_light
|
||||
def _set_when_light(self, value):
|
||||
if not callable(value) and value is not None:
|
||||
raise InputDeviceError('when_light must be None or a function')
|
||||
self._when_light = value
|
||||
when_light = property(_get_when_light, _set_when_light)
|
||||
|
||||
def _get_when_dark(self):
|
||||
return self._when_dark
|
||||
def _set_when_dark(self, value):
|
||||
if not callable(value) and value is not None:
|
||||
raise InputDeviceError('when_dark must be None or a function')
|
||||
self._when_dark = value
|
||||
|
||||
def wait_for_light(self, timeout=None):
|
||||
self._when_light_event.wait(timeout)
|
||||
|
||||
def wait_for_dark(self, timeout=None):
|
||||
self._when_dark_event.wait(timeout)
|
||||
|
||||
def _get_darkness_time(self):
|
||||
return self._darkness_time
|
||||
def _set_darkness_time(self, value):
|
||||
@@ -164,9 +178,12 @@ class LightSensor(InputDevice):
|
||||
len(self._queue) < self._queue.maxlen
|
||||
):
|
||||
self._queue.append(self._time_charging())
|
||||
if self.partial:
|
||||
self._fire_events()
|
||||
self._queue_full.set()
|
||||
while not self._queue_thread.stopping.is_set():
|
||||
self._queue.append(self._time_charging())
|
||||
self._fire_events()
|
||||
finally:
|
||||
GPIO.remove_event_detect(self.pin)
|
||||
|
||||
@@ -182,6 +199,19 @@ class LightSensor(InputDevice):
|
||||
self._charged.wait(self.darkness_time)
|
||||
return min(self.darkness_time, time() - start)
|
||||
|
||||
def _fire_events(self):
|
||||
last_state = self._last_state
|
||||
self._last_state = state = self.light_detected
|
||||
if not last_state and state:
|
||||
self._when_dark_event.clear()
|
||||
self._when_light_event.set()
|
||||
if self.when_light:
|
||||
self.when_light()
|
||||
elif last_state and not state:
|
||||
self._when_light_event.clear()
|
||||
self._when_dark_event.set()
|
||||
if self.when_dark:
|
||||
self.when_dark()
|
||||
|
||||
class TemperatureSensor(W1ThermSensor):
|
||||
@property
|
||||
|
||||
Reference in New Issue
Block a user