generated from pimoroni/pga
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6aa09a8
commit 40d1d59
Showing
11 changed files
with
406 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
""" | ||
Reads an analog input connected to ADC0. | ||
Connect the middle pin of your potentiometer to ADC0, and the other two pins to 3.3V and GND. | ||
""" | ||
|
||
from explorer import Explorer2350 | ||
from machine import ADC | ||
import time | ||
|
||
board = Explorer2350() | ||
|
||
display = board.display | ||
|
||
# lets set up some pen colours to make drawing easier | ||
WHITE = display.create_pen(255, 255, 255) | ||
BLACK = display.create_pen(0, 0, 0) | ||
|
||
pot = ADC(0) | ||
|
||
# alternatively, you could specify the pin number like this: | ||
# pot = ADC(40) | ||
|
||
while True: | ||
display.set_pen(BLACK) | ||
display.clear() | ||
display.set_pen(WHITE) | ||
# read the potentiometer value, it's a number between 0 and 65535 which represents a voltage between 0v and 3.3v | ||
pot_value = pot.read_u16() | ||
display.text(f"{pot_value}", 0, 0, 320, 4) | ||
display.update() | ||
time.sleep(0.1) |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
""" | ||
Connect (up to) 3 external buttons to Explorer. | ||
We're connecting our yellow button to GPIO 0, a red button to GPIO 1 and a blue button to GPIO 3. The other side of each button should be wired to ground. | ||
Note that if you're using our square buttons, you should connect wires to two pins that are diagonally opposite each other. | ||
""" | ||
|
||
from machine import Pin | ||
import time | ||
from explorer import Explorer2350 | ||
|
||
board = Explorer2350() | ||
|
||
display = board.display | ||
|
||
yellow_button = Pin(0, Pin.IN, Pin.PULL_UP) | ||
blue_button = Pin(1, Pin.IN, Pin.PULL_UP) | ||
red_button = Pin(2, Pin.IN, Pin.PULL_UP) | ||
|
||
# lets set up some pen colours to make drawing easier | ||
WHITE = display.create_pen(255, 255, 255) | ||
BLACK = display.create_pen(0, 0, 0) | ||
YELLOW = display.create_pen(0, 255, 255) | ||
BLUE = display.create_pen(0, 0, 255) | ||
RED = display.create_pen(255, 0, 0) | ||
|
||
|
||
while True: | ||
display.set_pen(BLACK) | ||
display.clear() | ||
display.set_pen(WHITE) | ||
display.text("Wire up some buttons to GP0, GP1 and GP2, and push 'em!", 0, 0, 320, 4) | ||
# because we're using Pin.PULL_UP the logic is reversed - '0' is pushed and '1' is unpushed | ||
if yellow_button.value() == 0: | ||
display.set_pen(BLACK) | ||
display.clear() | ||
display.set_pen(YELLOW) | ||
display.text("Yellow button pushed", 0, 0, 320, 4) | ||
if blue_button.value() == 0: | ||
display.set_pen(BLACK) | ||
display.clear() | ||
display.set_pen(BLUE) | ||
display.text("Blue button pushed", 0, 0, 320, 4) | ||
if red_button.value() == 0: | ||
display.set_pen(BLACK) | ||
display.clear() | ||
display.set_pen(RED) | ||
display.text("Red button pushed", 0, 0, 320, 4) | ||
display.update() | ||
time.sleep(0.01) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
# Explorer boot menu/loader. | ||
|
||
import gc | ||
import time | ||
from os import listdir | ||
from picographics import PicoGraphics, DISPLAY_EXPLORER, PEN_RGB332 | ||
from machine import Pin | ||
|
||
|
||
def hsv_to_rgb(h: float, s: float, v: float) -> tuple[float, float, float]: | ||
if s == 0.0: | ||
return v, v, v | ||
i = int(h * 6.0) | ||
f = (h * 6.0) - i | ||
p = v * (1.0 - s) | ||
q = v * (1.0 - s * f) | ||
t = v * (1.0 - s * (1.0 - f)) | ||
v = int(v * 255) | ||
t = int(t * 255) | ||
p = int(p * 255) | ||
q = int(q * 255) | ||
i = i % 6 | ||
if i == 0: | ||
return v, t, p | ||
if i == 1: | ||
return q, v, p | ||
if i == 2: | ||
return p, v, t | ||
if i == 3: | ||
return p, q, v | ||
if i == 4: | ||
return t, p, v | ||
if i == 5: | ||
return v, p, q | ||
|
||
|
||
def get_applications() -> list[dict[str, str]]: | ||
# fetch a list of the applications that are stored in the filesystem | ||
applications = [] | ||
for file in listdir(): | ||
if file.endswith(".py") and file != "main.py": | ||
# convert the filename from "something_or_other.py" to "Something Or Other" | ||
# via weird incantations and a sprinkling of voodoo | ||
title = " ".join([v[:1].upper() + v[1:] for v in file[:-3].split("_")]) | ||
|
||
applications.append( | ||
{ | ||
"file": file, | ||
"title": title | ||
} | ||
) | ||
|
||
# sort the application list alphabetically by title and return the list | ||
return sorted(applications, key=lambda x: x["title"]) | ||
|
||
|
||
def prepare_for_launch() -> None: | ||
for k in locals().keys(): | ||
if k not in ("__name__", | ||
"application_file_to_launch", | ||
"gc"): | ||
del locals()[k] | ||
gc.collect() | ||
|
||
|
||
def menu() -> str: | ||
applications = get_applications() | ||
|
||
button_x = Pin(17, Pin.IN, Pin.PULL_UP) | ||
button_y = Pin(18, Pin.IN, Pin.PULL_UP) | ||
button_a = Pin(16, Pin.IN, Pin.PULL_UP) | ||
|
||
display = PicoGraphics(display=DISPLAY_EXPLORER, pen_type=PEN_RGB332) | ||
display.set_backlight(1.0) | ||
|
||
selected_item = 2 | ||
scroll_position = 2 | ||
target_scroll_position = 2 | ||
|
||
selected_pen = display.create_pen(255, 255, 255) | ||
unselected_pen = display.create_pen(80, 80, 100) | ||
background_pen = display.create_pen(50, 50, 70) | ||
shadow_pen = display.create_pen(0, 0, 0) | ||
|
||
while True: | ||
t = time.ticks_ms() / 1000.0 | ||
|
||
if button_x.value() == 0: | ||
target_scroll_position -= 1 | ||
target_scroll_position = target_scroll_position if target_scroll_position >= 0 else len(applications) - 1 | ||
time.sleep(0.05) | ||
|
||
if button_y.value() == 0: | ||
target_scroll_position += 1 | ||
target_scroll_position = target_scroll_position if target_scroll_position < len(applications) else 0 | ||
time.sleep(0.05) | ||
|
||
if button_a.value() == 0: | ||
time.sleep(0.05) | ||
|
||
return applications[selected_item]["file"] | ||
|
||
display.set_pen(background_pen) | ||
display.clear() | ||
|
||
scroll_position += (target_scroll_position - scroll_position) / 5 | ||
|
||
grid_size = 40 | ||
for y in range(0, 240 // grid_size): | ||
for x in range(0, 320 // grid_size): | ||
h = x + y + int(t * 5) | ||
h = h / 50.0 | ||
r, g, b = hsv_to_rgb(h, 0.5, 1) | ||
|
||
display.set_pen(display.create_pen(r, g, b)) | ||
display.rectangle(x * grid_size, y * grid_size, grid_size, grid_size) | ||
|
||
# work out which item is selected (closest to the current scroll position) | ||
selected_item = round(target_scroll_position) | ||
|
||
for list_index, application in enumerate(applications): | ||
distance = list_index - scroll_position | ||
|
||
text_size = 4 if selected_item == list_index else 3 | ||
|
||
# center text horixontally | ||
title_width = display.measure_text(application["title"], text_size) | ||
text_x = int(160 - title_width / 2) | ||
|
||
row_height = text_size * 5 + 20 | ||
|
||
# center list items vertically | ||
text_y = int(120 + distance * row_height - (row_height / 2)) | ||
|
||
# draw the text, selected item brightest and with shadow | ||
if selected_item == list_index: | ||
display.set_pen(shadow_pen) | ||
display.text(application["title"], text_x + 1, text_y + 1, -1, text_size) | ||
|
||
text_pen = selected_pen if selected_item == list_index else unselected_pen | ||
display.set_pen(text_pen) | ||
display.text(application["title"], text_x, text_y, -1, text_size) | ||
|
||
display.update() | ||
|
||
|
||
# The application we will be launching. This should be ouronly global, so we can | ||
# drop everything else. | ||
application_file_to_launch = menu() | ||
|
||
# Run whatever we've set up to. | ||
# If this fails, we'll exit the script and drop to the REPL, which is | ||
# fairly reasonable. | ||
prepare_for_launch() | ||
__import__(application_file_to_launch) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -55,4 +55,4 @@ | |
|
||
# Disable the servos | ||
for s in board.servos: | ||
s.disable() | ||
s.disable() |
Oops, something went wrong.