circuitplayground_acceleration_mapping_neopixels.py
1 """Maps acceleration (tilt) to Neopixel colors. 2 3 x, y, and z acceleration components map to red, green and blue, 4 respectively. 5 6 When the CPX is level, the lights are blue because there is no acceleration 7 on x or y, but on z, gravity pulls at 9.81 meters per second per second (m/s²). 8 When banking, the vertical (z) axis is no longer directly aligned with gravity, 9 so the blue decreases, and red increases because gravity is now pulling more 10 along the x axis. Similarly, when changing the pitch from level, we see blue change 11 to green. 12 13 This video walks you through the code: https://youtu.be/eNpPLbYx-iA 14 """ 15 16 import time 17 from adafruit_circuitplayground.express import cpx 18 19 cpx.pixels.brightness = 0.2 # Adjust overall brightness as desired, between 0 and 1 20 21 22 def color_amount(accel_component): 23 """Convert acceleration component (x, y, or z) to color amount (r, g, or b)""" 24 standard_gravity = 9.81 # Acceleration (m/s²) due to gravity at the earth’s surface 25 accel_magnitude = abs(accel_component) # Ignore the direction 26 constrained_accel = min(accel_magnitude, standard_gravity) # Constrain values 27 normalized_accel = constrained_accel / standard_gravity # Convert to 0–1 28 return round(normalized_accel * 255) # Convert to 0–255 29 30 31 def format_acceleration(): 32 return ', '.join(('{:>6.2f}'.format(axis_value) for axis_value in acceleration)) 33 34 35 def format_rgb(): 36 return ', '.join(('{:>3d}'.format(rgb_amount) for rgb_amount in rgb_amounts)) 37 38 39 def log_values(): 40 print('({}) ==> ({})'.format(format_acceleration(), format_rgb())) 41 42 43 while True: 44 acceleration = cpx.acceleration 45 rgb_amounts = [color_amount(axis_value) for axis_value in acceleration] 46 cpx.pixels.fill(rgb_amounts) 47 log_values() 48 time.sleep(0.1)