import machine, neopixel
import time
import urandom

PIN = 15  # Datenpin z.B. an GPIO 0
WIDTH = 8
HEIGHT = 8
NUM_LEDS = WIDTH * HEIGHT

np = neopixel.NeoPixel(machine.Pin(PIN), NUM_LEDS)

# Hilfsfunktionen
def clear():
    for i in range(NUM_LEDS):
        np[i] = (0, 0, 0)
    np.write()

def set_pixel(x, y, color):
    index = y * WIDTH + x if y % 2 == 0 else y * WIDTH + (WIDTH - 1 - x)
    np[index] = color

def random_color():
    return (urandom.getrandbits(8), urandom.getrandbits(8), urandom.getrandbits(8))

# Lichteffekte
def effect_rainbow():
    for j in range(256):
        for i in range(NUM_LEDS):
            np[i] = wheel((int(i * 256 / NUM_LEDS) + j) & 255)
        np.write()
        time.sleep(0.01)

def wheel(pos):
    if pos < 85:
        return (int(pos * 3), int(255 - pos * 3), 0)
    elif pos < 170:
        pos -= 85
        return (int(255 - pos * 3), 0, int(pos * 3))
    else:
        pos -= 170
        return (0, int(pos * 3), int(255 - pos * 3))

def effect_random_pixels():
    for _ in range(50):
        i = urandom.getrandbits(6)
        np[i] = random_color()
        np.write()
        time.sleep(0.05)

def effect_snake():
    for i in range(NUM_LEDS):
        clear()
        np[i] = (0, 255, 0)
        np.write()
        time.sleep(0.05)

def effect_blink_all(color):
    for _ in range(5):
        for i in range(NUM_LEDS):
            np[i] = color
        np.write()
        time.sleep(0.3)
        clear()
        time.sleep(0.3)

def effect_wave():
    for y in range(HEIGHT):
        for x in range(WIDTH):
            clear()
            set_pixel(x, y, (0, 0, 255))
            np.write()
            time.sleep(0.05)

def effect_diagonal():
    for i in range(HEIGHT + WIDTH):
        clear()
        for y in range(HEIGHT):
            x = i - y
            if 0 <= x < WIDTH:
                set_pixel(x, y, (255, 255, 0))
        np.write()
        time.sleep(0.1)

def effect_checkerboard():
    for _ in range(5):
        for y in range(HEIGHT):
            for x in range(WIDTH):
                if (x + y) % 2 == 0:
                    set_pixel(x, y, (255, 255, 255))
                else:
                    set_pixel(x, y, (0, 0, 0))
        np.write()
        time.sleep(0.5)
        clear()
        time.sleep(0.5)

def effect_fade(color):
    for i in range(0, 256, 5):
        for j in range(NUM_LEDS):
            np[j] = tuple(min(int(c * i / 255), 255) for c in color)
        np.write()
        time.sleep(0.01)

def effect_border():
    for y in range(HEIGHT):
        for x in range(WIDTH):
            if y == 0 or y == HEIGHT - 1 or x == 0 or x == WIDTH - 1:
                set_pixel(x, y, (255, 0, 0))
    np.write()
    time.sleep(0.5)

# Liste der Effekte
effects = [
    effect_rainbow,
    effect_random_pixels,
    lambda: effect_blink_all((255, 0, 0)),
    lambda: effect_blink_all((0, 255, 0)),
    lambda: effect_blink_all((0, 0, 255)),
    effect_snake,
    effect_wave,
    effect_diagonal,
    effect_checkerboard,
    lambda: effect_fade((255, 0, 0)),
    lambda: effect_fade((0, 255, 0)),
    lambda: effect_fade((0, 0, 255)),
    lambda: effect_fade((255, 255, 0)),
    effect_border,
    lambda: effect_blink_all(random_color()),
    lambda: effect_blink_all(random_color()),
    lambda: effect_blink_all(random_color()),
    lambda: effect_wave(),
    lambda: effect_snake(),
    lambda: effect_checkerboard(),
]

# Hauptloop
while True:
    for effect in effects:
        clear()
        effect()
        time.sleep(0.5)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT