基于arduino检测接触报警例程

文章目录


前言

  注意!由于笔者的知识水平和编程能力有限,可能写的地方存在不少错误和可以简化的地方,还望读者大大看完之后斧正。

接触报警的效果:以一个实际例子说明效果,当有人打开你的保险柜企图拿东西时,扬声器能够发声警告。

一、需要器材

  • arduino开发版*1(笔者使用的是arduino nano,¥24.5)
  • DFPlayer mini语音模块*1(¥7.3

  • sd卡*1(8G——¥9.9)

  • 喇叭*1(¥5.1)

  • TCRT5000红外传感器*1(¥1.5)

  • 杜邦线若干

  • 1kΩ电阻*2

二、使用步骤

1.连接器件

        由于没有专业软件,拿word手画了一个,能看得懂就行,左上角的是红外传感器,由于找不到图,随手去别人博客里偷了个用😋,细节都是浮云啦~

         其中,你们可能产生疑问的点,我自己来个简单的Q&A来解释一下好了:

  • Q:为什么喇叭处要接1kΩ的电阻? A:若是不接的话,语音模块将只能发出噪声,无法达到正常要求
  • Q:为什么TX和RX是反接的?A:实际上不只是在这里,只要是出现RX和TX的情况下,基本上都反过来接的。简单解释就是一个是输出信息口,一个是接受信息口,所以应当TX->RX.
  • Q:红外线接口信号接口一定是D2吗?A:当然不一定,这个是看你程序里怎么设定的。
  • Q:程序实现的大体逻辑是什么?A:红外线接受信号→单片机判断信号是否应当发声,并发送命令→语音模块收到命令,播放SD卡内的声音文件。
  • Q:实际用处可以拓展吗?A:这个就得看你自己想象力了,其实生活中最常用的地方应该是便利店内“欢迎光临”播报器了。 

        ok,废话不多说,我知道你们也懒得看,所以我把原理解释放最后了,你们懒得看就直接复制粘贴我的代码吧:

        (特别提示:DFRobotDFPlayerMini.h的库是一定要添加的,不然无法编译。添加的步骤是:项目→加载库→管理库→在搜索框里输入“DFPlayer Mini”→安装第一个

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int D2=2;//d2
int led_flag[5];//储存手是否触碰的数组
int i=0,j=0;//用于滤波循环
bool FLAG=0,FLAG_stop=0;//前者是滤波成功标识符,后者是播放完毕标识符
SoftwareSerial mySoftwareSerial(10, 11);//RX TX 软串口函数
DFRobotDFPlayerMini myDFPlayer;
void setup()
{
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.volume(30);//声音模块的音量大小

pinMode(D2,INPUT);
}
void loop()
{
   while(i<5)  
    {
      led_flag[i]=digitalRead(D2);   
      j=led_flag[i]+j;//若全有人手 输出值应该是0
      i++;
      delay(20);
     }
     if(j==0)FLAG=HIGH;//当五次循环都检测到人手时,滤波成功标识符置高
     i=0;j=0;//复位                                                                                                
   if(FLAG==HIGH and FLAG_stop==LOW){myDFPlayer.playFolder(1,2);FLAG=LOW;FLAG_stop=HIGH;} //当传感器识别到有人手时并且上次声音播放完毕时 便播放声音
   if(FLAG_stop==HIGH){delay(2000);FLAG_stop=LOW;myDFPlayer.pause();}   //播放限时的声音并停止,声音时长由delay延时决定                                             
 
}

 若是使用时出现什么问题,请在评论区提出,我会尽量解决后回复你,并且在前面的Q&A上更新,最后求求大家关注b站七海nanami啊梓从小就很可爱😋

2.使用模块原理解释

         好的,非常感谢你看到这里,说明你不只是为了应付课设而查询资料,你还希望继续了解这些模块背后的原理,那笔者就用比较简单通俗的语言来为你简单地解释一下这些模块的使用原理吧。(你应该不会是复制代码一不小心拉过头看到的吧)      

1.TCRT5000红外模块

        当你拿起这个模块时,你应该可以发现,在模块的表面有着两个突出的二极管。实际上,这两个二极管各承担了发射红外线和接收红外线的功能。当面前有物体时,红外线会被反射回来被另外一个二极管接收到,这样模块内部就会饱和,从而在信号输出口,也就是DO端口返回一个低电平,反之,D0就会返回高电平。不同的情况对应不同的返回电平,这样对程序进行编程就非常容易,当然,就这样说原理比较抽象,我们进入一个实际的例子来使用一下,应该就较好理解了。

         比如说,在大学课设经常出现寻迹小车的制作要求,其实原理就是使用两个TCRT5000来检测到车底的黑线的情况,判断后再发出是否左右转的命令。这里我们假设检测到线返回值为“1”,未检测到返回值为“0”.那么简单的循迹逻辑应该是这样的:

//TCRT5000数组用来储存传感器的返回值,
if(TCRT5000[0]==0 AND TCRT5000[1]==0){左车轮停止;右车轮停止;}//两个传感器都没检测到黑线,说明严重脱离轨道,应该停车
if(TCRT5000[0]==0 AND TCRT5000[1]==1){左车轮减速;右车轮加速;}//有一个传感器检测到黑线,说明小车正在脱离轨道,应当回调
if(TCRT5000[0]==1 AND TCRT5000[1]==0){左车轮加速;右车轮减速;}//同上,但是脱离轨道方向相反,所以反向回调
if(TCRT5000[0]==1 AND TCRT5000[1]==1){左车轮保持;右车轮保持;}//两个传感器都检测到黑线,说明在轨道,应该保持

 好,我们现在已经了解了红外传感器的使用,但是如果你曾经使用过,可能你会产生以下疑问:

  • Q:为什么我的传感器上有第四个接口AO?
  • A:实际上,前面的D0中的D和这里的A,都是analog signal 模拟信号 digital signal 数字信号的首字母简称。同样的,根据你所购买传感器不同,A0返回值的区间可能也有所不同,笔者使用的A0返回值区间为[0,65535],可能也存在[0.256]。不过D0的返回值是肯定相同的,只有0和1。
  • Q:传感器上方的旋钮是干什么用的?
  • A:是可调电位器,用来调节传感器的灵敏度,从而改变D0的返回高电平时的光照强度阈值。
  • Q:网上循迹程序中,都是使用D0接口,那么A0有什么用呢?
  • A:这个地方要说的可就不少了,在使用过的人中,应该都会发现小车循迹在不同的光线下,效果都不相同,这是由于传感器是否返回高电平由接收二极管决定,但是较高的光照强度会使得接收红外二极管误判。通常寻迹小车的使用者,会在使用前调节传感器上的电位器,再通过传感器上的指示led灯来判断是否满足需求。但是这仅仅能够满足短时间不变的光照环境,若是使用A0返回的模拟信号来判断,便可满足一个光照区间内的寻迹要求,即将上文的TCRT5000[0]==1改为1000>=TCRT5000[0]>=500。

(吃个饭先,过段时间更新,有人看d一声)


总结

        小弟最近在制作一些不起眼的小东西,在网上查询资料的时候,发现各位笔者专业水平太高,在写教程时,有些时候可能未能顾及到像小弟这样的初学者,这样会导致教程晦涩难懂,初学者双眼一抹黑,难以上手。所以在手上东西做完之后,心血来潮,准备写一写自己使用过的模块,尽量使用通俗的话来解释,如果小弟的文字能够帮助到像我一样的初学者,那小弟也会很欣慰了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值