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
	
	 Phil Howard
						Phil Howard