micro:bit无线电台BLE使用Python
我想通过无线电发送图像集合(Image.HEART(的成员。我知道如何发送字符串和自定义图像,但不是图像集合的成员。
我想让display.show直接使用receiver的message_in字符串(或者可能是一个要修改的中间变量(。我不想使用if/else或字典来测试接收到的字符串,以查找Image集合中的每个可能成员。
我在下面的代码中尝试过一些想法,但都失败了。我感谢你的帮助。
# micro:bit radio: Send an image from Image collection
from microbit import *
import radio
radio.config(group=1)
radio.on()
while True:
if button_a.is_pressed():
radio.send(Image.HEART) # ?????
# radio.send(index(Image.HEART)) # ?????
# radio.send(str(Image.HEART)) # ?????
# radio.send('Image.HEART') # ?????
# radio.send('HEART') # ?????
message_in = radio.receive()
if message_in != None:
display.show(message_in) #show heart
# and other tries at syntax for argument
这感觉很像"黑客">和脆性,如果出现更好的方法,我很乐意删除它,但有一种方法是这样的。
如果你运行这个(链接到文档(:
repr(Image.HEART)
你会得到这个:
"Image('09090:99999:99999:09990:00900:')"
如果查看Image
类的文档(指向文档的链接(,您会发现可以从该字符串创建一个新的Image
。所以,我现在的建议是这样做:
# Get a string corresponding to Image.HEART
s = repr(Image.HEART)[7:-3]
... TRANSMIT ...
# Convert received string back into Image
I = Image(received)
我想这是一种从repr
输出中提取数字和冒号的稍微不那么脆弱的方法,但它仍然很难看:
s = ""
for char in repr(Image.SAD):
if char in '0123456789:': s += char
Mark建议的方式运行良好,可以发送任何图像。我把它放在一个函数中,使我更容易进行实验。
from microbit import *
import radio
radio.config(group=1)
radio.on()
def tx_value(image_to_send):
return ''.join([x for x in str(image_to_send) if x in '0123456789:'])
while True:
if button_a.is_pressed() and button_b.is_pressed():
radio.send(tx_value(Image('97531:97531:97531:97531:97531')))
elif button_a.is_pressed():
radio.send(tx_value(Image.DUCK))
elif button_b.is_pressed():
radio.send(tx_value(Image.HEART))
sleep(.25)
message_in = radio.receive()
if message_in != None:
display.show(Image(message_in))
另一种方法是拥有一个图像字典,并只传输字典密钥:
from microbit import *
import radio
radio.config(group=1)
radio.on()
IMAGES = {'duck': Image.DUCK,
'heart': Image.HEART,
'fade': Image('97531:97531:97531:97531:97531')}
while True:
if button_a.is_pressed() and button_b.is_pressed():
radio.send('fade')
elif button_a.is_pressed():
radio.send('duck')
elif button_b.is_pressed():
radio.send('heart')
sleep(.25)
message_in = radio.receive()
if message_in != None:
display.show(IMAGES[message_in])
这需要在两个micro:bits 上定义相同的字典