import uasyncio as asyncio import machine class LED(): def __init__(self, pin): self.pin = machine.PWM(machine.Pin(pin),freq=1000,duty=512)#,machine.Pin.OUT self.pwmDutyOff = 0 self.pwmDutyOn = 1023 self.pwmDuty = 0 self.blinkRateOff = None self.blinkRateOn = None self.blinkRate = None self.onState = False self.blinkOn = False self.alarmWentOff = False loop = asyncio.get_event_loop() loop.create_task(self._update_async()) async def _update_async(self): self.pin.duty(0) while True: if self.blinkRate == None: await asyncio.sleep_ms(200) else: self.pin.duty(self.pwmDuty if self.blinkOn else 0) self.blinkOn = not self.blinkOn waited=0 blinkWaitMs = int(500 / self.blinkRate) while waited < blinkWaitMs: toWait = min(50,blinkWaitMs) await asyncio.sleep_ms(toWait) waited += toWait if self.blinkRate == None: break blinkWaitMs = 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 if blinkRate != None and blinkRate >= 0 else None self.pwmDutyOn = pwmDuty if self.onState: 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.blinkRate == None else 0) def setOffState(self, blinkRate = None, pwmDuty = 0): self.blinkRateOff = blinkRate if blinkRate != None and blinkRate >= 0 else None self.pwmDutyOff = pwmDuty if not self.onState: 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.blinkRate == None else 0) 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.blinkRate == None else 0) return self.onState