Add blink feature

This commit is contained in:
2026-03-21 05:57:45 +01:00
parent e95c8e75e9
commit 4bcda62d97
3 changed files with 179 additions and 60 deletions

View File

@@ -1,5 +1,5 @@
from microdot import Microdot, send_file
import machine, sys, neopixel, time
import machine, sys, neopixel, time, asyncio
app = Microdot()
@@ -22,6 +22,10 @@ blColor = statusColors.get('OFF')
blStatus = 'off'
blPreviousStatus='off'
blBrightness = 0.1 # Adjust the brightness (0.0 - 1.0)
blBlinking = False
blBlinkFrequency = 0
blBlinkDuration = 0
blBlinkStartTime = 0
def __setColor(color):
r, g , b = color
@@ -152,6 +156,82 @@ async def setStatus(request, status):
return {'status': blStatus}
async def __blinkTask(color, brightness, frequency, duration):
global blBlinking, blStatus, blColor, blBrightness
blBlinking = True
interval = 1.0 / (frequency * 2) # half period in seconds
elapsed = 0.0
while blBlinking:
neoPixelStrip.fill(__setColor(color))
neoPixelStrip.write()
await asyncio.sleep(interval)
neoPixelStrip.fill((0, 0, 0))
neoPixelStrip.write()
await asyncio.sleep(interval)
if duration > 0:
elapsed += interval * 2
if elapsed >= duration:
break
# Restore previous state
blBlinking = False
__setBusyLightColor(color, brightness)
blStatus = blPreviousStatus
@app.post('/api/blink')
async def setBlink(request):
frequency = request.json.get('frequency')
duration = request.json.get('duration')
if frequency is None or duration is None:
return {'error': 'missing frequency or duration parameter'}, 400
if not isinstance(frequency, int) or frequency <= 0:
return {'error': 'frequency must be a positive integer (Hz)'}, 400
if not (isinstance(duration, (int, float))) or duration < 0:
return {'error': 'duration must be a positive float in seconds (0 = endless)'}, 400
# Save current state
global blPreviousStatus, blBlinking, blBlinkFrequency, blBlinkDuration, blBlinkStartTime
blPreviousStatus = blStatus
savedColor = blColor
savedBrightness = blBrightness
# Stop any ongoing blink
blBlinking = False
await asyncio.sleep(0)
# Save blink params
blBlinkFrequency = frequency
blBlinkDuration = duration
blBlinkStartTime = time.ticks_ms()
# Launch blink task
asyncio.create_task(__blinkTask(savedColor, savedBrightness, frequency, duration))
return {'status': 'blinking', 'frequency': frequency, 'duration': duration}
@app.get('/api/blink')
async def getBlink(request):
if blBlinking and blBlinkDuration > 0:
elapsed = time.ticks_diff(time.ticks_ms(), blBlinkStartTime) / 1000.0
remains = max(0.0, blBlinkDuration - elapsed)
else:
remains = 0.0
return {
'isblinking': blBlinking,
'frequency': blBlinkFrequency,
'duration': blBlinkDuration,
'remains': remains
}
@app.post('/api/blink/stop')
async def blinkStop(request):
global blBlinking
blBlinking = False
return {'status': blStatus}
@app.get('/api/color')
async def getColor(request):
r, g, b = neoPixelStrip.__getitem__(0)