二、实践目标
本实践项目运用两块掌控板作为智能终端,结合红外线光电开关来实现人的检测和警报功能。
三、知识目标
- 认识红外线光电开关;
- 理解红外线光电开关的使用和接线方法,能根据连线图进行实物连接;
- 掌握以掌控板为智能终端,通过BXY软件编写代码采集红外线光电开关反馈数据的方法;
- 掌握以掌控板为智能终端,通过BXY软件编写代码实现两块主控板之间的数据传送.
四、实践准备
硬件清单
知识链接
简介:红外线光电开关是一款通过红外测距的检测开关,检测障碍距离为0-2m,可通过调节螺母进行调节。模块抗干扰能力强,检测反应灵敏。它可以应用于很多方面,如电子门童、自动门、停车位检测等。红外线光电开关可用于各种应用场合,在使用红外线光电开关时,应注意环境条件,以使红外线光电开关能够正常可靠的工作。红外线光电开关在环境照度较高时,一般都能稳定工作。但应避免将传感器光轴正对太阳光、白炽灯等强光源。
五、实践过程
在本项目中,我们将利用两块掌控板和红外线光电开关,分三步设计一个防盗报警系统。系统中,一块掌控板通过红外线光电传感器检测人并将数据发送出来,另一块掌控板接收数据并实现警报功能。
- 实时检测红外数据
- 发送数据
- 接收数据
任务1:红外数据实时检测
1、硬件搭建
STEP1:将一块掌控板插入I/O扩展板,注意正反
STEP2:按下图通过连接线将红外线光电开关接入扩展板。
STEP3:通过USB连接线将掌控板接到计算机。
2、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z5.1”。
STEP2:程序编写
from mpython import * # 导入mpython模块
import time
p8=MPythonPin(8,PinMode.IN) #将引脚(P8)设置为"PinMode.IN"模式
while True:
value=p8.read_digital() # 读取P8引脚的数字输入
oled.DispChar("Button_a:%d" %value,30,20) # 显示至oled上
oled.show() # 刷新
oled.fill(0) # 清屏
time.sleep(0.1)
3、运行调试
STEP1:点击“烧录”上传程序并运行
观察掌控板,我们可以发现当红外线光电开关前有障碍物时,屏幕显示的值为0,而当开关前空无一物时,屏幕则显示数值1。
任务2:发送红外数据
在上个任务中,我们已经成功借助红外线光电开关来实现人的检测。当有人经过时,传感器的反馈值会由1变为0。但刚才我们仅仅是在软件终端显示了数据。接下来我们需要将数据发送出来,以便后续另一块掌控板接收数据并反馈。
1、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z5.2”。
STEP2:程序编写
from mpython import *
import time
import radio
p8=MPythonPin(8,PinMode.IN)
# 实例化MPythonPin,将引脚(P8)设置为"PinMode.IN"模式
radio.on()
radio.config(channel = 7)
while True:
alarm=p8.read_digital()
if alarm == 0:
radio.send("Warning")
oled.DispChar("nonnono" ,30,20)
oled.show()
oled.fill(0)
else:
radio.send("Safe")
oled.DispChar("okokok" ,30,20)
oled.show()
oled.fill(0)
注:关于radio的介绍可见附录1
2、运行调试
STEP1:点击“烧录”上传程序并运行
观察掌控板,我们可以发现当有人从红外线光电开关前经过时,屏幕显示“nonono”。当人离开后,屏幕则显示“okokok”
任务3:接收红外数据
在之前的任务中,我们已经利用红外线光电传感器实现了人的检测并将数据发送出来,接下来,我们还需使另一个掌控板接收数据并模拟警报功能。
1、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z5.3”。
STEP2:程序编写
from mpython import *
import radio
import _thread
radio.on()
radio.config(channel=7) # radio通道设置
def rec_loop(): # radio接收循环
while True:
value=radio.receive() # radio 接收数据,返回msg
if value: # 当接收到数据时显示
oled.DispChar(value,30,20)
oled.show()
oled.fill(0)
_thread.start_new_thread(rec_loop, ())
2、运行调试
STEP1:更换掌控板
STEP2:上传且运行程序,并使两块掌控板都通电
红外光电开关前无障碍物时,发射端掌控板屏幕显示okokok,接收端掌控板屏幕显示Safe。
发射端红外光电开关前有障碍物时,发射端掌控板屏幕显示nonono,接收端掌控板屏幕显示Warning。
六、延伸拓展
拿出手中的红外线光电开关,测试当它前方距离多少时会触发?检测每次测试结果是否相同,想一想这是为什么呢?
附录
附录1:扩展阅读
简介:radio 模块提供无线广播功能,支持13 频道(Channel),在相同的频道(Channel)内能接收到成员发出的广播消息,适合10米范围内的多板组网的通讯。
要使用此模块首先需要:
-
import radio
函数
-
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.send()
发送无线广播消息,发送数据类型为字符串。当发送成功后返回True,否则返回False。