所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
#大冒险#僵尸入侵探测器
汤果 汤果 2020-09-14 08:45:26
1
0
简单

【项目介绍】

这个项目的名称为僵尸入侵探测器,功能是用来检测房屋四周是否有僵尸靠近。如果僵尸靠近,系统会发出警报声,并点亮红色警报灯,提示入侵。该入侵系统还具备遥控开关功能,可以在不需要使用的时候关闭。

【解决方案】

僵尸入侵探测用到的是红外热释电运动传感器,可以在房屋各个方向都装上这个传感器,这样就可以不留死角地检测到所有靠近房屋的僵尸。红外热释电运动传感器能检测运动的人或动物身上发出的红外线,从而判断是否有生物靠近。

我们的僵尸入侵探测器需要实现以下功能:

1.检测各个方向是否有僵尸入侵。

2.如有僵尸入侵发出警报。

3.统计入侵发生的人次。

4.探测器可以开启和关闭。

为了便于操作,这里选用了遥控开关来开启或关闭探测器。同时为了节约成本,我们选择掌控板作为主控,免去了显示屏、蜂鸣器及 LED 灯的配备。具体用到的器材如下:

材料清单 材料清单
1x
掌控板2.0编程入门学习主控板 含microUSB转TypeC两用线
1x
micro:IO Extend micro:bit 掌控板 IO扩展板
2x
人体红外热释电运动传感器
1x
数字红外接收模块
1x
红外遥控器(2按键)

【作品演示】

【制作过程】

步骤1 步骤1
设备连线

我们需要用到若干个红外热释电运动传感器,放在房屋四周。我手头只有两个,就都用上了,其中一个是 BOSON 的传感器,效果是一样的。

projectImage

红外接收模块接到 P0。两个红外热释电运动传感器分别接在 P1 和 P2 即可。注意这款扩展板需要反插掌控板!连接好如下所示:

projectImage
步骤2 步骤2
加载扩展

打开 Mind+ 软件,切换到上传模式。选择左下角的“扩展”,在“主控板”类别下选择“掌控板”。

projectImage

选择“通信模块”下的“红外接收模块”。

projectImage

将“功能模块”下的“多线程”也添加到项目中。

projectImage
步骤3 步骤3
编写代码

我们首先编写最核心的入侵检测功能。因为有多个红外热释电运动传感器,任何一个检测到入侵都需要发出警报。所以我们用“或”这个条件。当 P1 与 P2 两个任何一个检测到入侵都发出警报,即播放警报音符,点亮红色警报灯。如果没有检测到入侵就把 LED 灯熄灭。我们用子线程来实现入侵检测的功能。

projectImage

因为要统计入侵的次数,所以需要创建一个数字类型的变量“次数”来统计。另外红外接收模块接收到的信息也需要进行判断,因此也创建一个字符串类型的变量“按钮值”。

projectImage

次数统计功能是这样实现的。在子线程开启时先清零,这样统计的就是开启入侵探测器到目前为止入侵的次数,而不是一直累加。然后每当检测到入侵就把“次数”加一,这样就能统计出入侵人次了。 接着编写主程序。

主程序很简单,不停接收红外接收模块收到的值并进行判断。如果按钮 ON 按下,则打开入侵探测器,即启动子线程。如果按钮 OFF 按下则关闭系统。因为系统关闭状态下是不进行检测的,所以需要提醒用户是关掉的,用绿色 LED 来提示用户系统已经关闭。

projectImage

为什么要用子线程?因为入侵检测是要不停进行的,在一个循环里。如果直接把循环放在主程序中,那就不能一直处理红外接收模块接收到的信息了。也就是无法关闭探测器。而子线程是相对独立运行的一段程序,不会受到影响。

步骤4 步骤4
设计造型

找一个合适大小的纸盒,挖几个孔。一个给掌控板屏幕和LED,一个放红外接收模块,一个放红外热释电运动传感器。

projectImage

把器材都装进盒子里。这里用充电宝供电。

projectImage

完成后的造型是这样的:

projectImage

红外热释电运动传感器需要放在不同方向,这样能最大限度检测各个方位的入侵。

代码 代码
	                    					/*!
 * 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.造型方面有改进的空间。这个显示屏应该是放在室内的。后期可以用激光切割设计一个大一点的房间造型,这样呈现效果会好一些。

Makelog作者原创文章,未经授权禁止转载。
1
0
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]