We'll be using CircuitPython for this project. Are you new to using CircuitPython? No worries, there is a full getting started guide here.
Adafruit suggests using the Mu editor to edit your code and have an interactive REPL in CircuitPython. You can learn about Mu and its installation in this tutorial.
There's a guide to get you up and running with CircuitPython specifically for the NeoTrellis M4. You should read it before starting to get the most recent CircuitPython build for the NeoTrellis M4 installed and running along with the required libraries.
Setting up your the NeoTrellis
To get your NeoTrellis M4 setup to run this project's code, first follow these steps:
1) Update the bootloader for NeoTrellis from the NeoTrellis M4 guide
2) Install the latest CircuitPython for NeoTrellis from the NeoTrellis M4 guide
For this project you will need the following libraries:
- adafruit_trellism4.mpy
- neopixel.mpy
- adafruit_matrixkeypad.mpy
When the libraries and code is installed CIRCUITPY should look like:
Click Download Project Bundle below to download a Zip file of the code and up to date libraries. Unzip the file and copy the files to your NeoTrellis CIRCUITPY drive.
If the game does not play, check your NeoTrellis setup at the top of the page and ensure the three library .mpy files are in the /lib directory on the CIRCUITPY drive.
# SPDX-FileCopyrightText: 2018 Dave Astels for Adafruit Industries
#
# SPDX-License-Identifier: MIT
"""
NeoTrellis M4 Express Memory Game
Adafruit invests time and resources providing this open source code.
Please support Adafruit and open source hardware by purchasing
products from Adafruit!
Written by Dave Astels for Adafruit Industries
Copyright (c) 2018 Adafruit Industries
Licensed under the MIT license.
All text above must be included in any redistribution.
"""
# pylint: disable=stop-iteration-return
import time
import random
from rainbowio import colorwheel
import adafruit_trellism4
COLORS = [0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0xFF00FF]
trellis = adafruit_trellism4.TrellisM4Express(rotation=0)
trellis.pixels.brightness = 0.1
trellis.pixels.fill(0)
pixel_colors = [None] * 32
found_pairs = 0
previously_pressed = set([])
first_pixel = None
key_pressed = None
def index_of(coord):
x, y = coord
return y * 8 + x
def cycle_sequence(seq):
while True:
for elem in seq:
yield elem
def rainbow_lamp(seq):
g = cycle_sequence(seq)
while True:
trellis.pixels.fill(colorwheel(next(g)))
yield
def splash():
rainbow = rainbow_lamp(range(0, 256, 8))
for _ in range(64):
next(rainbow)
time.sleep(0.005)
def assign_colors():
unassigned = [(x, y) for x in range(8) for y in range(4)]
while unassigned:
first_of_pair = random.choice(unassigned)
unassigned.remove(first_of_pair)
second_of_pair = random.choice(unassigned)
unassigned.remove(second_of_pair)
random_color = random.choice(COLORS)
pixel_colors[index_of(first_of_pair)] = random_color
pixel_colors[index_of(second_of_pair)] = random_color
def handle_key(key, _found_pairs, _first_pixel):
if key is None:
return _found_pairs, _first_pixel
key_color = pixel_colors[index_of(key)]
if key_color is not None:
trellis.pixels[key] = pixel_colors[index_of(key)]
time.sleep(0.5)
if _first_pixel and _first_pixel != key:
if key_color == pixel_colors[index_of(_first_pixel)]:
pixel_colors[index_of(_first_pixel)] = None
pixel_colors[index_of(key)] = None
for _ in range(5):
trellis.pixels[_first_pixel] = 0xFFFFFF
trellis.pixels[key] = 0xFFFFFF
time.sleep(0.1)
trellis.pixels[_first_pixel] = 0x000000
trellis.pixels[key] = 0x000000
time.sleep(0.1)
trellis.pixels[_first_pixel] = 0x444444
trellis.pixels[key] = 0x444444
return _found_pairs + 1, None
else:
trellis.pixels[_first_pixel] = 0x000000
trellis.pixels[key] = 0x000000
return _found_pairs, None
else:
return _found_pairs, key
return _found_pairs, None
def check_for_key(last_pressed):
now_pressed = set(trellis.pressed_keys)
new_presses = now_pressed - last_pressed
if new_presses:
return now_pressed, list(new_presses)[0]
return now_pressed, None
demo_mode_enabled = True
while True:
trellis.pixels.fill(0x000000)
assign_colors()
found_pairs = 0
first_pixel = None
remaining = [(x, y) for x in range(8) for y in range(4)]
while found_pairs < 16:
if demo_mode_enabled:
previously_pressed, key_pressed = check_for_key(previously_pressed)
if key_pressed:
demo_mode_enabled = False
break
first = random.choice(remaining)
remaining.remove(first)
found_pairs, first_pixel = handle_key(first, found_pairs, first_pixel)
previously_pressed, key_pressed = check_for_key(previously_pressed)
if key_pressed:
demo_mode_enabled = False
break
c = pixel_colors[index_of(first)]
match = random.choice([x for x in remaining if pixel_colors[index_of(x)] == c])
found_pairs, first_pixel = handle_key(match, found_pairs, first_pixel)
remaining.remove(match)
else:
previously_pressed, key_pressed = check_for_key(previously_pressed)
found_pairs, first_pixel = handle_key(key_pressed, found_pairs, first_pixel)
if found_pairs == 16:
splash()
Page last edited January 20, 2025
Text editor powered by tinymce.