From 605d6fdc47b771f2e32251f921e54a71240a740c Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 21 May 2020 11:43:40 +0100 Subject: [PATCH] Re-index channels from 1 --- examples/display.py | 34 +++++++++++++++++++++++++++++----- library/grow/moisture.py | 7 ++++--- library/grow/pump.py | 18 ++++++++++++++---- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/examples/display.py b/examples/display.py index 1f2c515..c04d917 100644 --- a/examples/display.py +++ b/examples/display.py @@ -6,6 +6,9 @@ from PIL import Image, ImageDraw, ImageFont from fonts.ttf import RobotoMedium as UserFont import RPi.GPIO as GPIO +from grow.moisture import Moisture +from grow.pump import Pump + GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) @@ -15,6 +18,18 @@ LABELS = ['A', 'B', 'X', 'Y'] channel_count = 3 channel_selected = 0 +sensors = [ + Moisture(channel=1), + Moisture(channel=2), + Moisture(channel=3) +] + +pumps = [ + Pump(channel=1), + Pump(channel=2), + Pump(channel=3) +] + GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) font = ImageFont.truetype(UserFont, 14) @@ -37,7 +52,7 @@ display = ST7735.ST7735( dc=9, backlight=12, rotation=270, - spi_speed_hz=10000000 + spi_speed_hz=80000000 ) ramp = [ @@ -58,6 +73,11 @@ ramp_sat = [ def indicator_color(value, r=None): if r is None: r = ramp + if value == 1.0: + return r[-1] + if value == 0.0: + return r[0] + value *= len(r) - 1 a = int(math.floor(value)) b = a + 1 @@ -116,9 +136,13 @@ picked = random.sample(plants, 3) while True: t = time.time() / 10.0 - c1 = (math.sin(math.pi + t * math.pi) + 1.0) / 2.0 - c2 = (math.sin(t * math.pi) + 1.0) / 2.0 - c3 = (math.sin(math.pi + t * math.pi) + 1.0) / 2.0 + #c1 = (math.sin(math.pi + t * math.pi) + 1.0) / 2.0 + #c2 = (math.sin(t * math.pi) + 1.0) / 2.0 + #c3 = (math.sin(math.pi + t * math.pi) + 1.0) / 2.0 + c1 = 1.0 - sensors[0].saturation + c2 = 1.0 - sensors[1].saturation + c3 = 1.0 - sensors[2].saturation + print(c1, c2, c3) draw.rectangle((21, 0, 138, HEIGHT), (255, 255, 255)) # Erase channel area @@ -156,4 +180,4 @@ while True: icon(image, icon_snooze, (0, HEIGHT - 20), (r, 129, 129)) display.display(image.convert("RGB")) - time.sleep(1.0 / 30) + time.sleep(1.0 / 5) diff --git a/library/grow/moisture.py b/library/grow/moisture.py index e226079..c912747 100644 --- a/library/grow/moisture.py +++ b/library/grow/moisture.py @@ -10,19 +10,19 @@ MOISTURE_INT_PIN = 4 class Moisture(object): """Grow moisture sensor driver.""" - def __init__(self, channel=0, wet_point=None, dry_point=None): + def __init__(self, channel=1, wet_point=None, dry_point=None): """Create a new moisture sensor. Uses an interrupt to count pulses on the GPIO pin corresponding to the selected channel. The moisture reading is given as pulses per second. - :param channel: One of 0, 1 or 2. 3 can optionally be used to set up a sensor on the Int pin (BCM4) + :param channel: One of 1, 2 or 3. 4 can optionally be used to set up a sensor on the Int pin (BCM4) :param wet_point: Wet point in pulses/sec :param dry_point: Dry point in pulses/sec """ - self._gpio_pin = [MOISTURE_1_PIN, MOISTURE_2_PIN, MOISTURE_3_PIN, MOISTURE_INT_PIN][channel] + self._gpio_pin = [MOISTURE_1_PIN, MOISTURE_2_PIN, MOISTURE_3_PIN, MOISTURE_INT_PIN][channel - 1] GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) @@ -30,6 +30,7 @@ class Moisture(object): self._count = 0 self._reading = 0 + self._new_data = False self._wet_point = wet_point if wet_point is not None else 100 self._dry_point = dry_point if dry_point is not None else 900 self._time_start = time.time() diff --git a/library/grow/pump.py b/library/grow/pump.py index 8973e1b..ddcf734 100644 --- a/library/grow/pump.py +++ b/library/grow/pump.py @@ -7,12 +7,22 @@ PUMP_1_PIN = 17 PUMP_2_PIN = 27 PUMP_3_PIN = 22 PUMP_PWM_FREQ = 10000 -PUMP_MAX_DUTY = 60 +PUMP_MAX_DUTY = 90 class Pump(object): - def __init__(self, channel): - self._gpio_pin = [PUMP_1_PIN, PUMP_2_PIN, PUMP_3_PIN][channel] + """Grow pump driver.""" + + def __init__(self, channel=1): + """Create a new pump. + + Uses soft PWM to drive a Grow pump. + + :param channel: One of 1, 2 or 3. + + """ + + self._gpio_pin = [PUMP_1_PIN, PUMP_2_PIN, PUMP_3_PIN][channel - 1] GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) @@ -37,7 +47,7 @@ class Pump(object): """Stop the pump.""" self.set_speed(0) - def pulse(self, speed, timeout=0.1, blocking=True, force=False): + def dose(self, speed, timeout=0.1, blocking=True, force=False): """Pulse the pump for timeout seconds. :param timeout: Timeout, in seconds, of the pump pulse