Adafruit_Learning_System_Gu.../Motion_Buddy/code.py
2022-12-21 15:48:18 -05:00

115 lines
3 KiB
Python

# SPDX-FileCopyrightText: 2022 Charlyn G for Adafruit Industries
#
# SPDX-License-Identifier: MIT
#
# Code for the Adafruit Learning System tutorial
# Exercise Buddy: Motion aware BLE media controller
# https://learn.adafruit.com/exercise-buddy/overview
#
import time
import board
import supervisor
import neopixel
import adafruit_ble
import adafruit_lis3dh
from adafruit_ble.advertising.standard import SolicitServicesAdvertisement
from adafruit_ble_apple_media import AppleMediaService, UnsupportedCommand
# Initialize the accelerometer
i2c = board.I2C() # uses board.SCL and board.SDA
# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c)
# Initialize BLE radio
radio = adafruit_ble.BLERadio()
a = SolicitServicesAdvertisement()
a.solicited_services.append(AppleMediaService)
radio.start_advertising(a)
# Neopixel indicator
pixel_pin = board.NEOPIXEL
pixel = neopixel.NeoPixel(pixel_pin, 1, brightness=0.5)
YELLOW = (200, 150, 0)
CYAN = (0, 100, 100)
PINK = (231, 84, 128)
pixel.fill(PINK)
while not radio.connected:
pass
print("connected")
pixel.fill(YELLOW)
# Initialize variables
last_x = 0
last_y = 0
last_z = 0
paused = True
WAIT = 0.2
WIGGLE_ROOM = 5 # Increase this for more jitter compensation.
def is_same_pos(last_position, current_position):
# Returns true if current_position is similar enough
# to last_position, within the specified wiggle room.
diff = abs(current_position - last_position)
print((diff,))
return diff <= WIGGLE_ROOM
def not_enough_movement(x, y, z):
same_x = is_same_pos(last_x, x)
same_y = is_same_pos(last_y, y)
same_z = is_same_pos(last_z, z)
return same_x and same_y and same_z
while radio.connected:
for connection in radio.connections:
if not connection.paired:
connection.pair()
print("paired")
pixel.fill(PINK)
time.sleep(1)
if connection.paired:
pixel.fill(CYAN)
ams = connection[AppleMediaService]
print("app:", ams.player_name)
try:
xf, yf, zf = lis3dh.acceleration
if not_enough_movement(xf, yf, zf):
# Keep pausing.
print("pause!")
paused = True
ams.pause()
else:
last_x = xf
last_y = yf
last_z = zf
if paused:
print("play!")
paused = False
ams.play()
except OSError:
supervisor.reload()
except UnsupportedCommand:
# This means that we tried to pause but there's
# probably nothing playing yet, so just wait a bit
# and try again.
pixel.fill(PINK)
time.sleep(10)
supervisor.reload()
time.sleep(WAIT)
print("disconnected")
pixel.fill(PINK)