Skip to content

Commit

Permalink
Merge pull request #271 from pimoroni/patch-badger2040-examples
Browse files Browse the repository at this point in the history
Badger 2040 - Improve examples
  • Loading branch information
Gadgetoid committed Mar 4, 2022
2 parents 459dc4a + 04ff302 commit 3ce3477
Show file tree
Hide file tree
Showing 12 changed files with 239 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
The Project Gutenberg eBook of The Wind in the Willows, by Kenneth Grahame
The Project Gutenberg eBook of The Wind in the Willows, by Kenneth Grahame

This eBook is for the use of anyone anywhere in the United States and
most other parts of the world at no cost and with almost no restrictions
Expand Down
130 changes: 120 additions & 10 deletions micropython/examples/badger2040/clock.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,140 @@
import time
import machine
import badger2040
from machine import RTC

rtc = RTC()

rtc = machine.RTC()
screen = badger2040.Badger2040()
screen.update_speed(badger2040.UPDATE_TURBO)
screen.font("gothic")

year, month, day, wd, hour, minute, second, _ = rtc.datetime()
cursors = ["year", "month", "day", "hour", "minute"]
set_clock = False
cursor = 0
last = 0

if (year, month, day) == (2021, 1, 1):
rtc.datetime((2022, 2, 25, 3, 12, 0, 0, 0))
# Set up the buttons
button_down = machine.Pin(badger2040.BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_up = machine.Pin(badger2040.BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
button_a = machine.Pin(badger2040.BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_b = machine.Pin(badger2040.BUTTON_B, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_c = machine.Pin(badger2040.BUTTON_C, machine.Pin.IN, machine.Pin.PULL_DOWN)


# Button handling function
def button(pin):
global last, set_clock, cursor, year, month, day, hour, minute

time.sleep(0.05)
if not pin.value():
return

adjust = 0
changed = False

if pin == button_b:
set_clock = not set_clock
changed = True
if not set_clock:
rtc.datetime((year, month, day, 0, hour, minute, second, 0))

if set_clock:
if pin == button_c:
cursor += 1
cursor %= len(cursors)

if pin == button_a:
cursor -= 1
cursor %= len(cursors)

if pin == button_up:
adjust = 1

if pin == button_down:
adjust = -1

if cursors[cursor] == "year":
year += adjust
year = max(year, 2022)
if cursors[cursor] == "month":
month += adjust
month = min(max(month, 1), 12)
if cursors[cursor] == "day":
day += adjust
day = min(max(day, 1), 31)
if cursors[cursor] == "hour":
hour += adjust
hour %= 60
if cursors[cursor] == "minute":
minute += adjust
minute %= 60

if set_clock or changed:
draw_clock()


# Register the button handling function with the buttons
button_down.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_up.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_b.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_c.irq(trigger=machine.Pin.IRQ_RISING, handler=button)


def draw_clock():
hms = "{:02}:{:02}:{:02}".format(hour, minute, second)
ymd = "{:04}/{:02}/{:02}".format(year, month, day)

hms_width = screen.measure_text(hms, 1.8)
hms_offset = int((badger2040.WIDTH / 2) - (hms_width / 2))
h_width = screen.measure_text(hms[0:2], 1.8)
mi_width = screen.measure_text(hms[3:5], 1.8)
mi_offset = screen.measure_text(hms[0:3], 1.8)

ymd_width = screen.measure_text(ymd, 1.0)
ymd_offset = int((badger2040.WIDTH / 2) - (ymd_width / 2))
y_width = screen.measure_text(ymd[0:4], 1.0)
m_width = screen.measure_text(ymd[5:7], 1.0)
m_offset = screen.measure_text(ymd[0:5], 1.0)
d_width = screen.measure_text(ymd[8:10], 1.0)
d_offset = screen.measure_text(ymd[0:8], 1.0)

screen.pen(15)
screen.clear()
screen.pen(0)
screen.thickness(5)
screen.text(hms, 0, 40, 1.8)
screen.text(hms, hms_offset, 40, 1.8)
screen.thickness(3)
screen.text(ymd, 0, 100, 1.0)
screen.text(ymd, ymd_offset, 100, 1.0)

if set_clock:
if cursors[cursor] == "year":
screen.line(ymd_offset, 120, ymd_offset + y_width, 120)
if cursors[cursor] == "month":
screen.line(ymd_offset + m_offset, 120, ymd_offset + m_offset + m_width, 120)
if cursors[cursor] == "day":
screen.line(ymd_offset + d_offset, 120, ymd_offset + d_offset + d_width, 120)

if cursors[cursor] == "hour":
screen.line(hms_offset, 70, hms_offset + h_width, 70)
if cursors[cursor] == "minute":
screen.line(hms_offset + mi_offset, 70, hms_offset + mi_offset + mi_width, 70)

screen.update()

time.sleep(0.5)

year, month, day, wd, hour, minute, second, _ = rtc.datetime()

if (year, month, day) == (2021, 1, 1):
rtc.datetime((2022, 2, 29, 3, 12, 0, 0, 0))

last_second = second

while True:
if not set_clock:
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
if second != last_second:
draw_clock()
last_second = second
time.sleep(0.1)
62 changes: 52 additions & 10 deletions micropython/examples/badger2040/ebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,26 @@
import time
import gc


# **** Put the name of your text file here *****
text_file = "book.txt" # File must be on the MicroPython device


try:
open("witw.txt", "r")
open(text_file, "r")
except OSError:
try:
# If the specified file doesn't exist,
# pre-populate with Wind In The Willows
import witw
open("witw.txt", "wb").write(witw.data())
open(text_file, "wb").write(witw.data())
del witw
except ImportError:
pass


gc.collect()


# **** Put the name of your text file here *****
text_file = "witw.txt" # File must be on the MicroPython device

# Global Constants
WIDTH = badger2040.WIDTH
HEIGHT = badger2040.HEIGHT
Expand All @@ -30,15 +33,18 @@
ARROW_PADDING = 2

TEXT_PADDING = 4
TEXT_SPACING = 20

TEXT_SIZE = 0.5
TEXT_SPACING = int(34 * TEXT_SIZE)
TEXT_WIDTH = WIDTH - TEXT_PADDING - TEXT_PADDING - ARROW_WIDTH


FONTS = ["sans", "gothic", "cursive", "serif"]
FONT_THICKNESSES = [2, 1, 1, 2]
# ------------------------------
# Drawing functions
# ------------------------------


# Draw a upward arrow
def draw_up(x, y, width, height, thickness, padding):
border = (thickness // 4) + padding
Expand Down Expand Up @@ -79,6 +85,8 @@ def draw_frame():
# Global variables
next_page = True
prev_page = False
change_font_size = False
change_font = False
last_offset = 0
current_page = 0

Expand All @@ -90,6 +98,9 @@ def draw_frame():
button_down = machine.Pin(badger2040.BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_up = machine.Pin(badger2040.BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN)

button_a = machine.Pin(badger2040.BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_b = machine.Pin(badger2040.BUTTON_B, machine.Pin.IN, machine.Pin.PULL_DOWN)

# Set up the activity LED
led = machine.Pin(badger2040.PIN_LED, machine.Pin.OUT)

Expand All @@ -98,18 +109,26 @@ def draw_frame():

# Button handling function
def button(pin):
global next_page, prev_page
global next_page, prev_page, change_font_size, change_font

if pin == button_down:
next_page = True

if pin == button_up:
prev_page = True

if pin == button_a:
change_font_size = True

if pin == button_b:
change_font = True


# Register the button handling function with the buttons
button_down.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_up.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_b.irq(trigger=machine.Pin.IRQ_RISING, handler=button)


# ------------------------------
Expand All @@ -122,6 +141,7 @@ def render_page():
pos = ebook.tell()
next_pos = pos
add_newline = False
display.font(FONTS[0])

while True:
# Read a full line and split it into words
Expand Down Expand Up @@ -168,7 +188,7 @@ def render_page():
# Yes, so write out the line prior to the append
print(line)
display.pen(0)
display.thickness(2)
display.thickness(FONT_THICKNESSES[0])
display.text(line, TEXT_PADDING, (row * TEXT_SPACING) + (TEXT_SPACING // 2) + TEXT_PADDING, TEXT_SIZE)

# Clear the line and move on to the next row
Expand Down Expand Up @@ -231,4 +251,26 @@ def render_page():
render_page()
prev_page = False # Clear the prev page button flag

if change_font_size:
TEXT_SIZE += 0.1
if TEXT_SIZE > 0.8:
TEXT_SIZE = 0.5
TEXT_SPACING = int(34 * TEXT_SIZE)
offsets = [0]
ebook.seek(0)
current_page = 1
draw_frame()
render_page()
change_font_size = False

if change_font:
FONTS.append(FONTS.pop(0))
FONT_THICKNESSES.append(FONT_THICKNESSES.pop(0))
offsets = [0]
ebook.seek(0)
current_page = 1
draw_frame()
render_page()
change_font = False

time.sleep(0.1)
36 changes: 21 additions & 15 deletions micropython/examples/badger2040/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@

image = bytearray(int(296 * 128 / 8))
current_image = 0
show_info = True


# Draw an overlay box with a given message within it
Expand Down Expand Up @@ -97,22 +98,24 @@ def show_image(n):
name = file.split(".")[0]
open("images/{}".format(file), "r").readinto(image)
display.image(image)
name_length = display.measure_text(name, 0.5)
display.pen(0)
display.rectangle(0, HEIGHT - 21, name_length + 11, 21)
display.pen(15)
display.rectangle(0, HEIGHT - 20, name_length + 10, 20)
display.pen(0)
display.text(name, 5, HEIGHT - 10, 0.5)

for i in range(TOTAL_IMAGES):
x = 286
y = int((128 / 2) - (TOTAL_IMAGES * 10 / 2) + (i * 10))
if show_info:
name_length = display.measure_text(name, 0.5)
display.pen(0)
display.rectangle(x, y, 8, 8)
if current_image != i:
display.pen(15)
display.rectangle(x + 1, y + 1, 6, 6)
display.rectangle(0, HEIGHT - 21, name_length + 11, 21)
display.pen(15)
display.rectangle(0, HEIGHT - 20, name_length + 10, 20)
display.pen(0)
display.text(name, 5, HEIGHT - 10, 0.5)

for i in range(TOTAL_IMAGES):
x = 286
y = int((128 / 2) - (TOTAL_IMAGES * 10 / 2) + (i * 10))
display.pen(0)
display.rectangle(x, y, 8, 8)
if current_image != i:
display.pen(15)
display.rectangle(x + 1, y + 1, 6, 6)

display.update()

Expand All @@ -137,7 +140,10 @@ def show_image(n):
if current_image < TOTAL_IMAGES - 1:
current_image += 1
show_image(current_image)
if button_a.value() or button_b.value() or button_c.value():
if button_a.value():
show_info = not show_info
show_image(current_image)
if button_b.value() or button_c.value():
display.pen(15)
display.clear()
draw_overlay("To add images connect Badger2040 to a PC, load up Thonny, and see readme.txt in images/", WIDTH - OVERLAY_BORDER, HEIGHT - OVERLAY_BORDER, OVERLAY_SPACING, 0.5)
Expand Down
Loading

0 comments on commit 3ce3477

Please sign in to comment.