#!/usr/bin/env python3 import time import colorsys import sys import ST7735 from grow import moisture from grow import pump from subprocess import PIPE, Popen from PIL import Image from PIL import ImageDraw from PIL import ImageFont from fonts.ttf import RobotoMedium as UserFont import logging logging.basicConfig( format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') logging.info("""all-in-one.py - Displays readings from all of Grow HAT Mini's moisture sensors Press Ctrl+C to exit! """) # Create ST7735 LCD display class st7735 = ST7735.ST7735( port=0, cs=1, dc=9, backlight=12, rotation=270, spi_speed_hz=10000000 ) # Initialize display st7735.begin() WIDTH = st7735.width HEIGHT = st7735.height # Set up canvas and font img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) font_size = 20 font = ImageFont.truetype(UserFont, font_size) message = "" # The position of the top bar top_pos = 25 # Displays data and text on the 0.96" LCD def display_text(variable, data, unit): # Maintain length of list values[variable] = values[variable][1:] + [data] # Scale the values for the variable between 0 and 1 vmin = min(values[variable]) vmax = max(values[variable]) colours = [(v - vmin + 1) / (vmax - vmin + 1) for v in values[variable]] # Format the variable name and value message = "{}: {:.1f} {}".format(variable[:4], data, unit) logging.info(message) draw.rectangle((0, 0, WIDTH, HEIGHT), (255, 255, 255)) for i in range(len(colours)): # Convert the values to colours from red to blue colour = (1.0 - colours[i]) * 0.6 r, g, b = [int(x * 255.0) for x in colorsys.hsv_to_rgb(colour, 1.0, 1.0)] # Draw a 1-pixel wide rectangle of colour draw.rectangle((i, top_pos, i + 1, HEIGHT), (r, g, b)) # Draw a line graph in black line_y = HEIGHT - (top_pos + (colours[i] * (HEIGHT - top_pos))) + top_pos draw.rectangle((i, line_y, i + 1, line_y + 1), (0, 0, 0)) # Write the text at the top in black draw.text((0, 0), message, font=font, fill=(0, 0, 0)) st7735.display(img) # Get the temperature of the CPU for compensation def get_cpu_temperature(): process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE, universal_newlines=True) output, _error = process.communicate() return float(output[output.index('=') + 1:output.rindex("'")]) # Tuning factor for compensation. Decrease this number to adjust the # temperature down, and increase to adjust up factor = 2.25 cpu_temps = [get_cpu_temperature()] * 5 delay = 0.5 # Debounce the proximity tap mode = 0 # The starting mode last_page = 0 light = 1 # Create a values dict to store the data variables = ["moisture1", "moisture2", "moisture3", "pump1", "pump2", "pump3"] values = {} for v in variables: values[v] = [1] * WIDTH # The main loop try: while True: data = moisture.read_all() display_text(variables[mode], data, unit) time.sleep(delay) # Exit cleanly except KeyboardInterrupt: sys.exit(0)