Once you've finished setting up your QT Py RP2040 with CircuitPython, you can access the code and necessary libraries by downloading the Project Bundle.
To do this, click on the Download Project Bundle button in the window below. It will download to your computer as a zipped folder.
# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries # # SPDX-License-Identifier: MIT import time import board import displayio import i2cdisplaybus import neopixel import digitalio from adafruit_seesaw import seesaw, rotaryio, digitalio from adafruit_bitmap_font import bitmap_font from adafruit_display_text import label import adafruit_displayio_ssd1306 import simpleio from adafruit_ticks import ticks_ms, ticks_add, ticks_diff from rainbowio import colorwheel COLOR = (255, 150, 0) # yellow OFF = (0, 0, 0) PIXEL_PIN = board.A0 NUM_PIXELS = 6 timers = [6, 10, 15, 20, 25, 30] # minutes color_time = 20 # milliseconds # rotary encoder i2c = board.STEMMA_I2C() seesaw = seesaw.Seesaw(i2c, addr=0x36) encoder = rotaryio.IncrementalEncoder(seesaw) pos = -encoder.position last_pos = pos seesaw.pin_mode(24, seesaw.INPUT_PULLUP) button = digitalio.DigitalIO(seesaw, 24) button_state = False pixels = neopixel.NeoPixel(PIXEL_PIN, NUM_PIXELS, brightness=0.2, auto_write=False) pixels.fill(OFF) pixels.show() # display setup displayio.release_displays() # oled oled_reset = board.D9 display_bus = i2cdisplaybus.I2CDisplayBus(i2c, device_address=0x3D, reset=oled_reset) WIDTH = 128 HEIGHT = 64 display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) font = bitmap_font.load_font("/Arial-14.bdf") main_area = label.Label(font, text="6 Minutes", color=0xFFFFFF) main_area.anchor_point = (0.5, 0.0) main_area.anchored_position = (display.width / 2, display.height / 2) splash = displayio.Group() splash.append(main_area) display.root_group = splash timer_index = 0 timer = timers[timer_index] time_remaining = timer * 60000 active_timer = False timer_clock = ticks_ms() color_clock = ticks_ms() color_value = 0 last_map = 0 mapped_time = 0 while True: if not active_timer: pos = encoder.position if pos != last_pos: if pos > last_pos: timer_index = (timer_index + 1) % 6 else: timer_index = (timer_index - 1) % 6 print(timer_index) main_area.text = f"{timers[timer_index]} Minutes" last_pos = pos if not button.value and not button_state: main_area.text = "START!" timer = timers[timer_index] time_remaining = timer * 60000 last_map = 0 timer_clock = ticks_ms() color_clock = ticks_ms() active_timer = True button_state = True if button.value and button_state: button_state = False if active_timer: if ticks_diff(ticks_ms(), timer_clock) >= 1000: time_remaining -= 1000 remaining = int(time_remaining / 1000) secs_remaining = remaining % 60 remaining //= 60 mins_remaining = remaining % 60 if time_remaining > 0: mapped_time = simpleio.map_range( time_remaining, 0, (timer * 60000), 0, NUM_PIXELS + 1 ) mapped_time = max(mapped_time, 1) if int(mapped_time) != last_map: pixels.fill(OFF) last_map = int(mapped_time) main_area.text = f"{mins_remaining}:{secs_remaining:02}" else: pixels.fill(COLOR) pixels.show() time.sleep(0.5) pixels.fill(OFF) pixels.show() main_area.text = "DONE!" print(time_remaining) timer_clock = ticks_add(timer_clock, 1000) if ticks_diff(ticks_ms(), color_clock) >= color_time: color_value = (color_value + 1) % 255 for i in range(int(mapped_time)): pixels[i] = colorwheel(color_value) if time_remaining > 0: pixels.show() color_clock = ticks_add(color_clock, color_time) if not button.value and not button_state: timer = timers[timer_index] pixels.fill(OFF) pixels.show() main_area.text = "STOPPED" active_timer = False button_state = True if button.value and button_state: button_state = False
Upload the Code, Assets and Libraries to the QT Py
After downloading the Project Bundle, plug your QT Py into the computer's USB port with a known good USB data+power cable. You should see a new flash drive appear in the computer's File Explorer or Finder (depending on your operating system) called CIRCUITPY. Unzip the folder and copy the following items to the QT Py's CIRCUITPY drive.
- lib folder
- code.py
- Arial-14.bdf
Your QT Py CIRCUITPY drive should look like this after copying the lib folder, font file and the code.py file.
Page last edited February 04, 2025
Text editor powered by tinymce.