# 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()