#Init IO
from machine import Pin, PWM
from neopixel import NeoPixel

pin = Pin(2, Pin.OUT)   # set GPIO0(D4) to output to drive NeoPixels
np = NeoPixel(pin, 30)  # create NeoPixel driver on GPIO0 for 30 pixels

import urandom
val = 0
hue = 0
dir = +0.001
scale = 10
hold = 0

def update(x=None):
    global val, hue, dir, scale, hold
    #start = time.ticks_ms()
    if abs(hue-val) < 0.001:
        if hold:
            hold -= 1
        else:
            val = urandom.getrandbits(8)/2.**8
            dir *= -1
            #print(val*dir)
            hold += 1000
    else:
        hue += dir #-= abs(hue-val)*0.01
    hue %= 1.0
    r, g, b = hsv_to_rgb(hue, 0.5, 1.0)
    
    np.buf[3:] = np.buf[:-3]
    np[0] = (int(r*scale),int(g*scale),int(b*scale))
    np.write()
    #print("Loop took:", time.ticks_diff(time.ticks_ms(), start), "ms")

#Start update timer
from machine import Timer
tim = Timer(-1)
#tim.deinit()
tim.init(period=10, mode=Timer.PERIODIC, callback=update)