import uasyncio as asyncio import machine class LED(): def __init__(self, pin): self.pin = machine.PWM(machine.Pin(pin,machine.Pin.OUT),freq=2000,duty=0) self.pwmDutyOff = 0 self.pwmDutyOn = 1023 self.pwmDuty = 0 self.blinkRateOff = None self.blinkRateOn = None self.blinkRate = None self.onState = False self.blinkOn = False loop = asyncio.get_event_loop() loop.create_task(self._update_async()) async def _update_async(self): while True: if self.blinkRate == None or self.blinkRate <= 0: await asyncio.sleep_ms(200) else: self.pin.duty(self.pwmDuty if self.blinkOn else 0) self.blinkOn = not self.blinkOn # TODO split long waits into multible ones so we catch changes more often await asyncio.sleep_ms(int(500 / self.blinkRate)) def toggle(self): self.onState = not self.onState self.value(self.onState) def setOnState(self, blinkRate = None, pwmDuty = 1023, ): self.blinkRateOn = blinkRate self.pwmDutyOn = pwmDuty def setOffState(self, blinkRate = None, pwmDuty = 0): self.blinkRateOff = blinkRate self.pwmDutyOff = pwmDuty def on(self): self.value(True) def off(self): self.value(False) def value(self,value=None): if value!=None: self.onState = value self.blinkRate = self.blinkRateOn if self.onState else self.blinkRateOff self.pwmDuty = (self.pwmDutyOn if self.onState else self.pwmDutyOff) self.pin.duty(self.pwmDuty if self.blinkOn else 0) return self.onState