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