-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcode.py
63 lines (51 loc) · 1.74 KB
/
code.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from _bleio import adapter
from board import IMU_PWR, IMU_SCL, IMU_SDA
from busio import I2C
from digitalio import DigitalInOut, Direction
from time import sleep
from adafruit_lsm6ds.lsm6ds3 import LSM6DS3
# Customize the device behavior here
DEVICE_NAME = "XIAO nRF52840 Sense"
INTERVAL = 0.1
SENSITIVITY = 0.01
# Turn on IMU and wait 50 ms
imu_pwr = DigitalInOut(IMU_PWR)
imu_pwr.direction = Direction.OUTPUT
imu_pwr.value = True
sleep(0.05)
# Set up I2C bus and initialize IMU
i2c_bus = I2C(IMU_SCL, IMU_SDA)
sensor = LSM6DS3(i2c_bus)
class BTHomeAdvertisement:
_ADV_FLAGS = [0x02, 0x01, 0x06]
_ADV_SVC_DATA = [0x06, 0x16, 0xD2, 0xFC, 0x40, 0x22, 0x00]
def _name2adv(self, local_name):
adv_element = bytearray([len(local_name) + 1, 0x09])
adv_element.extend(bytes(local_name, "utf-8"))
return adv_element
def __init__(self, local_name=None):
if local_name:
self.adv_local_name = self._name2adv(local_name)
else:
self.adv_local_name = self._name2adv(adapter.name)
def adv_data(self, movement):
adv_data = bytearray(self._ADV_FLAGS)
adv_svc_data = bytearray(self._ADV_SVC_DATA)
adv_svc_data[-1] = movement
adv_data.extend(adv_svc_data)
adv_data.extend(self.adv_local_name)
return adv_data
bthome = BTHomeAdvertisement(DEVICE_NAME)
while True:
gyro_x, gyro_y, gyro_z = sensor.gyro
moving = gyro_x**2 + gyro_y**2 + gyro_z**2
if moving > SENSITIVITY:
print("Moving")
adv_data = bthome.adv_data(1)
else:
adv_data = bthome.adv_data(0)
adapter.start_advertising(
adv_data, scan_response=None, connectable=False, interval=INTERVAL * 2
)
sleep(INTERVAL)
adapter.stop_advertising()