import time
from machine import Pin, PWM

# Maak een servo-object aan
servo_pin = 25
pwm_output = PWM(Pin(servo_pin), freq=50, duty=0)

# Initialisatie van variabelen
servo_vorige_tijd = time.ticks_ms()
servo_vertraging = 30
slagboom_gesloten = False
step = 75
max_steps = 75
step_size = 1
timestamp = 0
led_status = 0
knipper_interval = 500

led_pins = [21, 22, 23]

# Initialiseer LED-pinnen
for pin in led_pins:
    led = Pin(pin, Pin.OUT)
    led.value(0)

# Functie om LED's aan te sturen
def stuur(led1, led2, led3):
    Pin(led_pins[0], Pin.OUT).value(led1)
    Pin(led_pins[1], Pin.OUT).value(led2)
    Pin(led_pins[2], Pin.OUT).value(led3)

# Functie om de slagboom te sluiten
def slagboom_sluiten():
    global step, slagboom_gesloten, servo_vorige_tijd
    if time.ticks_diff(time.ticks_ms(), servo_vorige_tijd) > servo_vertraging:
        servo_vorige_tijd = time.ticks_ms()
        pwm_output.duty(step)
        step += 1
        if step > max_steps:
            slagboom_gesloten = True
            step = max_steps

# Functie om de slagboom te openen
def slagboom_openen():
    global step, slagboom_gesloten, servo_vorige_tijd
    if time.ticks_diff(time.ticks_ms(), servo_vorige_tijd) > servo_vertraging:
        servo_vorige_tijd = time.ticks_ms()
        pwm_output.duty(step)
        step -= 1
        if step < 0:
            slagboom_gesloten = False
            step = 0

# Functie om LED's te laten knipperen
def knipperen(status1, status2, status3):
    global timestamp, led_status
    if time.ticks_diff(time.ticks_ms(), timestamp) >= knipper_interval:
        timestamp = time.ticks_ms()
        led_status = not led_status
        stuur(status1, status2, status3)

# Hoofdlus
knop1 = Pin(4, Pin.IN, Pin.PULL_UP)
vorige_knop_status = knop1.value()
timer_start = 0  # Timer voor vertraging

while True:
    knop1_ingedrukt = not knop1.value()

    if knop1_ingedrukt and vorige_knop_status == 1:
        if not slagboom_gesloten:  # Alleen als de slagboom open is
            timer_start = time.ticks_ms()  # Start de timer
        slagboom_gesloten = not slagboom_gesloten

    if slagboom_gesloten:
        if time.ticks_diff(time.ticks_ms(), timer_start) >= 2000:  # 2 seconden vertraging
            slagboom_sluiten()
        knipperen(0, led_status, not led_status)
    else:
        slagboom_openen()
        if step == 0:
            knipperen(led_status, 0, 0)
        else:
            knipperen(0, led_status, not led_status)

    vorige_knop_status = knop1.value()