pimoroni-pico/micropython/examples/tufty2040/vector_spectrometer.py

119 wiersze
3.4 KiB
Python

import math
import time
from pimoroni_i2c import PimoroniI2C
from breakout_as7262 import BreakoutAS7262
from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332
from picovector import PicoVector, Polygon, RegularPolygon, ANTIALIAS_X4
PINS_TUFTY_2040 = {"sda": 4, "scl": 5}
i2c = PimoroniI2C(**PINS_TUFTY_2040)
# Set up the AS7262 Spectrometer
as7262 = BreakoutAS7262(i2c)
as7262.set_gain(BreakoutAS7262.X16)
as7262.set_measurement_mode(BreakoutAS7262.CONT_ROYGBR)
as7262.set_illumination_current(BreakoutAS7262.MA12)
as7262.set_indicator_current(BreakoutAS7262.MA4)
as7262.set_leds(True, True)
# Set up the display
display = PicoGraphics(DISPLAY_TUFTY_2040, pen_type=PEN_RGB332)
display.set_backlight(0.8)
# Set up PicoVector
vector = PicoVector(display)
vector.set_antialiasing(ANTIALIAS_X4)
# Load an Alright Font, find this in common/AdvRe.af
result = vector.set_font("/AdvRe.af", 30)
WIDTH, HEIGHT = display.get_bounds()
CENTER_X = int(WIDTH / 2)
CENTER_Y = int(HEIGHT / 2)
RADIUS = 90
DEBUG = False
RED = display.create_pen(255, 0, 0)
ORANGE = display.create_pen(255, 128, 0)
YELLOW = display.create_pen(255, 255, 0)
GREEN = display.create_pen(0, 255, 0)
BLUE = display.create_pen(0, 0, 255)
VIOLET = display.create_pen(255, 0, 255)
BLACK = display.create_pen(0, 0, 0)
GREY = display.create_pen(128, 128, 128)
WHITE = display.create_pen(255, 255, 255)
LABELS = ["R", "O", "Y", "G", "B", "V"]
COLS = [RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET]
# Custom regular_polygon function to give each point its own "radius"
def regular_polygon(o_x, o_y, radius, rotation):
sides = 6
angle = math.radians(360 / sides)
rotation = math.radians(rotation)
points = []
for side in range(sides):
current_angle = side * angle + rotation
x = math.cos(current_angle) * radius[side]
y = math.sin(current_angle) * radius[side]
points.append((int(x) + o_x, int(y) + o_y))
return points
lines = RegularPolygon(CENTER_X, CENTER_Y, 6, RADIUS)
label_points = list(RegularPolygon(CENTER_X, CENTER_Y, 6, RADIUS * 0.7, -(360 / 12)))
while True:
# Clear to black
display.set_pen(BLACK)
display.clear()
# Add the title
display.set_pen(WHITE)
vector.text("Spectrograph", 5, -5)
# Get the spectrometer readings
reading = list(as7262.read())
# Print out the readings
if DEBUG:
for i in range(6):
print(f"{LABELS[i]}: {reading[i]:0.2f}", end=" ")
print("")
# Draw the lines separating each section
display.set_pen(GREY)
for (x, y) in lines:
display.line(CENTER_X, CENTER_Y, int(x), int(y))
# Scale readings for display
for i in range(6):
reading[i] = int(reading[i] / 3.0)
reading[i] = min(reading[i], RADIUS)
# Create a 6 point polygon with each points distance from the center
# scaled by the corresponding reading.
points = regular_polygon(CENTER_X, CENTER_Y, reading, 0)
# Split the polygon into six triangles, one for each channel
# draw each one, along with its corresponding label
point_a = points[-1]
for i in range(6):
point_b = points[i]
label_x, label_y = label_points[i]
display.set_pen(COLS[i])
vector.text(LABELS[i], int(label_x) - 5, int(label_y) - 20)
vector.draw(Polygon(point_a, point_b, (CENTER_X, CENTER_Y)))
point_a = point_b
display.update()
time.sleep(1.0 / 60)