kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Tufty 2040: Vector examples.
Add AdvRe.af for PicoW Explorer and Tufty 2040 spectrometer examples.patch-tufty2040-vector
rodzic
a334899b61
commit
c725b4eee0
Plik binarny nie jest wyświetlany.
|
@ -5,7 +5,6 @@ from breakout_as7262 import BreakoutAS7262
|
|||
from picographics import PicoGraphics, DISPLAY_PICO_W_EXPLORER, PEN_RGB332
|
||||
from picovector import PicoVector, Polygon, RegularPolygon, ANTIALIAS_X4
|
||||
|
||||
PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5}
|
||||
PINS_PICO_EXPLORER = {"sda": 20, "scl": 21}
|
||||
i2c = PimoroniI2C(**PINS_PICO_EXPLORER)
|
||||
|
||||
|
@ -25,7 +24,7 @@ display.set_backlight(0.8)
|
|||
vector = PicoVector(display)
|
||||
vector.set_antialiasing(ANTIALIAS_X4)
|
||||
|
||||
# Load an Alright Font
|
||||
# Load an Alright Font, find this in common/AdvRe.af
|
||||
result = vector.set_font("/AdvRe.af", 30)
|
||||
|
||||
WIDTH, HEIGHT = display.get_bounds()
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
import time
|
||||
import gc
|
||||
|
||||
from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332
|
||||
from picovector import PicoVector, Polygon, RegularPolygon, Rectangle, ANTIALIAS_X4
|
||||
|
||||
|
||||
display = PicoGraphics(DISPLAY_TUFTY_2040, pen_type=PEN_RGB332)
|
||||
|
||||
vector = PicoVector(display)
|
||||
vector.set_antialiasing(ANTIALIAS_X4)
|
||||
|
||||
RED = display.create_pen(200, 0, 0)
|
||||
BLACK = display.create_pen(0, 0, 0)
|
||||
GREY = display.create_pen(200, 200, 200)
|
||||
WHITE = display.create_pen(255, 255, 255)
|
||||
|
||||
"""
|
||||
# Redefine colours for a Blue clock
|
||||
RED = display.create_pen(200, 0, 0)
|
||||
BLACK = display.create_pen(135, 159, 169)
|
||||
GREY = display.create_pen(10, 40, 50)
|
||||
WHITE = display.create_pen(14, 60, 76)
|
||||
"""
|
||||
|
||||
WIDTH, HEIGHT = display.get_bounds()
|
||||
|
||||
hub = RegularPolygon(int(WIDTH / 2), int(HEIGHT / 2), 24, 5)
|
||||
|
||||
face = RegularPolygon(int(WIDTH / 2), int(HEIGHT / 2), 48, int(HEIGHT / 2))
|
||||
|
||||
print(time.localtime())
|
||||
|
||||
last_second = None
|
||||
|
||||
while True:
|
||||
t_start = time.ticks_ms()
|
||||
year, month, day, hour, minute, second, _, _ = time.localtime()
|
||||
|
||||
if last_second == second:
|
||||
continue
|
||||
|
||||
last_second = second
|
||||
|
||||
display.set_pen(0)
|
||||
display.clear()
|
||||
|
||||
display.set_pen(BLACK)
|
||||
display.circle(int(WIDTH / 2), int(HEIGHT / 2), int(HEIGHT / 2))
|
||||
display.set_pen(WHITE)
|
||||
display.circle(int(WIDTH / 2), int(HEIGHT / 2), int(HEIGHT / 2) - 4)
|
||||
|
||||
display.set_pen(GREY)
|
||||
|
||||
for a in range(60):
|
||||
tick_mark = Rectangle(int(WIDTH / 2) - 3, 10, 6, int(HEIGHT / 48))
|
||||
vector.rotate(tick_mark, 360 / 60.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
|
||||
vector.translate(tick_mark, 0, 2)
|
||||
vector.draw(tick_mark)
|
||||
|
||||
for a in range(12):
|
||||
hour_mark = Rectangle(int(WIDTH / 2) - 5, 10, 10, int(HEIGHT / 10))
|
||||
vector.rotate(hour_mark, 360 / 12.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
|
||||
vector.translate(hour_mark, 0, 2)
|
||||
vector.draw(hour_mark)
|
||||
|
||||
angle_second = second * 6
|
||||
second_hand_length = int(HEIGHT / 2) - int(HEIGHT / 8)
|
||||
second_hand = Polygon((-2, -second_hand_length), (-2, int(HEIGHT / 8)), (2, int(HEIGHT / 8)), (2, -second_hand_length))
|
||||
vector.rotate(second_hand, angle_second, 0, 0)
|
||||
vector.translate(second_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)
|
||||
|
||||
angle_minute = minute * 6
|
||||
angle_minute += second / 10.0
|
||||
minute_hand_length = int(HEIGHT / 2) - int(HEIGHT / 24)
|
||||
minute_hand = Polygon((-5, -minute_hand_length), (-10, int(HEIGHT / 16)), (10, int(HEIGHT / 16)), (5, -minute_hand_length))
|
||||
vector.rotate(minute_hand, angle_minute, 0, 0)
|
||||
vector.translate(minute_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)
|
||||
|
||||
angle_hour = (hour % 12) * 30
|
||||
angle_hour += minute / 2
|
||||
hour_hand_length = int(HEIGHT / 2) - int(HEIGHT / 8)
|
||||
hour_hand = Polygon((-5, -hour_hand_length), (-10, int(HEIGHT / 16)), (10, int(HEIGHT / 16)), (5, -hour_hand_length))
|
||||
vector.rotate(hour_hand, angle_hour, 0, 0)
|
||||
vector.translate(hour_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)
|
||||
|
||||
display.set_pen(GREY)
|
||||
|
||||
vector.draw(minute_hand)
|
||||
vector.draw(hour_hand)
|
||||
vector.draw(second_hand)
|
||||
|
||||
display.set_pen(BLACK)
|
||||
|
||||
for a in range(60):
|
||||
tick_mark = Rectangle(int(WIDTH / 2) - 3, 10, 6, int(HEIGHT / 48))
|
||||
vector.rotate(tick_mark, 360 / 60.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
|
||||
vector.draw(tick_mark)
|
||||
|
||||
for a in range(12):
|
||||
hour_mark = Rectangle(int(WIDTH / 2) - 5, 10, 10, int(HEIGHT / 10))
|
||||
vector.rotate(hour_mark, 360 / 12.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
|
||||
vector.draw(hour_mark)
|
||||
|
||||
vector.translate(minute_hand, 0, -5)
|
||||
vector.translate(hour_hand, 0, -5)
|
||||
vector.draw(minute_hand)
|
||||
vector.draw(hour_hand)
|
||||
|
||||
display.set_pen(RED)
|
||||
vector.translate(second_hand, 0, -5)
|
||||
vector.draw(second_hand)
|
||||
vector.draw(hub)
|
||||
|
||||
display.update()
|
||||
gc.collect()
|
||||
|
||||
t_end = time.ticks_ms()
|
||||
print(f"Took {t_end - t_start}ms")
|
|
@ -0,0 +1,118 @@
|
|||
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)
|
Ładowanie…
Reference in New Issue