dim LEDs
Posted: Thu Dec 19, 2019 10:28 am
I would like to dim the power LED on my Sonoff devices, because it's very bright.
I created this:
The Problem is the ... it works only for the max dim level. the lower dim levels has some flickering...
Any idea? Any better implementation?
I created this:
Code: Select all
import machine
import utime
class Led:
def __init__(self, name, pin, on, off):
self.name = name
self.pin = pin
self._on = on
self._off = off
def on(self):
self.pin.value(self._on)
def off(self):
self.pin.value(self._off)
def toggle(self):
if self.is_on:
self.off()
else:
self.on()
def flash(self, sleep=0.5, count=5):
was_on = self.is_on
for no in range(count):
self.toggle()
utime.sleep(sleep)
if was_on:
self.on()
else:
self.off()
@property
def is_on(self):
return self.pin.value() == self._on
@property
def state(self):
return 'ON' if self.is_on else 'OFF'
def __str__(self):
return '%s %s: %s' % (self.name, self.pin, self.state)
class PwmLed(Led):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dim_duty = (None, 600, 800, 950)
self.dim_max_level = len(self.dim_duty) # Dimming down to the maximum
self.current_dim_value = None # Full ON
def set_dim_level(self, dim_level):
if not 0 <= dim_level <= self.dim_max_level:
print(
'ERROR: level %r is not between 0 and %i' % (dim_level, self.dim_max_level)
)
dim_level = self.dim_max_level
self.current_dim_value = self.dim_duty[dim_level]
def on(self):
self.deinit_pwm()
if self.current_dim_value is None:
# turn full ON
super().on()
else:
machine.PWM(self.pin, freq=100, duty=self.current_dim_value)
def off(self):
self.deinit_pwm()
super().off()
def deinit_pwm(self):
machine.PWM(self.pin).deinit()
if __name__ == '__main__':
relay = Led(name='relay', pin=machine.Pin(12, machine.Pin.OUT), on=1, off=0)
power_led = PwmLed(name='power', pin=machine.Pin(13, machine.Pin.OUT), on=0, off=1)
relay.on()
utime.sleep(1)
relay.off()
for dim_level in range(power_led.dim_max_level):
power_led.off()
print(dim_level)
power_led.set_dim_level(dim_level)
power_led.on()
utime.sleep(1)
power_led.flash()
utime.sleep(1)
power_led.off()
Code: Select all
power_led.flash()
Any idea? Any better implementation?