import time from hwconfig import LED # Using sleep_ms() gives pretty poor PWM resolution and # brightness control, but we use it in the attempt to # make this demo portable to even more boards (e.g. to # those which don't provide sleep_us(), or provide, but # it's not precise, like would be on non realtime OSes). # We otherwise use 20ms period, to make frequency not less # than 50Hz to avoid visible flickering (you may still see # if you're unlucky). def pwm_cycle(led, duty, cycles): duty_off = 20 - duty for i in range(cycles): if duty: led.on() time.sleep_ms(duty) if duty_off: led.off() time.sleep_ms(duty_off) # At the duty setting of 1, an LED is still pretty bright, then # at duty 0, it's off. This makes rather unsmooth transition, and # breaks fade effect. So, we avoid value of 0 and oscillate between # 1 and 20. Actually, highest values like 19 and 20 are also # barely distinguishible (like, both of them too bright and burn # your eye). So, improvement to the visible effect would be to use # more steps (at least 10x), and then higher frequency, and use # range which includes 1 but excludes values at the top. while True: # Fade in for i in range(1, 21): pwm_cycle(LED, i, 2) # Fade out for i in range(20, 0, -1): pwm_cycle(LED, i, 2)