View difference between Paste ID: vA6gPrP4 and 1pQg5e0k
SHOW: | | - or go back to the newest paste.
1
# Accelerometer-controlled "burning coals" display
2
# For the BBC Micro:bit, with the Mu Editor
3
# By Ido Gendel, 2017
4
# Share and enjoy!
5
# P.S. Thanks to Timo Denk for the Python advice :-)
6
7
from microbit import *
8
from random import randrange, seed
9
10
tickMS = 10
11
12
energy = 0
13
minEnergy = 2
14
maxEnergy = 9
15
maxTwinklerTicksToStart = 36
16
energyLossPerTick = 1
17
18
19
class twinkler:
20
    def __init__(self):
21
        self.ticksToStart = 0
22
        self.light = 0
23
        self.lightTarget = 0
24
25
    def twinklerReset(self, energyLevel):
26
        self.ticksToStart = max(0, randrange(maxTwinklerTicksToStart) -
27
                                energyLevel * 2)
28
        self.light = 0
29
        self.lightTarget = max(1, int(energyLevel))
30
31
32
twinklers = [twinkler() for _ in range(25)]
33
34
35
def getDisplayImage():
36
    """ Convert the twinkler object data to an image string """
37
    twinkleStr = ""
38
    for i, t in enumerate(twinklers):
39
        twinkleStr = twinkleStr + str(t.light)
40
        if (i+1) % 5 == 0:
41
            twinkleStr = twinkleStr + ":"
42
    return Image(twinkleStr)
43
44
45
def cycleLights():
46
    """ Update the twinkler objects """
47
    for t in twinklers:
48
        if t.ticksToStart > 0:
49
            t.ticksToStart -= 1
50
            continue
51
52
        if t.light < t.lightTarget:
53
            t.light += 1
54
            if t.light == t.lightTarget:
55
                t.lightTarget = 0
56
        else:
57
            t.light -= 1
58
            if t.light < 0:
59
                t.twinklerReset(energy)
60
61
62
# Initialization code
63
display.clear()
64
seed()
65
for t in twinklers:
66
    t.twinklerReset(0)
67
lastAcc = accelerometer.get_values()
68
69
# Main loop
70
while True:
71
    sleep(tickMS)
72
73
    energy = max(minEnergy, energy - energyLossPerTick)
74
    currAcc = accelerometer.get_values()
75
    # Magic number 750 is based on trial and error
76
    accDiff = max(abs(currAcc[0] - lastAcc[0]),
77
                  abs(currAcc[1] - lastAcc[1]),
78
                  abs(currAcc[2] - lastAcc[2])) / 750
79
    energy = min(maxEnergy, energy + accDiff)
80
    lastAcc = currAcc
81
82
    display.show(getDisplayImage())
83
    cycleLights()