4. 无线广播

掌控板提供2.4G的无线射频通讯,共 13 Channel。可实现一定区域内的简易组网通讯。在相同通道下,成员可接收广播消息。就类似,对讲机一样。在相同频道下,实现通话。

../../_images/radio.png

对讲机

4.1. radio

你可以用两块掌控板上传该程序,在REPL下,发送和接收广播消息
 1import radio
 2import _thread
 3
 4channel=2
 5
 6radio.on()
 7radio.config(channel=channel)               # radio通道设置
 8
 9def rec_loop():                             # radio接收循环
10    while True:
11        temp=radio.receive(True)           # radio 接收数据,返回(msg,mac)
12        # temp=radio.receive()             # radio 接收数据,返回msg
13        if temp:                           # 当接收到数据时打印
14            print(temp)
15
16_thread.start_new_thread(rec_loop, ())      # radio接收线程
17
18radio.send("hello mPython!")


首先我们需要 import radio ,导入无线模块。然后 radio.on() ,开启无线功能。配置无线通道 radio.config(channel) ,channel参数可设置1~13个通道。 使用 radio.send() 发送广播消息,消息类型为字符串。接收端,在相同channel,使用 radio.receive() 来接收广播数据。 receive(True) 返回数据类型为(msg,mac)。 mac为网络设备的MAC地址,地址均唯一。如,想做单播应用,可过滤其他MAC设备发送的消息。默认下 receive() ,返回的数据类型为msg,是不带MAC地址的。

4.2. 电报机

基于上面的radio学习,我们可以用掌控板制作个有趣的电报机!两个掌控板之间通过无线电和摩斯密码传播,是不是有谍战片的既视感咧!赶紧尝试下吧!

../../_images/telegraph.jpg

电报机

电报机示例
 1import radio                                            # 导入radio
 2from mpython import *                                   # 导入mpython
 3import music                                            # 导入music
 4
 5CH = 1                                                  # channel变量
 6
 7radio.on()
 8radio.config(channel=CH)                                # radio通道设置
 9
10btna_stat, btnb_stat, touch_stat = [0] * 3              # 按键状态标志
11
12
13def set_channel():                                      # radio 通道设置函数
14
15    global CH, btna_stat, btnb_stat
16    if button_a.value() == 0 and btna_stat == 0:        # a按键,减通道
17        CH -= 1
18        if CH < 1:
19            CH = 13
20        radio.config(channel=CH)                        # radio通道设置
21        oled.DispChar("Channel: %02d" % CH, 25, 5)      # 通道显示
22        oled.show()
23        btna_stat = 1
24    elif button_a.value() == 1:
25        btna_stat = 0
26
27    if button_b.value() == 0 and btnb_stat == 0:        # b按键,加通道
28        CH += 1
29        if CH > 13:
30            CH = 1
31        radio.config(channel=CH)                        # radio通道设置
32        oled.DispChar("Channel: %02d" % CH, 25, 5)      # 通道显示
33        oled.show()
34        btnb_stat = 1
35    elif button_b.value() == 1:
36        btnb_stat = 0
37
38
39def ding():                                             # 叮叮响
40
41    global touch_stat
42    if touchPad_T.read() < 300 and touch_stat == 0:     # 检测按键按下时,发出‘ding’响,并广播
43        music.pitch(500, 100, wait=False)              # 播放"ding"
44        radio.send('ding')                              # radio 广播 "ding"
45        touch_stat = 1
46    elif touchPad_T.read() >= 300:
47        touch_stat = 0
48
49
50oled.DispChar("Channel: %d" % CH, 25, 5)                # 开机显示
51oled.DispChar("电报机:触摸T", 25, 25)
52oled.show()
53
54while True:
55    set_channel()                                       # 设置通道函数
56    ding()                                              # 叮叮响函数
57    temp = radio.receive()                              # radio接收广播
58
59    if temp == 'ding':                                  # 当接收到"ding"广播,发出叮响
60        rgb.fill((0, 10, 0))                            # 指示灯
61        rgb.write()
62        music.pitch(500, 100, wait=False)
63        sleep_ms(50)
64        rgb.fill((0, 0, 0))
65        rgb.write()


上述电报机示例,ab按键选择无线通道,触摸T,发送电报。当接收到电报,掌控板的RGB会有指示。