Skip to content

Commit

Permalink
lint examples
Browse files Browse the repository at this point in the history
  • Loading branch information
helgibbons committed Sep 13, 2024
1 parent 6aa09a8 commit 40d1d59
Show file tree
Hide file tree
Showing 11 changed files with 406 additions and 51 deletions.
32 changes: 32 additions & 0 deletions examples/ADC.py
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)
28 changes: 0 additions & 28 deletions examples/LTR559_demo.py

This file was deleted.

6 changes: 4 additions & 2 deletions examples/button_test.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# This example shows you a simple, non-interrupt way of reading Pico Explorer's buttons with a loop that checks to see if buttons are pressed.
"""
This example shows you a simple, non-interrupt way of reading Pico Explorer's buttons with a loop that checks to see if buttons are pressed.
"""

import time
from picographics import PicoGraphics, DISPLAY_EXPLORER, PEN_P4
Expand Down Expand Up @@ -34,7 +36,7 @@ def clear():
display.set_font("bitmap8")

while True:
if button_a.value() == 0: # if a button press is detected then...
if button_a.value() == 0: # if a button press is detected then...
clear() # clear to black
display.set_pen(WHITE) # change the pen colour
display.text("Button A pressed", 10, 10, 240, 4) # display some text on the screen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@
if temperature is not None:
display.text(f"Temperature: {temperature:.2f}°C,\nHumidity: {humidity:.0f}%,\nPressure: {pressure/100:.0f}hPa", 0, 180, 320, 3)
display.update()
time.sleep(0.1)
time.sleep(0.1)
51 changes: 51 additions & 0 deletions examples/external_buttons.py
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)
26 changes: 17 additions & 9 deletions examples/explorer.py → examples/lib/explorer.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class Explorer2350():
SWITCH_X_PIN = 17
SWITCH_Y_PIN = 18
SWITCH_Z_PIN = 19

I2C_SDA_PIN = 20
I2C_SCL_PIN = 21

Expand All @@ -61,6 +61,20 @@ class Explorer2350():
SERVO_3_PIN = 7
SERVO_4_PIN = 6

ADC_0_PIN = 40
ADC_1_PIN = 41
ADC_2_PIN = 42
ADC_3_PIN = 43
ADC_4_PIN = 44
ADC_5_PIN = 45

GPIO_0_PIN = 0
GPIO_1_PIN = 1
GPIO_2_PIN = 2
GPIO_3_PIN = 3
GPIO_4_PIN = 4
GPIO_5_PIN = 5

PWM_AUDIO_PIN = 12
AMP_EN_PIN = 13

Expand All @@ -70,7 +84,7 @@ class Explorer2350():
def __init__(self, init_servos=True):
# Free up hardware resources
gc.collect()

self.display = PicoGraphics(display=DISPLAY_EXPLORER)

# Set up the servos, if the user wants them
Expand All @@ -88,12 +102,6 @@ def __init__(self, init_servos=True):
self.audio_pwm = PWM(Pin(self.PWM_AUDIO_PIN))
self.__volume = self.DEFAULT_VOLUME

# Set up the user switch
self.__switch = Pin(self.USER_SW_PIN, Pin.IN, Pin.PULL_DOWN)

def switch_pressed(self):
return self.__switch.value()

def play_tone(self, frequency):
try:
self.audio_pwm.freq(frequency)
Expand Down Expand Up @@ -129,4 +137,4 @@ def mute_audio(self):
self.__amp_en.off()

def unmute_audio(self):
self.__amp_en.on()
self.__amp_en.on()
155 changes: 155 additions & 0 deletions examples/main.py
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)
2 changes: 1 addition & 1 deletion examples/multiple_servos.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,4 @@

# Disable the servos
for s in board.servos:
s.disable()
s.disable()
Loading

0 comments on commit 40d1d59

Please sign in to comment.