KRITSADA icon

Class Example Light Burn from acc python microbit

KRITSADA | PRO | 10/28/19 09:27:59 AM UTC | 0 ⭐ | 683 👁️ | Never ⏰ | []
Python |

2.09 KB

|

None

|

0 👍

/

0 👎

# 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