from machine import Pin, PWM, Timer
from micropython import const

LED_DUTY_MAX = const(65535)
LED_DUTY_MIN = const(0)
LED_TIMER_INVL = const(20)  # 占空比调节定时器的定时间隔,单位ms,不能为0
LED_BREATH_INVL = const(2000)  # 呼吸灯从ON->OFF的时间,单位ms.不能为0

timer_led = Timer(0)
breathled = PWM(Pin(2), freq=500, duty_u16=0)
calc_cache = 0
led_duty_invl = int((LED_DUTY_MAX - LED_DUTY_MIN) // (LED_BREATH_INVL // LED_TIMER_INVL))
led_duty = 0  # 占空比

def led_duty_handle(t):
    """
    led灯占空比调节的函数
    :return:
    """
    global led_duty, calc_cache, led_duty_invl
    if calc_cache:
        led_duty += led_duty_invl
        if led_duty > LED_DUTY_MAX:
            calc_cache = False
            led_duty = LED_DUTY_MAX
    else:
        led_duty -= led_duty_invl
        if led_duty < LED_DUTY_MIN:
            calc_cache = True
            led_duty = LED_DUTY_MIN
    breathled.duty_u16(led_duty)


def ledctrl_ledon():
    timer_led.init(period=LED_TIMER_INVL,
               mode=Timer.PERIODIC,
               callback=led_duty_handle)  # 占空比调节的定时器

def ledctrl_ledoff():
    timer_led.deinit()
    breathled.duty_u16(0)


if __name__ == '__main__':
    import time
    lednow = False

    def btnhandle():
        global lednow
        if btn.value() == 0:
            time.sleep_ms(20)
            if btn.value() == 0:
                if not lednow:
                    ledctrl_ledon()
                    lednow = True
                    print("btn ctrl led on")
                else:
                    ledctrl_ledoff()
                    lednow = False
                    print("btn ctrl led off")
            while btn.value() == 0:
                time.sleep_ms(10)


    btn = Pin(0, Pin.IN, Pin.PULL_UP)
    print("program start")
    while True:
        time.sleep_ms(100)
        btnhandle()