first commit
This commit is contained in:
parent
dc4618d083
commit
0ad0bb1c41
1 changed files with 101 additions and 0 deletions
101
CPB_Ornament_Proximity/cpb_ornament_proximity.py
Normal file
101
CPB_Ornament_Proximity/cpb_ornament_proximity.py
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
"""
|
||||
Circuit Playground Bluefruit Ornament Proximity
|
||||
This demo uses advertising to set the color of scanning devices depending on the strongest broadcast
|
||||
signal received. Circuit Playgrounds can be switched between advertising and scanning using the
|
||||
slide switch. The buttons change the color when advertising.
|
||||
"""
|
||||
|
||||
import time
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
import neopixel
|
||||
|
||||
from adafruit_ble import BLERadio
|
||||
from adafruit_ble.advertising.adafruit import AdafruitColor
|
||||
|
||||
# The color pickers will cycle through this list with buttons A and B.
|
||||
color_options = [0x110000,
|
||||
0x111100,
|
||||
0x001100,
|
||||
0x001111,
|
||||
0x000011,
|
||||
0x110011,
|
||||
0x111111,
|
||||
0x221111,
|
||||
0x112211,
|
||||
0x111122]
|
||||
|
||||
ble = BLERadio()
|
||||
|
||||
slide_switch = digitalio.DigitalInOut(board.SLIDE_SWITCH)
|
||||
slide_switch.pull = digitalio.Pull.UP
|
||||
button_a = digitalio.DigitalInOut(board.BUTTON_A)
|
||||
button_a.pull = digitalio.Pull.DOWN
|
||||
button_b = digitalio.DigitalInOut(board.BUTTON_B)
|
||||
button_b.pull = digitalio.Pull.DOWN
|
||||
|
||||
led = digitalio.DigitalInOut(board.D13)
|
||||
led.switch_to_output()
|
||||
|
||||
neopixels = neopixel.NeoPixel(board.NEOPIXEL, 10, auto_write=False)
|
||||
|
||||
i = 0
|
||||
advertisement = AdafruitColor()
|
||||
advertisement.color = color_options[i]
|
||||
neopixels.fill(color_options[i])
|
||||
while True:
|
||||
# The first mode is the color selector which broadcasts it's current color to other devices.
|
||||
if slide_switch.value:
|
||||
print("Broadcasting color")
|
||||
ble.start_advertising(advertisement)
|
||||
while slide_switch.value:
|
||||
last_i = i
|
||||
if button_a.value:
|
||||
i += 1
|
||||
if button_b.value:
|
||||
i -= 1
|
||||
i %= len(color_options)
|
||||
if last_i != i:
|
||||
color = color_options[i]
|
||||
neopixels.fill(color)
|
||||
neopixels.show()
|
||||
print("New color {:06x}".format(color))
|
||||
advertisement.color = color
|
||||
ble.stop_advertising()
|
||||
ble.start_advertising(advertisement)
|
||||
time.sleep(0.5)
|
||||
ble.stop_advertising()
|
||||
# The second mode listens for color broadcasts and shows the color of the strongest signal.
|
||||
else:
|
||||
closest = None
|
||||
closest_rssi = -80
|
||||
closest_last_time = 0
|
||||
print("Scanning for colors")
|
||||
while not slide_switch.value:
|
||||
for entry in ble.start_scan(AdafruitColor, minimum_rssi=-100, timeout=1):
|
||||
if slide_switch.value:
|
||||
break
|
||||
now = time.monotonic()
|
||||
new = False
|
||||
if entry.address == closest:
|
||||
pass
|
||||
elif entry.rssi > closest_rssi or now - closest_last_time > 0.4:
|
||||
closest = entry.address
|
||||
else:
|
||||
continue
|
||||
closest_rssi = entry.rssi
|
||||
closest_last_time = now
|
||||
discrete_strength = min((100 + entry.rssi) // 5, 10)
|
||||
#print(entry.rssi, discrete_strength)
|
||||
neopixels.fill(0x000000)
|
||||
for i in range(0, discrete_strength):
|
||||
neopixels[i] = entry.color
|
||||
neopixels.show()
|
||||
|
||||
# Clear the pixels if we haven't heard from anything recently.
|
||||
now = time.monotonic()
|
||||
if now - closest_last_time > 1:
|
||||
neopixels.fill(0x000000)
|
||||
neopixels.show()
|
||||
ble.stop_scan()
|
||||
Loading…
Reference in a new issue