【项目介绍】
这个项目的名称为僵尸入侵探测器,功能是用来检测房屋四周是否有僵尸靠近。如果僵尸靠近,系统会发出警报声,并点亮红色警报灯,提示入侵。该入侵系统还具备遥控开关功能,可以在不需要使用的时候关闭。
【解决方案】
僵尸入侵探测用到的是红外热释电运动传感器,可以在房屋各个方向都装上这个传感器,这样就可以不留死角地检测到所有靠近房屋的僵尸。红外热释电运动传感器能检测运动的人或动物身上发出的红外线,从而判断是否有生物靠近。
我们的僵尸入侵探测器需要实现以下功能:
1.检测各个方向是否有僵尸入侵。
2.如有僵尸入侵发出警报。
3.统计入侵发生的人次。
4.探测器可以开启和关闭。
为了便于操作,这里选用了遥控开关来开启或关闭探测器。同时为了节约成本,我们选择掌控板作为主控,免去了显示屏、蜂鸣器及 LED 灯的配备。具体用到的器材如下:
【作品演示】
【制作过程】
步骤1 设备连线
我们需要用到若干个红外热释电运动传感器,放在房屋四周。我手头只有两个,就都用上了,其中一个是 BOSON 的传感器,效果是一样的。
红外接收模块接到 P0。两个红外热释电运动传感器分别接在 P1 和 P2 即可。注意这款扩展板需要反插掌控板!连接好如下所示:
步骤2 加载扩展
打开 Mind+ 软件,切换到上传模式。选择左下角的“扩展”,在“主控板”类别下选择“掌控板”。
选择“通信模块”下的“红外接收模块”。
将“功能模块”下的“多线程”也添加到项目中。
步骤3 编写代码
我们首先编写最核心的入侵检测功能。因为有多个红外热释电运动传感器,任何一个检测到入侵都需要发出警报。所以我们用“或”这个条件。当 P1 与 P2 两个任何一个检测到入侵都发出警报,即播放警报音符,点亮红色警报灯。如果没有检测到入侵就把 LED 灯熄灭。我们用子线程来实现入侵检测的功能。
因为要统计入侵的次数,所以需要创建一个数字类型的变量“次数”来统计。另外红外接收模块接收到的信息也需要进行判断,因此也创建一个字符串类型的变量“按钮值”。
次数统计功能是这样实现的。在子线程开启时先清零,这样统计的就是开启入侵探测器到目前为止入侵的次数,而不是一直累加。然后每当检测到入侵就把“次数”加一,这样就能统计出入侵人次了。 接着编写主程序。
主程序很简单,不停接收红外接收模块收到的值并进行判断。如果按钮 ON 按下,则打开入侵探测器,即启动子线程。如果按钮 OFF 按下则关闭系统。因为系统关闭状态下是不进行检测的,所以需要提醒用户是关掉的,用绿色 LED 来提示用户系统已经关闭。
为什么要用子线程?因为入侵检测是要不停进行的,在一个循环里。如果直接把循环放在主程序中,那就不能一直处理红外接收模块接收到的信息了。也就是无法关闭探测器。而子线程是相对独立运行的一段程序,不会受到影响。
步骤4 设计造型
找一个合适大小的纸盒,挖几个孔。一个给掌控板屏幕和LED,一个放红外接收模块,一个放红外热释电运动传感器。
把器材都装进盒子里。这里用充电宝供电。
完成后的造型是这样的:
红外热释电运动传感器需要放在不同方向,这样能最大限度检测各个方位的入侵。
/*!
* MindPlus
* mpython
*
*/
#include <MPython.h>
#include <DFRobot_Task.h>
#include <DFRobot_IRremote.h>
// 动态变量
String mind_s_AnNiuZhi;
volatile float mind_n_CiShu;
// 函数声明
String numberRetain(float t, uint8_t n);
newTask(loop1)
// 创建对象
IRremote_Receive remoteReceive_P0;
// 主程序开始
void setup() {
mPython.begin();
remoteReceive_P0.begin(P0);
}
void loop() {
mind_s_AnNiuZhi = (remoteReceive_P0.getIrCommand());
// 按钮ON按下
if ((mind_s_AnNiuZhi==String("FF02FD"))) {
rgb.write(-1, 0x000000);
display.setCursorLine(1);
display.printLine("系统开启");
taskStart(loop1);
}
else if ((mind_s_AnNiuZhi==String("FF9867"))) {
taskFree(loop1);
rgb.write(-1, 0x00FF00);
display.fillInLine(2, 0);
display.setCursorLine(1);
display.printLine("系统关闭");
}
}
// 子线程1程序开始
void loop1::setup() {
mind_n_CiShu = 0;
}
void loop1::loop() {
if (((digitalRead(P1)) || (digitalRead(P2)))) {
rgb.write(-1, 0xFF0000);
mind_n_CiShu += 1;
display.setCursorLine(2);
display.printLine((String("入侵人次:") + String(numberRetain(mind_n_CiShu,0))));
buzz.freq(784, BEAT_4);
}
else {
rgb.write(-1, 0x000000);
}
}
// 静态函数
String numberRetain(float t, uint8_t n)
{
String t2 = String(t,n+1);
if(n<=0){
return t2.substring(0,t2.length()-2);
}else{
return t2.substring(0,t2.length()-1);
}
}
附件
【总结】
1.僵尸入侵检测的基本功能已经实现。但是红外热释电运动传感器无法区分是人还是僵尸,运动的动物也会触发警报。所以可能还需要辅助人工观察,或者加个摄像头。
2.造型方面有改进的空间。这个显示屏应该是放在室内的。后期可以用激光切割设计一个大一点的房间造型,这样呈现效果会好一些。
评论