“初中男生因急着上课,急着推开教室门,没看到门后有女同学,将女同学撞伤……”。网络上、生活中经常听到类似这样的“事故”。百度搜索“教室门 撞人”,得到500000条相关信息。
# 创作灵感
在我们班里虽未出现这样严重的撞人事件,但平时也免不了开门时碰到在门后的同学。因为一般教室门上的可观察门后情况的玻璃都比较小,有时因为着急,也未看清楚就急着开门,这样就撞到同学了。
为此我二人团队,决定开发一个“教室门防撞报警器”,来解决这个问题。
# 设计思路
如果能在教室门外放置一灯光提醒器,当门后有人时,灯光亮起。提醒开门人要注意门后可能有人,可以在推门前,先敲一下,当灯光熄灭后再开门进入。
门内传感器使用三个“超声波”,构成三角形,检测位于门后的人,尤其是蹲在门后的人。门前提醒器使用彩色灯带,亮起时比较醒目,并在中间用文字说明进行提醒。门前、门后两个Arduino控制器采用2.4G无线传输nRF24L01进行通信。
材料清单
- Arduino X2
- 超声波传感器 X3
- 2.4G无线nRF24L01 X2
- DFRobot彩色LED灯带+驱动板 X1
- 旧充电宝 X2
# 电路设计
为了方便编写程序,先设计“防撞报警器”的电路连接关系,电路原理图如下图所示。# 程序设计
在写程序之前,先梳理一下思路,设计一下程序流程图,如下图所示。当三个超声波传感器中只要有一个检测到与障碍物距离在50cm以内,就通过nRF24L01发送信息,通知接收端“报警器”点亮彩灯带,提醒门外同学注意。图:门后检测器程序流程图
图:门前报警器程序流程图
理清思路后,打开Arduino IDE正式开始编写程序。
//发射端程序
//加载nRF24L01库
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int value;//发送标识(有人1,无人0)
float dis;
float dis2;
float dis3;
float checkdistance_3_4() {//传感器1
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(3, HIGH);
delayMicroseconds(10);
digitalWrite(3, LOW);
float distance = pulseIn(4, HIGH) / 58.00;
delay(10);
return distance;
}
float checkdistance_5_6() {//传感器2
digitalWrite(5, LOW);
delayMicroseconds(2);
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
float distance = pulseIn(6, HIGH) / 58.00;
delay(10);
return distance;
}
float checkdistance_9_1() {//传感器3
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);
float distance = pulseIn(10, HIGH) / 58.00;
delay(10);
return distance;
}
void setup()
{
//初始化
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, OUTPUT);
pinMode(6, INPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符
Mirf.payload = sizeof(value);
Mirf.channel = 90; //设置所用信道
Mirf.config();
}
void loop()
{
Mirf.setTADDR((byte *)"FGHIJ"); //设置接收端地址
value = 1; //0-255的随机数
//获取三个传感器的值
dis=checkdistance_3_4();
dis2=checkdistance_5_6();
dis3=checkdistance_9_1();
if(dis<50 || dis2<50 || dis3<50){//判断是否有人
Mirf.send((byte *)&value); //发送指令,发送value
while(Mirf.isSending()) delay(1); //直到发送成功,退出循环
}
else{
value = 0;
Mirf.send((byte *)&value); //发送指令,发送value
while(Mirf.isSending()) delay(1); //直到发送成功,退出循环
}
}
代码:门后检测器程序
//接收端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int value;
void setup()
{
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
pinMode(5,OUTPUT);//彩灯连接在引脚5
Mirf.setRADDR((byte *)"FGHIJ"); //设置自己的地址(接收端地址),使用5个字符
Mirf.payload = sizeof(value);
Mirf.channel = 90; //设置使用的信道
Mirf.config();
Serial.println("Listening..."); //开始监听接收到的数据
}
void loop()
{
if(Mirf.dataReady()) { //接收到程序
Mirf.getData((byte *) &value);
if(value==1){//为1,说明有人,点亮彩灯
digitalWrite(5,HIGH);
}
else{//为0,说明无人,熄灭彩灯
digitalWrite(5,LOW);
}
}
}
代码:门前报警器程序
# 制作过程
步骤1 安装报警器彩灯带
用热熔胶来固定彩灯带
步骤2 安装报警器无线发射模块
图:针脚说明
接线方式 Arduino uno --- nRF24L01
3.3V --- VCC
GND --- GND
7 --- CSN
8 --- CE
11 --- MOSI
13 --- SCK
12 --- MISO
*IRQ示例没有用上,则不用接线了
步骤3 安装门后超声波传感器
图:在Arduino上对应引脚连接三个超声波传感器
因门后检测器中的无线模块安装与门前报警器一致,故不再重复说明。
步骤4 应用场景安装
图:安装门前报警器
因学校所有的教室门均为铁制,所以装置采用强磁石固定。
图:安装门后检测器
# 效果演示
# 后续完善
1、准备把在门前利用“敲门”来提醒门后同学的方法,改为按一下“按钮”,然后门后有语音来进行提醒。
2、门前报警除了彩灯,再加一个显示屏进行门后有人或无人提醒。
DF-YHT2019.10.17
超级棒!
KeroQuinn2019.07.14
做的真不错!