|
|
|
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)
|