如何制作一个简单的Arduino报警系统

检测运动,然后以高音调的警报声和闪烁的灯光吓跑入侵者。听起来有趣吗?当然可以。这是今天的Arduino项目的目标,适合初学者。在进行过程中,我们将完全从头开始进行测试,以便您可以希望了解所有过程,而不仅仅是安装我已经完成的工作。

免责声明:这实际上并不能保护您的房屋。

可能会给您妹妹一个令人讨厌的冲击。

您需要:

  • 一个Arduino
  • 超声波“ ping"传感器,我正在使用HC-SR04 PIR会更好,但价格昂贵。可以将ping传感器秘密地放置在门口中,并且仍然可以执行相同的基本工作,并且只需$ 5
  • 压电蜂鸣器
  • LED条形灯,其接线与我们以前使用的相同在这个项目中。
  • 在连接该项目时,不要每次都删除所有内容—只是继续在最后一个块上进行构建。到“对警报系统进行编码"部分时,应该已经将所有零碎的零件连接起来,看起来像这样:

    闪光灯

    使用接线此项目的图表此代码可快速测试您的接线。如果一切顺利,您应该有以下条件:

    距离传感器

    在SR04模块上,您会找到4个引脚。 VCC GND 分别连接至+ 5V电源轨和地。 TRIG 是用于发送声纳信号的引脚,将其置于引脚6上; ECHO 用于回读信号(并由此计算距离)-放在7上。

    为使事情变得非常简单,我们可以使用一个名为NewPing的库。下载并放置在Arduino的 Library 文件夹中,然后重新启动IDE,然后继续。使用此代码进行测试;打开串行监视器,并确保速度设置为115200波特。运气好的话,您应该会看到一些距离测量值以很高的速度发送回给您。您可能会发现1或2厘米的差异,但这很好。尝试将手放在传感器前面,上下移动以观察变化的读数。

    代码应该很容易理解。开始时有一些相关引脚的声明,包括最大距离-这可能取决于您使用的确切传感器,但是只要您能够准确获得小于1米的读数,就可以了。

    在此测试应用程序的循环中,我们使用 ping()函数发出声纳ping,以毫秒为单位取回该值花费了多长时间的值返回。为此,我们使用以 US_ROUNDTRIP_CM 常量构建的NewPing库,该库定义移动一厘米需要多少微秒。两次ping之间还存在50毫秒的延迟,以避免传感器过载。

    压电警报

    压电晶体传感器是一种简单且便宜的蜂鸣器,我们可以使用PWM引脚3发出不同的音调。将一根导线连接到引脚3,将一根导线连接到接地导轨–没关系。

    使用此代码进行测试。

    杀死相当讨厌且响亮的警报的唯一方法是拔插头。该代码解释起来有些复杂,但是它涉及使用正弦波来产生独特的声音。调整数字以使用不同的音调。

    对警报系统进行编码

    现在我们已经拥有了拼图的所有内容,让我们将它们组合在一起。

    继续制作一个新的草图,称为警报。首先结合到目前为止我们在测试示例中使用的所有变量和引脚定义。

    #include <NewPing.h>// Select which PWM-capable pins are to be used.#define RED_PIN    10#define GREEN_PIN   11#define BLUE_PIN  9#define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.#define ECHO_PIN     7  // Arduino pin tied to echo pin on the ultrasonic sensor.#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters).#define ALARM 3float sinVal;int toneVal;

    首先编写基本的 setup()函数–我们将仅处理现在开灯。我在主循环开始之前添加了5秒的延迟,以便在需要时给我们一些时间。

    void setup(){   //set pinModes for RGB strip   pinMode(RED_PIN,OUTPUT);   pinMode(BLUE_PIN,OUTPUT);   pinMode(GREEN_PIN,OUTPUT);   //reset lights   analogWrite(RED_PIN,0);   analogWrite(BLUE_PIN,0);   analogWrite(RED_PIN,0);  delay(5000); }

    让我们使用一个辅助函数,该函数可以让我们快速编写单个RGB。

    //helper function enabling us to send a colour in one commandvoid color (unsigned char red, unsigned char green, unsigned char blue)     // the color generating function{         analogWrite(RED_PIN, red);         analogWrite(BLUE_PIN, blue);    analogWrite(GREEN_PIN, green);}

    最后,我们现在的循环将由一个红色和黄色之间的简单彩色闪烁组成(或者,无论您希望发出什么警报,只需更改RGB值)

    void loop(){   color(255,0,0); //red   delay(100);   color(255,255,0); //yellow   delay(100);}

    上传并测试以确保您处在正确的轨道上。

    现在,让我们集成距离传感器,仅在有物体进入50时才触发这些光。厘米(小于门框的宽度)。我们已经定义了正确的引脚并导入了库,因此在您的 setup()函数之前,添加以下行以对其进行实例化:

    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

    在其下,向其中添加一个变量存储警报是否被触发的状态,当然默认为false。

    boolean triggered = false; 

    setup()函数中添加一行,以便我们可以监视串行输出并进行调试。

    Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.  

    下一步,让我们将当前循环重命名为 alarm() –如果警报已触发,将调用此循环。

    void alarm(){   color(255,0,0); //red   delay(100);   color(255,255,0); //yelow   delay(100);}

    现在创建一个新的 loop()函数,在该函数中,我们将获取一个新的ping命令,读取结果,如果在电表范围内检测到某些东西,则会触发警报。

    void loop(){    if(triggered == true){      alarm();    }    else{      delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.      unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).      unsigned int distance = uS / US_ROUNDTRIP_CM;      Serial.println(distance);      if(distance < 100){         triggered = true;      }   }}

    让我简要地解释一下代码:

  • 首先要检查警报是否已触发,如果触发了警报,则应关闭警报功能(此时仅闪烁指示灯)。
  • 如果不触发
  • 如果传感器的读数小于100厘米,则说明光束已经填充了光束(显然,如果触发时间过早,请调整该值)。
  • 在添加烦人的压电蜂鸣器之前,请立即试用。

    工作吗?大。现在,让我们重新添加该蜂鸣器。将 pinMode 添加到 setup()例程中。

    pinMode(ALARM, OUTPUT);

    然后将压电蜂鸣器循环添加到alarm()函数中:

    for (int x=0; x<180; x++) {    // convert degrees to radians then obtain sin value    sinVal = (sin(x*(3.1412/180)));    // generate a frequency from the sin value    toneVal = 2000+(int(sinVal*1000));    tone(ALARM, toneVal);  }

    如果您此时尝试编译,将会遇到错误-我故意将其遗留在这里,以便您可以看到一些常见问题。在这种情况下,NewPing库和标准音调库都使用相同的中断-它们基本上是冲突的,因此您无法做很多修复。哦,亲爱的。

    不过不用担心。这是一个常见问题,已经有人解决了,请下载此NewTone并将其添加到Arduino Libraries文件夹中。调整程序的开头以包括以下内容:

    #include <NewTone.h>

    ,并将行:

      tone(ALARM, toneVal); 

    调整为

        NewTone(ALARM, toneVal);

    它。将警报设置在卧室的门口,以防下一个不幸的窃贼。

    或者是一只狗,看起来好像完全没被警报吓到。

    遇到麻烦了代码?这是完整的应用程序。如果您遇到随机错误,请尝试将其粘贴在下面,我会帮忙。

    标签: