"""Short APA102 activity flashes for the T-Dongle-S3's onboard RGB LED.""" import time from machine import Pin # Verified against LILYGO's T-Dongle-S3 pin map. The APA102 uses BGR order. _DATA_PIN = 40 _CLOCK_PIN = 39 _PULSE_MS = 90 _BRIGHTNESS = 1 # APA102 global brightness: 1 (dim) through 31 (full). class ActivityLed: """Drive the single onboard APA102 LED without delaying the main loop.""" def __init__(self): self._available = True self._off_at = None try: self._data = Pin(_DATA_PIN, Pin.OUT, value=0) self._clock = Pin(_CLOCK_PIN, Pin.OUT, value=0) self._write(0, 0, 0) except (OSError, ValueError): # Keep display-less or alternate ESP32-S3 development boards usable. self._available = False def pulse(self, red, green, blue, now): """Show one colour briefly; a later event simply extends the flash.""" if not self._available: return self._write(red, green, blue) self._off_at = time.ticks_add(now, _PULSE_MS) def tick(self, now): """Turn the LED off after its scheduled pulse without sleeping.""" if (self._available and self._off_at is not None and time.ticks_diff(now, self._off_at) >= 0): self._write(0, 0, 0) self._off_at = None def _write(self, red, green, blue): # APA102: start frame, global-brightness pixel frame, end frame. self._send_byte(0) self._send_byte(0) self._send_byte(0) self._send_byte(0) self._send_byte(0xE0 | _BRIGHTNESS) self._send_byte(blue) self._send_byte(green) self._send_byte(red) self._send_byte(0xFF) self._send_byte(0xFF) self._send_byte(0xFF) self._send_byte(0xFF) def _send_byte(self, value): for bit in range(7, -1, -1): self._data.value((value >> bit) & 1) self._clock.on() self._clock.off()