# Accelerometer-controlled "burning coals" display
# For the BBC Micro:bit, with the Mu Editor
# By Ido Gendel, 2017
# Share and enjoy!
# P.S. Thanks to Timo Denk for the Python advice :-)
from microbit import *
from random import randrange, seed
tickMS = 10
energy = 0
minEnergy = 2
maxEnergy = 9
maxTwinklerTicksToStart = 36
energyLossPerTick = 1
class twinkler:
def __init__(self):
self.ticksToStart = 0
self.light = 0
self.lightTarget = 0
def twinklerReset(self, energyLevel):
self.ticksToStart = max(0, randrange(maxTwinklerTicksToStart) -
energyLevel * 2)
self.light = 0
self.lightTarget = max(1, int(energyLevel))
twinklers = [twinkler() for _ in range(25)]
def getDisplayImage():
""" Convert the twinkler object data to an image string """
twinkleStr = ""
for i, t in enumerate(twinklers):
twinkleStr = twinkleStr + str(t.light)
if (i+1) % 5 == 0:
twinkleStr = twinkleStr + ":"
return Image(twinkleStr)
def cycleLights():
""" Update the twinkler objects """
for t in twinklers:
if t.ticksToStart > 0:
t.ticksToStart -= 1
continue
if t.light < t.lightTarget:
t.light += 1
if t.light == t.lightTarget:
t.lightTarget = 0
else:
t.light -= 1
if t.light < 0:
t.twinklerReset(energy)
# Initialization code
display.clear()
seed()
for t in twinklers:
t.twinklerReset(0)
lastAcc = accelerometer.get_values()
# Main loop
while True:
sleep(tickMS)
energy = max(minEnergy, energy - energyLossPerTick)
currAcc = accelerometer.get_values()
# Magic number 750 is based on trial and error
accDiff = max(abs(currAcc[0] - lastAcc[0]),
abs(currAcc[1] - lastAcc[1]),
abs(currAcc[2] - lastAcc[2])) / 750
energy = min(maxEnergy, energy + accDiff)
lastAcc = currAcc
display.show(getDisplayImage())
cycleLights()
Comments