Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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()
Add Comment
Please, Sign In to add comment