9204浏览
查看: 9204|回复: 28

[MP动手做] MicroPython动手做(22)——掌控板之无线广播

[复制链接]
1、掌控板无线广播主要函数
radio 模块提供无线广播功能,支持13 Channel,在相同的 Channel 内能接收到成员发出的广播消息,适合10米范围内的多板组网的通讯。

radio.on()
描述: 开启无线功能

radio.off()
描述: 关闭无线功能

radio.config(channel)
描述: 配置无线参数

参数:
channel (int) - 无线通道,范围1~13

radio.receive()
描述: 接收无线广播消息,消息以字符串形式返回。最大可接收250字节数据。如果没有接收到消息,则返回 None 。当 receive 内参数为 True ,即 receive(True) ,返回 (msg,mac) 的二元组。默认缺省 receive(False) ,即只返回 msg

radio.receive_bytes()
描述: 接收无线广播消息,消息以字节形式返回。其他同 radio.receive() 相同

radio.send()
描述: 发送无线广播消息,发送数据类型为字符串。当发送成功后返回 True,否则返回 False

radio.send_bytes()
描述: 发送无线广播消息,发送数据类型为字节。当发送成功后返回 True,否则返回 False

MicroPython动手做(22)——掌控板之无线广播图1

驴友花雕  中级技神
 楼主|

发表于 2020-5-7 12:50:18

5、自控行人过马路交通信号灯

#MicroPython动手做(22)——掌控板之无线广播
#自控行人过马路交通信号灯(行人控制端)

行人端红绿灯:
  ①行人方向的灯是红色的,等待行人按下A键,
  ②当行人需要过马路的时候,按下按钮,同时给行车方向的红绿灯发射信号,等待缓冲时间,红灯转绿灯。
  ③行人走完之后(绿灯亮一段时间),黄灯闪烁3次,再变为红灯。


  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #自控行人过马路交通信号灯(行人控制端)
  3. import radio
  4. from mpython import *
  5. import time
  6. import framebuf
  7. import font.digiface_44
  8. def Flash():
  9.     global i, j, k, m, n, x
  10.     for m in range(1, 4):
  11.         rgb.fill((int(255), int(255), int(0)))
  12.         rgb.write()
  13.         time.sleep_ms(1)
  14.         time.sleep_ms(500)
  15.         rgb.fill( (0, 0, 0) )
  16.         rgb.write()
  17.         time.sleep_ms(1)
  18.         time.sleep_ms(500)
  19. def _E4_BF_A1_E6_81_AF_E6_8F_90_E7_A4_BA():
  20.     global i, j, k, m, n, x
  21.     oled.fill(0)
  22.     oled.DispChar("行人如需过马路", 0, 16, 1)
  23.     oled.DispChar("请按下A键", 0, 32, 1)
  24.     oled.show()
  25. def upRange(start, stop, step):
  26.     while start <= stop:
  27.         yield start
  28.         start += abs(step)
  29. def downRange(start, stop, step):
  30.     while start >= stop:
  31.         yield start
  32.         start -= abs(step)
  33. def _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(x):
  34.     global i, j, k, m, n
  35.     for n in (1 <= int(x)) and upRange(1, int(x), 1) or downRange(1, int(x), 1):
  36.         oled.fill(0)
  37.         display_font(font.digiface_44, (str((x + 1) - n)), 32, 8, False, 2)
  38.         oled.show()
  39.         time.sleep_ms(1000)
  40. def on_button_a_down(_):
  41.     global i, j, k, m, n, x
  42.     time.sleep_ms(10)
  43.     if button_a.value() == 1: return
  44.     radio.send("1")
  45.     _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(10)
  46.     rgb.fill((int(51), int(255), int(51)))
  47.     rgb.write()
  48.     time.sleep_ms(1)
  49.     _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(12)
  50.     Flash()
  51.     rgb.fill((int(255), int(0), int(0)))
  52.     rgb.write()
  53.     time.sleep_ms(1)
  54.     _E4_BF_A1_E6_81_AF_E6_8F_90_E7_A4_BA()
  55. def display_font(_font, _str, _x, _y, _wrap, _z=0):
  56.     _start = _x
  57.     for _c in _str:
  58.         _d = _font.get_ch(_c)
  59.         if _wrap and _x > 128 - _d[2]: _x = _start; _y += _d[1]
  60.         if _c == '1' and _z > 0: oled.fill_rect(_x, _y, _d[2], _d[1], 0)
  61.         oled.blit(framebuf.FrameBuffer(bytearray(_d[0]), _d[2], _d[1],
  62.         framebuf.MONO_HLSB), (_x+int(_d[2]/_z)) if _c=='1' and _z>0 else _x, _y)
  63.         _x += _d[2]
  64. button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
  65. radio.on()
  66. radio.config(channel=11)
  67. rgb.fill((int(255), int(0), int(0)))
  68. rgb.write()
  69. time.sleep_ms(1)
  70. _E4_BF_A1_E6_81_AF_E6_8F_90_E7_A4_BA()
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-7 12:54:45

#MicroPython动手做(22)——掌控板之无线广播
#自控行人过马路交通信号灯(行车同步端)

行车端红绿灯:

  ①亮绿灯,等待接收广播指令;

  ②当接收到广播指令,等待缓冲时间,黄灯闪亮3次,红灯亮,等待15秒,行人通过后,恢复绿灯。


  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #自控行人过马路交通信号灯(行车同步端)
  3. from mpython import *
  4. from machine import Timer
  5. import radio
  6. import ubinascii
  7. _radio_msg_list = []
  8. def radio_callback(_msg):
  9.     global _radio_msg_list
  10.     try: radio_recv(_msg)
  11.     except: pass
  12.     if _msg in _radio_msg_list:
  13.         eval('radio_recv_' + bytes.decode(ubinascii.hexlify(_msg)) + '()')
  14. tim13 = Timer(13)
  15. def timer13_tick(_):
  16.     _msg = radio.receive()
  17.     if not _msg: return
  18.     radio_callback(_msg)
  19. tim13.init(period=20, mode=Timer.PERIODIC, callback=timer13_tick)
  20. import time
  21. import framebuf
  22. import font.digiface_44
  23. def upRange(start, stop, step):
  24.     while start <= stop:
  25.         yield start
  26.         start += abs(step)
  27. def downRange(start, stop, step):
  28.     while start >= stop:
  29.         yield start
  30.         start -= abs(step)
  31. def _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(x):
  32.     global k, j
  33.     for k in (1 <= int(x)) and upRange(1, int(x), 1) or downRange(1, int(x), 1):
  34.         oled.fill(0)
  35.         display_font(font.digiface_44, (str((x + 1) - k)), 32, 8, False, 2)
  36.         oled.show()
  37.         time.sleep(1)
  38.     oled.fill(0)
  39.     oled.show()
  40. def flash():
  41.     global x, k, j
  42.     for j in range(1, 4):
  43.         rgb.fill((int(255), int(255), int(0)))
  44.         rgb.write()
  45.         time.sleep_ms(1)
  46.         time.sleep_ms(500)
  47.         rgb.fill( (0, 0, 0) )
  48.         rgb.write()
  49.         time.sleep_ms(1)
  50.         time.sleep_ms(500)
  51. _radio_msg_list.append('1')
  52. def radio_recv_31():
  53.     global i, x, y
  54.     _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(7)
  55.     flash()
  56.     rgb.fill((int(255), int(0), int(0)))
  57.     rgb.write()
  58.     time.sleep_ms(1)
  59.     _E6_97_B6_E9_97_B4_E6_8F_90_E7_A4_BA(15)
  60.     rgb.fill((int(0), int(153), int(0)))
  61.     rgb.write()
  62.     time.sleep_ms(1)
  63. def display_font(_font, _str, _x, _y, _wrap, _z=0):
  64.     _start = _x
  65.     for _c in _str:
  66.         _d = _font.get_ch(_c)
  67.         if _wrap and _x > 128 - _d[2]: _x = _start; _y += _d[1]
  68.         if _c == '1' and _z > 0: oled.fill_rect(_x, _y, _d[2], _d[1], 0)
  69.         oled.blit(framebuf.FrameBuffer(bytearray(_d[0]), _d[2], _d[1],
  70.         framebuf.MONO_HLSB), (_x+int(_d[2]/_z)) if _c=='1' and _z>0 else _x, _y)
  71.         _x += _d[2]
  72. radio.on()
  73. radio.config(channel=11)
  74. rgb.fill((int(255), int(0), int(0)))
  75. rgb.write()
  76. time.sleep_ms(1)
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 11:53:26

#MicroPython动手做(22)——掌控板之无线广播
#A键打开绿灯,B键打开红灯——接收端

  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #A键打开绿灯,B键打开红灯——接收端
  3. import radio
  4. from mpython import *
  5. import time
  6. import music
  7. while True:
  8.     radio.on()
  9.     radio.config(channel=6)
  10.     oled.fill(0)
  11.     oled.show()
  12.     rgb.fill( (0, 0, 0) )
  13.     rgb.write()
  14.     time.sleep_ms(1)
  15.     if radio.receive() == "on":
  16.         rgb.fill((int(0), int(102), int(0)))
  17.         rgb.write()
  18.         time.sleep_ms(1)
  19.         music.pitch(440, 500)
  20.         oled.fill(0)
  21.         oled.DispChar("on 绿灯", 40, 22, 1)
  22.         oled.show()
  23.         time.sleep(1)
  24.     if radio.receive() == "off":
  25.         rgb.fill((int(102), int(0), int(0)))
  26.         rgb.write()
  27.         time.sleep_ms(1)
  28.         music.pitch(294, 500)
  29.         oled.fill(0)
  30.         oled.DispChar("off 红灯", 40, 22, 1)
  31.         oled.show()
  32.         time.sleep(1)
复制代码

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-1 15:41:19

2、无线广播的简单实验(需要二块掌控板)

#MicroPython动手做(22)——掌控板之无线广播
#无线广播发射端程序

  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #无线广播发射端程序
  3. from mpython import *
  4. import time
  5. import radio
  6. oled.fill(0)
  7. oled.DispChar('        13频道广播哦', 0, 16, 1)
  8. oled.show()
  9. rgb[1] = (int(51), int(204), int(0))
  10. rgb.write()
  11. time.sleep_ms(1)
  12. while True:
  13.     radio.on()
  14.     radio.config(channel=13)
  15.     radio.send('msg')
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-1 15:44:52

#MicroPython动手做(22)——掌控板之无线广播
#无线广播接收端程序

  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #无线广播接收端程序
  3. import radio
  4. from mpython import *
  5. import time
  6. from machine import Timer
  7. import ubinascii
  8. def radio_recv(_msg):
  9.     rgb[1] = (int(255), int(0), int(0))
  10.     rgb.write()
  11.     time.sleep_ms(1)
  12.     oled.fill(0)
  13.     oled.DispChar("       收到13频道广播", 0, 16, 1)
  14.     oled.show()
  15. _radio_msg_list = []
  16. def radio_callback(_msg):
  17.     global _radio_msg_list
  18.     try: radio_recv(_msg)
  19.     except: pass
  20.     if _msg in _radio_msg_list:
  21.         eval('radio_recv_' + bytes.decode(ubinascii.hexlify(_msg)) + '()')
  22. tim13 = Timer(13)
  23. def timer13_tick(_):
  24.     _msg = radio.receive()
  25.     if not _msg: return
  26.     radio_callback(_msg)
  27. tim13.init(period=20, mode=Timer.PERIODIC, callback=timer13_tick)
  28. while True:
  29.     radio.on()
  30.     radio.config(channel=13)
  31.     oled.fill(0)
  32.     oled.DispChar("            接收状态", 0, 16, 1)
  33.     oled.show()
  34.     rgb.fill( (0, 0, 0) )
  35.     rgb.write()
  36.     time.sleep_ms(1)
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-1 16:07:06

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-1 16:11:08

无线广播发射端程序(mPython 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-1 16:15:52

无线广播接收端程序(mPthon X 图形编程)
MicroPython动手做(22)——掌控板之无线广播图1






回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 10:37:20

3、AB键组网控制RGB灯


  1. #MicroPython动手做(22)——掌控板之无线广播
  2. # AB键组网控制RGB灯——控制端
  3. from mpython import *
  4. import time
  5. import radio
  6. rgb[1] = (int(0), int(102), int(0))
  7. rgb.write()
  8. time.sleep_ms(1)
  9. while True:
  10.     radio.on()
  11.     radio.config(channel=6)
  12.     if button_a.value() == 0:
  13.         radio.send('on')
  14.     if button_b.value() == 0:
  15.         radio.send('off')
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 10:51:08

掌控板之无线广播工作时(发射)的串口信息如下


MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 10:54:24

无线广播发射端程序(mPython 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 10:58:33

#MicroPython动手做(22)——掌控板之无线广播
# AB键组网控制RGB灯——接收端

  1. #MicroPython动手做(22)——掌控板之无线广播
  2. # AB键组网控制RGB灯——接收端
  3. import radio
  4. from mpython import *
  5. import time
  6. while True:
  7.     radio.on()
  8.     radio.config(channel=6)
  9.     rgb.fill( (0, 0, 0) )
  10.     rgb.write()
  11.     time.sleep_ms(1)
  12.     if radio.receive():
  13.         rgb.fill((int(102), int(0), int(0)))
  14.         rgb.write()
  15.         time.sleep_ms(1)
  16.     else:
  17.         rgb[1] = (int(0), int(102), int(0))
  18.         rgb.write()
  19.         time.sleep_ms(1)
复制代码

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 11:03:52

无线广播接收端程序(mPthon X 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 11:13:18

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 11:47:17

4、A键打开绿灯,B键打开红灯



  1. #MicroPython动手做(22)——掌控板之无线广播
  2. #A键打开绿灯,B键打开红灯——控制端
  3. from mpython import *
  4. import time
  5. import radio
  6. rgb[1] = (int(0), int(102), int(0))
  7. rgb.write()
  8. time.sleep_ms(1)
  9. while True:
  10.     radio.on()
  11.     radio.config(channel=6)
  12.     if button_a.value() == 0:
  13.         radio.send('on')
  14.     if button_b.value() == 0:
  15.         radio.send('off')
复制代码
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 11:50:24

无线广播发射端程序(mPython 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 13:04:47

无线广播接收端程序(mPthon X 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-2 15:29:23

视频:A键打开绿灯,B键打开红灯
https://v.youku.com/v_show/id_XN ... kuUgc_1.dscreenshot




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-7 12:59:22

行人控制端(mPthon X 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-5-7 13:18:26

行车同步端(mPython 图形编程)

MicroPython动手做(22)——掌控板之无线广播图1
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail