from machine import Pin, SPI
import time
import random
# SPI setup
spi = SPI(0, baudrate=10000000, polarity=0, phase=0,
sck=Pin(18), mosi=Pin(19))
cs = Pin(17, Pin.OUT)
button = Pin(15, Pin.IN, Pin.PULL_UP)
# Dice frequency
freq = [0]*6
# MAX7219 commands
def write_cmd(addr, data):
cs(0)
spi.write(bytearray([addr, data]))
cs(1)
def init_max():
write_cmd(0x0C, 1) # normal mode
write_cmd(0x0B, 7) # scan limit
write_cmd(0x0A, 8) # brightness
write_cmd(0x09, 0) # no decode
write_cmd(0x0F, 0) # display test off
init_max()
# Dice patterns (8x8)
dice_patterns = {
1: [0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x00],
2: [0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01],
3: [0x80,0x00,0x18,0x00,0x18,0x00,0x00,0x01],
4: [0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x81],
5: [0x81,0x00,0x18,0x00,0x18,0x00,0x00,0x81],
6: [0x81,0x00,0x81,0x00,0x00,0x81,0x00,0x81]
}
def show_pattern(pattern):
for i in range(8):
write_cmd(i+1, pattern[i])
def roll():
val = random.randint(1,6)
freq[val-1] += 1
show_pattern(dice_patterns[val])
return val
last = 1
while True:
cur = button.value()
if cur == 0 and last == 1:
start = time.ticks_ms()
while button.value() == 0:
time.sleep_ms(10)
press_time = time.ticks_diff(time.ticks_ms(), start)
if press_time < 1000:
roll()
elif press_time < 3000:
d1 = roll()
time.sleep(1)
d2 = roll()
print("Sum:", d1+d2)
else:
print("Frequency:", freq)
time.sleep_ms(300)
last = cur