from machine import Pin, SPI # Importeer Pin- en SPI-klassen om hardwarecomponenten aan te sturen
from time import sleep # Importeer sleep-functie voor vertragingen
# Initialiseer SPI
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23)) # Configureer SPI-bus
ss = Pin(5, Pin.OUT) # Stel Pin 5 in als uitgang voor Slave Select (SS)
ss.value(1) # Zet SS hoog om communicatie te stoppen
# MAX7221 registers
DECODE_MODE = 0x09 # Register voor decodeermodus
INTENSITY = 0x0A # Register voor helderheidsinstelling
SCAN_LIMIT = 0x0B # Register om actieve rijen te selecteren
SHUTDOWN = 0x0C # Register om de chip aan/uit te zetten
DISPLAY_TEST = 0x0F # Register voor testmodus
# Grote hart-patroon (8x8)
BIG_HEART = [
0b00000000, # Eerste rij van het hartpatroon
0b01100110, # Tweede rij
0b11111111, # Derde rij
0b11111111, # Vierde rij
0b01111110, # Vijfde rij
0b00111100, # Zesde rij
0b00011000, # Zevende rij
0b00000000 # Achtste rij
]
DISPLAY_SIZE = 8 # Het display is 8x8 groot
def write_to_max7221(register, data): # Functie om data naar MAX7221 te sturen
ss.value(0) # Zet SS laag om communicatie te starten
spi.write(bytearray([register, data])) # Stuur register en data via SPI
ss.value(1) # Zet SS hoog om communicatie te stoppen
def setup_max7221(): # Configuratie van MAX7221
write_to_max7221(SHUTDOWN, 0x01) # Schakel de chip in
write_to_max7221(DISPLAY_TEST, 0x00) # Zet testmodus uit
write_to_max7221(DECODE_MODE, 0x00) # Geen decodeermodus, direct schrijven
write_to_max7221(SCAN_LIMIT, 0x07) # Gebruik alle 8 rijen
write_to_max7221(INTENSITY, 0x08) # Stel de helderheid in op gemiddeld
def shift_pattern_horizontal(pattern, h_shift): # Verschuif patroon horizontaal
shifted_pattern = [] # Begin met een leeg patroon
for row in pattern: # Doorloop elke rij
if h_shift > 0: # Als horizontale verschuiving positief is
shifted_row = (row << h_shift) & 0xFF # Verschuif bits naar links en beperk tot 8 bits
else: # Als horizontale verschuiving negatief is
shifted_row = row >> -h_shift # Verschuif bits naar rechts
shifted_pattern.append(shifted_row) # Voeg de verschoven rij toe aan het nieuwe patroon
return shifted_pattern # Retourneer het verschoven patroon
def shift_pattern_vertical(pattern, v_shift): # Verschuif patroon verticaal
shifted_pattern = [0] * DISPLAY_SIZE # Begin met een leeg patroon
for i in range(DISPLAY_SIZE): # Doorloop elke rij
target_row = i + v_shift # Bereken de nieuwe rij
if 0 <= target_row < DISPLAY_SIZE: # Controleer of de nieuwe rij binnen het display valt
shifted_pattern[target_row] = pattern[i] # Kopieer de rij naar de nieuwe positie
return shifted_pattern # Retourneer het verschoven patroon
def shift_pattern_diagonal(pattern, x_shift, y_shift): # Verschuif patroon diagonaal
shifted_pattern = [0] * DISPLAY_SIZE # Begin met een leeg patroon
for i in range(DISPLAY_SIZE): # Doorloop elke rij
target_row = i + y_shift # Bereken de nieuwe rij voor verticaal
if 0 <= target_row < DISPLAY_SIZE: # Controleer of de nieuwe rij binnen het display valt
shifted_row = pattern[i] # Verkrijg de rij die we willen verschuiven
if 0 <= target_row < DISPLAY_SIZE: # Controleer of de nieuwe rij binnen het display valt
shifted_row = (shifted_row << x_shift) & 0xFF # Verschuif de rij horizontaal
shifted_pattern[target_row] = shifted_row # Zet de rij in de nieuwe positie
return shifted_pattern # Retourneer het verschoven patroon
def display_pattern(pattern): # Functie om een patroon weer te geven
for i in range(DISPLAY_SIZE): # Doorloop elke rij
write_to_max7221(i + 1, pattern[i]) # Schrijf de rij naar de juiste locatie op het display
# Setup en beweging
setup_max7221() # Configureer de MAX7221
while True: # Oneindige lus om animaties uit te voeren
# Horizontaal: van links naar rechts
for shift in range(0, 8): # Beweeg van links naar rechts
pattern = shift_pattern_horizontal(BIG_HEART, shift) # Verschuif horizontaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms
# Horizontaal: van rechts naar links
for shift in range(7, -1, -1): # Beweeg van rechts naar links
pattern = shift_pattern_horizontal(BIG_HEART, -shift) # Verschuif horizontaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms
# Verticaal: van onder naar boven
for shift in range(-7, 1): # Beweeg van onder naar boven
pattern = shift_pattern_vertical(BIG_HEART, shift) # Verschuif verticaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms
# Verticaal: van boven naar onder
for shift in range(0, 8): # Beweeg van boven naar onder
pattern = shift_pattern_vertical(BIG_HEART, shift) # Verschuif verticaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms
# Diagonaal: van linksonder naar rechtsboven
for shift in range(1, 8): # Beweeg van linksonder naar rechtsboven
pattern = shift_pattern_diagonal(BIG_HEART, shift, -shift) # Verschuif diagonaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms
# Diagonaal: van rechtsonder naar linksboven
for shift in range(1, 8): # Beweeg van rechtsonder naar linksboven
pattern = shift_pattern_diagonal(BIG_HEART, -shift, shift) # Verschuif diagonaal
display_pattern(pattern) # Toon het patroon
sleep(0.1) # Wacht 100 ms