【问题标题】:micro:bit Python send radio Imagemicro:bit Python 发送无线电图像
【发布时间】:2020-11-23 03:15:41
【问题描述】:

使用 Python 的 micro:bit 无线电 BLE

我想通过无线电发送图像集合 (Image.HEART) 的成员。我知道如何发送字符串和自定义图像,但不是 Image 集合的成员。

我希望 display.show 直接使用接收者的 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

【问题讨论】:

    标签: python image radio wireless bbc-microbit


    【解决方案1】:

    这感觉相当“hacky”和脆弱,如果出现更好的方法,我很乐意删除它,但一种有效的方法是这样的。

    如果你运行这个 (link to docs):

    repr(Image.HEART)
    

    你会得到这个:

    "Image('09090:99999:99999:09990:00900:')"
    

    如果您查看 Image 类 (link to docs) 的文档,您会发现可以从该字符串创建一个新的 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
    

    【讨论】:

    • 马克:它可能是“hacky”,但是:1)它可以工作 2)这是最好的答案。谢谢。
    【解决方案2】:

    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 上定义相同

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2021-08-22
      • 2022-08-18
      • 1970-01-01
      • 2017-07-14
      • 2018-09-01
      • 2018-05-15
      • 2013-12-01
      • 1970-01-01
      相关资源
      最近更新 更多