# Christmas tree and more
# Simple test for NeoPixels on Raspberry Pi
import time
import board
import neopixel


# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18
# NeoPixels must be connected to D10, D12, D18 or D21 to work.
pixel_pin = board.D18

# The number of NeoPixels
num_pixels = 99

# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.RGB

pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER
)

myMatrix=[88,89,90,91,92,93,94,95,96,97,98,
          87,86,85,84,83,82,81,80,79,78,77,
          66,67,68,69,70,71,72,73,74,75,76,
          65,64,63,62,61,60,59,58,57,56,55,
          44,45,46,47,48,49,50,51,52,53,54,
          43,42,41,40,39,38,37,36,35,34,33,
          22,23,24,25,26,27,28,29,30,31,32,
          21,20,19,18,17,16,15,14,13,12,11,
           0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10]

def wheel(pos):
    # Input a value 0 to 255 to get a color value.
    # The colours are a transition r - g - b - back to r.
    if pos < 0 or pos > 255:
        r = g = b = 0
    elif pos < 85:
        r = int(pos * 3)
        g = int(255 - pos * 3)
        b = 0
    elif pos < 170:
        pos -= 85
        r = int(255 - pos * 3)
        g = 0
        b = int(pos * 3)
    else:
        pos -= 170
        r = 0
        g = int(pos * 3)
        b = int(255 - pos * 3)
    return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0)


def rainbow_cycle(wait):
    for j in range(255):
        for i in range(num_pixels):
            pixel_index = (i * 256 // num_pixels) + j
            pixels[i] = wheel(pixel_index & 255)
        pixels.show()
        time.sleep(wait)

try:
    while True:
#         pixels.fill((255, 0, 0))
#         pixels.show()
#         time.sleep(1)
# 
#         pixels.fill((0, 255, 0))
#         pixels.show()
#         time.sleep(1)
# 
#         pixels.fill((0, 0, 255))
#         pixels.show()
#         time.sleep(1)

        pixels.fill((0,0,0))
        #H red
        pixels[myMatrix[0]] = (255,0,0)
        pixels[myMatrix[11]] = (255,0,0)
        pixels[myMatrix[22]] = (255,0,0)
        pixels[myMatrix[33]] = (255,0,0)
        pixels[myMatrix[34]] = (255,0,0)
        pixels[myMatrix[35]] = (255,0,0)
        pixels[myMatrix[44]] = (255,0,0)
        pixels[myMatrix[55]] = (255,0,0)
        pixels[myMatrix[66]] = (255,0,0)
        pixels[myMatrix[3]] = (255,0,0)
        pixels[myMatrix[14]] = (255,0,0)
        pixels[myMatrix[25]] = (255,0,0)
        pixels[myMatrix[36]] = (255,0,0)
        pixels[myMatrix[47]] = (255,0,0)
        pixels[myMatrix[58]] = (255,0,0)
        pixels[myMatrix[69]] = (255,0,0)
        #O
        pixels[myMatrix[6]] = (255,0,0)
        pixels[myMatrix[16]] = (255,0,0)
        pixels[myMatrix[27]] = (255,0,0)
        pixels[myMatrix[38]] = (255,0,0)
        pixels[myMatrix[49]] = (255,0,0)
        pixels[myMatrix[60]] = (255,0,0)
        pixels[myMatrix[72]] = (255,0,0)
        pixels[myMatrix[7]] = (255,0,0)
        pixels[myMatrix[19]] = (255,0,0)
        pixels[myMatrix[30]] = (255,0,0)
        pixels[myMatrix[41]] = (255,0,0)
        pixels[myMatrix[52]] = (255,0,0)
        pixels[myMatrix[63]] = (255,0,0)
        pixels[myMatrix[73]] = (255,0,0)
        pixels.show()
        time.sleep(2)

        #H green
        pixels.fill((0,0,0))
        pixels[myMatrix[12]] = (0,255,0)
        pixels[myMatrix[23]] = (0,255,0)
        pixels[myMatrix[34]] = (0,255,0)
        pixels[myMatrix[45]] = (0,255,0)
        pixels[myMatrix[46]] = (0,255,0)
        pixels[myMatrix[47]] = (0,255,0)
        pixels[myMatrix[56]] = (0,255,0)
        pixels[myMatrix[67]] = (0,255,0)
        pixels[myMatrix[78]] = (0,255,0)
        pixels[myMatrix[15]] = (0,255,0)
        pixels[myMatrix[26]] = (0,255,0)
        pixels[myMatrix[37]] = (0,255,0)
        pixels[myMatrix[48]] = (0,255,0)
        pixels[myMatrix[59]] = (0,255,0)
        pixels[myMatrix[70]] = (0,255,0)
        pixels[myMatrix[81]] = (0,255,0)
        #O
        pixels[myMatrix[18]] = (0,255,0)
        pixels[myMatrix[19]] = (0,255,0)
        pixels[myMatrix[28]] = (0,255,0)
        pixels[myMatrix[39]] = (0,255,0)
        pixels[myMatrix[50]] = (0,255,0)
        pixels[myMatrix[61]] = (0,255,0)
        pixels[myMatrix[72]] = (0,255,0)
        pixels[myMatrix[84]] = (0,255,0)
        pixels[myMatrix[31]] = (0,255,0)
        pixels[myMatrix[42]] = (0,255,0)
        pixels[myMatrix[53]] = (0,255,0)
        pixels[myMatrix[64]] = (0,255,0)
        pixels[myMatrix[75]] = (0,255,0)
        pixels[myMatrix[85]] = (0,255,0)
        pixels.show()
        time.sleep(2)

        #H
        pixels.fill((0,0,0))
        pixels[myMatrix[24]] = (0,0,255)
        pixels[myMatrix[35]] = (0,0,255)
        pixels[myMatrix[46]] = (0,0,255)
        pixels[myMatrix[57]] = (0,0,255)
        pixels[myMatrix[58]] = (0,0,255)
        pixels[myMatrix[59]] = (0,0,255)
        pixels[myMatrix[68]] = (0,0,255)
        pixels[myMatrix[79]] = (0,0,255)
        pixels[myMatrix[90]] = (0,0,255)
        pixels[myMatrix[27]] = (0,0,255)
        pixels[myMatrix[38]] = (0,0,255)
        pixels[myMatrix[49]] = (0,0,255)
        pixels[myMatrix[60]] = (0,0,255)
        pixels[myMatrix[71]] = (0,0,255)
        pixels[myMatrix[82]] = (0,0,255)
        pixels[myMatrix[93]] = (0,0,255)
        #O
        pixels[myMatrix[30]] = (0,0,255)
        pixels[myMatrix[31]] = (0,0,255)
        pixels[myMatrix[40]] = (0,0,255)
        pixels[myMatrix[51]] = (0,0,255)
        pixels[myMatrix[62]] = (0,0,255)
        pixels[myMatrix[73]] = (0,0,255)
        pixels[myMatrix[84]] = (0,0,255)
        pixels[myMatrix[96]] = (0,0,255)
        pixels[myMatrix[43]] = (0,0,255)
        pixels[myMatrix[54]] = (0,0,255)
        pixels[myMatrix[65]] = (0,0,255)
        pixels[myMatrix[76]] = (0,0,255)
        pixels[myMatrix[87]] = (0,0,255)
        pixels[myMatrix[97]] = (0,0,255)
        pixels.show()
        time.sleep(2)

        rainbow_cycle(0.001)  # rainbow cycle with 1ms delay per step
        
        # show tree
        pixels.fill((0, 0, 0))
        pixels[myMatrix[5]] = (0, 255, 0)
        pixels.show()
        time.sleep(1)
        
        for i in range(15,18):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(26,29):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(36,41):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(47,52):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(57,64):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(68,75):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(78,87):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
        
        for i in range(88,99):
            pixels[myMatrix[i]] = (0,255,0)
            pixels.show()
        time.sleep(1)
            
        pixels[myMatrix[5]] = (255, 255, 255)
        pixels.show()
        time.sleep(1)
# snow        
        pixels[myMatrix[2]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[12]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[24]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[9]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[19]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[42]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[44]] = (128,128,128)
        pixels.show()
        time.sleep(1)
        
        pixels[myMatrix[65]] = (128,128,128)
        pixels.show()
        time.sleep(1)
            
        time.sleep(5)
        
finally:
    pixels.fill((0,0,0))