KRITSADA

Class Example Light Burn from acc python microbit

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