from machine import Pin, ADC
from neopixel import NeoPixel
import time

regenboog = [(250,0,0),(250,125,0),(250,250,0),(0,250,0),(150,250,250),(0,0,250),(110,0,250),(250,0,175)]

# Initialisatie van de NeoPixel driver
PIN_NUMMER = 23  # GPIO pin nummer
LED_AANTAL = 16  # Aantal NeoPixels
POT_PIN = 34     # Pin verbonden met de potmeter
KNOP_PIN = 32    # Pin verbonden met de onderbreekknop

# Instellen van de pin en NeoPixel object
pin = Pin(PIN_NUMMER, Pin.OUT)
np = NeoPixel(pin, LED_AANTAL)

# Initialiseer de potmeter en de knop
pot = ADC(Pin(POT_PIN))
knop = Pin(KNOP_PIN, Pin.IN, Pin.PULL_DOWN)  # Knop met interne pull-down weerstand

index = 0  # Index om de huidige LED bij te houden
laatste_tijd = time.ticks_ms()  # Huidige tijd in milliseconden
vertraging = 0  # Globale variabele voor vertraging
pauze = 0  # Status van de pauze
vorige_knop_status = 0  # Vorige status van de knop

def vertraging_functie():
    global vertraging  # Maak de globale variabele toegankelijk
    pot_value = pot.read()  # Lees de waarde van de potmeter (0-4095)
    
    # Bepaal de schaalfactor
    schaal_factor = pot_value / 4095  # Normaliseer de potmeterwaarde naar een bereik van 0 tot 1
    
    # Bereken de vertraging
    minimale_vertraging = 0.2  # Stel de minimale vertraging in op 0.2 seconden
    maximale_vertraging = 1.0   # Stel de maximale vertraging in op 1.0 seconden
    vertraging = minimale_vertraging + (schaal_factor * (maximale_vertraging - minimale_vertraging))

def toggle_pauze():
    global pauze
    pauze = not pauze  # Toggle de pauze status
    time.sleep(0.2)  # Debounce tijd voor de knop

def reset_leds():
    for i in range(LED_AANTAL):
        np[i] = (0, 0, 0)  # Zet alle LED's uit
    np.write()  # Schrijf de buffer naar de LED-strip

while True:
    huidige_tijd = time.ticks_ms()  # Huidige tijd in milliseconden
    vertraging_functie()  # Verkrijg de vertraging op basis van de potmeter
    
    # Controleer de status van de knop
    huidige_knop_status = knop.value()  # Lees de huidige status van de knop
    if huidige_knop_status and not vorige_knop_status:  # Als de knop net is ingedrukt
        toggle_pauze()  # Toggle de pauze status
        laatste_tijd = huidige_tijd  # Update de laatste tijd
    vorige_knop_status = huidige_knop_status  # Update de vorige knop status

    if not pauze:  # Alleen doorgaan als de cyclus niet gepauzeerd is
        if huidige_tijd - laatste_tijd >= vertraging * 1000:  # Controleer of de vertraging is verstreken
            if index < LED_AANTAL:  # Als de index kleiner is dan het aantal leds 
                np[index] = regenboog[index % len(regenboog)] # Kleur toewijzen aan de huidige LED
                np.write()  # Schrijf de buffer naar de LED-strip
                index += 1    # Verhoog index 
                laatste_tijd = huidige_tijd  # Update de laatste tijd
            else:
                reset_leds()  # Reset alle LED's
                index = 0  # Reset index

'''Wat doet nu eigenlijk dit: index % len(kleuren)?
hier zegt men eigenlijk als de index leds groter is dan 
de index van de lijst kleuren m.a.w het aantal kleuren die in de lijst kleuren zit 
dan word de index van de lijst kleuren terug gestart van de 0 de index lijst kleuren 
dit tot dat het aantal leds die in de index leds zitten op zijn 
in deze code zijn dit 8 kleuren die in de lijst kleuren zitten 
en er zijn 16 leds geinitialiseert
wat wil zeggen dat de lijst 2 maal zal getoond worden 
indien de kleuren lijst het aantal leds overschrijd 
zullen alleen de kleuren getoond worden gelijk aan het aantal leds
bv je hebt 24 kleuren maar je hebt maar 16 leds 
dan zullen alleen de eerste 16 kleuren getoond worden zijnde 
van index 0 tot index 15
op deze manier wordt je  lijst dynamisch zonder dat je lijst out of range zal kunnen gaan
indien deze regel er niet zou staan zou de code ook nog altijd werken
voor het aantal kleuren die er in de lijst zitten en zal dan een foutmelding geven 
dus kan je deze regel weglaten?
ja dit kan maar dan zal je altijd evenveel kleuren 
in de lijst kleuren moeten zetten 
dan het aantal leds dat je hebt geinitialiseert
'''