Arduino安防报警系统项目

在这个项目中,我们将学习如何制作Arduino安全和报警系统。您可以观看以下视频或阅读下面的书面教程。

概述


按下A键10秒后报警启动。为了探测物体,它使用了一个超声波传感器,一旦警报探测到什么,蜂鸣器就开始发出声音。为了阻止警报,我们需要插入一个4位数的密码。预设密码是1234,但我们也有可能改变它。

Arduino安防报警系统项目。jpg

通过按B键,我们进入密码更改菜单,首先我们需要输入当前密码,以便继续,然后输入新的4位密码。一旦密码被更改,下一次我们激活警报时,我们只能通过输入新密码来阻止警报。如果我们输入错误的密码,我们将得到一个消息,我们需要再次尝试。

所需的组件


现在让我们看看这个项目所需的组件。显然,我们需要一个Arduino板,一个超声波传感器,一个LCD显示屏,一个蜂鸣器和4×4键盘。

Arduino警报组件

您可以从下面的链接获取此Arduino项目所需的组件:

必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。

电路示意图


这是电路原理图。

Arduino报警系统电路原理图

所以对于蜂鸣器,我们只需要一个脚,但一个与PWM支持。4×4键盘有8个引脚,其中4个是为行和4个列的键盘。每个按钮实际上是一个按钮开关,使一个短暂的一行和列之间按下。

4 × 4键盘电路原理图

举个例子,如果我们设置行1线低,和所有列行高,当我们将媒体,例如,按钮3,由于两行之间的短,第三列线将降至低所以在这种情况下我们可以注册按钮3被按下。

至于这个项目的其他两个组成部分超声波传感器液晶显示器,您可以查看我以前关于如何连接和使用它们的详细教程。

Arduino报警系统源代码


接下来让我们看看Arduino代码。由于代码有点长,为了更好地理解,我将把程序的源代码分成几个部分,并对每个部分进行描述。在本文的最后,我将发布完整的源代码。

因此,我们需要为LCD和需要另外安装的键盘库和键盘库中的标准液晶库。然后我们需要定义蜂鸣器和超声波传感器的引脚,定义程序所需的一些变量,定义键盘的键,以及为键盘和LCD创建两个对象。

#include  #define buzzer 8 #define trigPin 9 #define echoPin 10 long duration; #include  #define buzzer 8 #define trigPin 9 #define echoPin 10 long duration;int distance, initialDistance, currentDistance, i;int screenOffMsg = 0;字符串密码= " 1234 ";字符串tempPassword;布尔激活= false;//告警布尔状态isActivated;boolean activateAlarm = false;boolean alarmActivated = false;布尔enteredPassword; // State of the entered password to stop the alarm boolean passChangeMode = false; boolean passChanged = false; const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keypressed; //define the cymbols on the buttons of the keypads char keyMap[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {14, 15, 16, 17}; //Row pinouts of the keypad byte colPins[COLS] = {18, 19, 20, 21}; //Column pinouts of the keypad Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { lcd.begin(16,2); pinMode(buzzer, OUTPUT); // Set buzzer as an output pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input }

在设置部分,我们只需要初始化LCD并定义蜂鸣器和超声波传感器的引脚模式。

在回路部分,我们首先检查报警是否被激活。所以如果闹钟没有被激活,我们会在液晶屏上看到程序的主屏幕,它提供了两个选项,A用于激活闹钟,B用于更改密码。然后使用myKeypad.getKey()函数读取键盘中哪个按钮被按下了,如果那是按钮A,蜂鸣器将产生一个200毫秒的声音,activateAlarm变量将变为true。

if (!alarmActivated) {if (screenOffMsg == 0){lcd.clear();lcd.setCursor (0,0);lcd.print(“A  - 激活”);lcd.setCursor (0,1);lcd.print(“B  -  Change Pass”);screenOffMsg = 1;} keypressed = myKeypad.getKey();if (keypressed =='A'){//如果按下A,激活报警音(蜂鸣器,1000,200);activateAlarm = true;}

在这种情况下,我们将在液晶显示器上打印信息“警报将被激活”,并使用一个while循环,我们将在警报被激活前做9秒的倒计时。然后“报警激活”的信息将出现,我们将测量我们的报警设备到它对面的物体的初始距离。

if (activateAlarm) {lcd.clear();lcd.setCursor (0,0);lcd.print(“警报将是”);lcd.setCursor (0,1);lcd.print(“激活”);Int countdown = 9;//在触发报警前倒数9秒,while (countdown != 0) {lcd.setCursor(13,1);lcd.print(倒计时);倒计时,;语调(蜂鸣器、700、100); delay(1000); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm Activated!"); initialDistance = getDistance(); activateAlarm = false; alarmActivated = true; }

所以下一步是超声波传感器将不断检查是否当前测量距离小于初始距离,纠正值10 cms,如果这是真的那就意味着一个对象出现在前面的传感器和报警被激活。tune()函数将激活蜂鸣器,enterPassword()自定义函数将被调用。

if (alarmActivated == true){currentDistance = getDistance() + 10;如果(currentDistance < initialDistance) {tone(buzzer, 1000);//发送1KHz声音信号lcd.clear();enterPassword ();}}

这个自定义功能将打印警报被激活的消息,我们需要输入密码才能停止警报。所以使用下一个while循环,我们会不断检查是否按下了键盘上的按钮,并且每个按钮按下都会添加到tempPassword变量中。如果我们输入超过4个数字或按下尖锐按钮,前面输入的数字将被清除,以便我们可以重新输入它们。

void enterPassword() {int k=5;tempPassword = " ";激活= true;lcd.clear ();lcd.setCursor (0,0);lcd.print(“***警报***”);lcd.setCursor (0,1);lcd.print(“通过>”);while(activated) {keypressed = myKeypad.getKey();if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' | bb13 keypressed == '7' || keypressed == '8' || keypressed == '9'){tempassword += keypressed; lcd.setCursor(k,1); lcd.print("*"); k++; } } if (k > 9 || keypressed == '#') { tempPassword = ""; k=5; lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); } if ( keypressed == '*') { if ( tempPassword == password ) { activated = false; alarmActivated = false; noTone(buzzer); screenOffMsg = 0; } else if (tempPassword != password) { lcd.setCursor(0,1); lcd.print("Wrong! Try Again"); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); } } } }

另一方面,如果我们按星号按钮,我们将检查当前输入的密码是否与原来设置的密码相同。如果是这样,警报将被关闭,蜂鸣器将停止产生声音,我们将回到主屏幕。但如果我们输入的密码错了,就会显示“错!”再试一次!,我们将不得不再次输入正确的密码。

对于修改密码,我们使用类似的方法。首先,我们需要输入当前密码,以便能够设置新密码。

else if (keypressed =='B') {lcd.clear();int i = 1;语调(蜂鸣器、2000、100);tempPassword = " ";lcd.setCursor (0,0);lcd.print(“当前密码”);lcd.setCursor (0,1);lcd.print(“>”);passChangeMode = true;passChanged = true; while(passChanged) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer, 2000, 100); } } if (i > 5 || keypressed == '#') { tempPassword = ""; i=1; lcd.clear(); lcd.setCursor(0,0); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">"); } if ( keypressed == '*') { i=1; tone(buzzer, 2000, 100); if (password == tempPassword) { tempPassword=""; lcd.clear(); lcd.setCursor(0,0); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">"); while(passChangeMode) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer, 2000, 100); } } if (i > 5 || keypressed == '#') { tempPassword = ""; i=1; tone(buzzer, 2000, 100); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">"); } if ( keypressed == '*') { i=1; tone(buzzer, 2000, 100); password = tempPassword; passChangeMode = false; passChanged = false; screenOffMsg = 0; } } } } } }

下面是Arduino报警系统的完整源代码:

/ * * Arduino安全和报警系统* *由Dejan Nedelkovski,* www.www.mfxpo.com *bet188官方网站 * / #include  //包含液晶库#include  #define蜂鸣器8 #define trigpin9 #define Echopin 10长持续时间;int distance, initialDistance, currentDistance, i;int screenOffMsg = 0;字符串密码= " 1234 ";字符串tempPassword;布尔激活= false;//告警布尔状态isActivated;boolean activateAlarm = false;boolean alarmActivated = false; boolean enteredPassword; // State of the entered password to stop the alarm boolean passChangeMode = false; boolean passChanged = false; const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keypressed; //define the cymbols on the buttons of the keypads char keyMap[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {14, 15, 16, 17}; //Row pinouts of the keypad byte colPins[COLS] = {18, 19, 20, 21}; //Column pinouts of the keypad Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { lcd.begin(16,2); pinMode(buzzer, OUTPUT); // Set buzzer as an output pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input } void loop() { if (activateAlarm) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm will be"); lcd.setCursor(0,1); lcd.print("activated in"); int countdown = 9; // 9 seconds count down before activating the alarm while (countdown != 0) { lcd.setCursor(13,1); lcd.print(countdown); countdown--; tone(buzzer, 700, 100); delay(1000); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm Activated!"); initialDistance = getDistance(); activateAlarm = false; alarmActivated = true; } if (alarmActivated == true){ currentDistance = getDistance() + 10; if ( currentDistance < initialDistance) { tone(buzzer, 1000); // Send 1KHz sound signal lcd.clear(); enterPassword(); } } if (!alarmActivated) { if (screenOffMsg == 0 ){ lcd.clear(); lcd.setCursor(0,0); lcd.print("A - Activate"); lcd.setCursor(0,1); lcd.print("B - Change Pass"); screenOffMsg = 1; } keypressed = myKeypad.getKey(); if (keypressed =='A'){ //If A is pressed, activate the alarm tone(buzzer, 1000, 200); activateAlarm = true; } else if (keypressed =='B') { lcd.clear(); int i=1; tone(buzzer, 2000, 100); tempPassword = ""; lcd.setCursor(0,0); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">"); passChangeMode = true; passChanged = true; while(passChanged) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer, 2000, 100); } } if (i > 5 || keypressed == '#') { tempPassword = ""; i=1; lcd.clear(); lcd.setCursor(0,0); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">"); } if ( keypressed == '*') { i=1; tone(buzzer, 2000, 100); if (password == tempPassword) { tempPassword=""; lcd.clear(); lcd.setCursor(0,0); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">"); while(passChangeMode) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer, 2000, 100); } } if (i > 5 || keypressed == '#') { tempPassword = ""; i=1; tone(buzzer, 2000, 100); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">"); } if ( keypressed == '*') { i=1; tone(buzzer, 2000, 100); password = tempPassword; passChangeMode = false; passChanged = false; screenOffMsg = 0; } } } } } } } } void enterPassword() { int k=5; tempPassword = ""; activated = true; lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); while(activated) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor(k,1); lcd.print("*"); k++; } } if (k > 9 || keypressed == '#') { tempPassword = ""; k=5; lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); } if ( keypressed == '*') { if ( tempPassword == password ) { activated = false; alarmActivated = false; noTone(buzzer); screenOffMsg = 0; } else if (tempPassword != password) { lcd.setCursor(0,1); lcd.print("Wrong! Try Again"); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); } } } } // Custom function for the Ultrasonic sensor long getDistance(){ //int i=10; //while( i<=10 ) { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration*0.034/2; //sumDistance += distance; //} //int averageDistance= sumDistance/10; return distance; }

最后的联系


为了完成这个项目,我使用了一个塑料电气盒,我安装了所有的组件,并将它们联系在一起。

Arduino报警系统塑料盒

就这些了,我希望你喜欢这个项目,并在评论区随意提出任何问题。

42回应

  1. 系统

    当我试图验证代码时,我得到了这个错误。你能帮我一下吗?
    C:\ users \bet188me myprojects \ documents \ arduino \ smart_home_alarm_system \ smart_home_alarm_system.ino:3:20:致命错误:keypad.h:没有这样的文件或目录

    # include

    ^

    汇编终止。

    退出状态1.
    编译电路板Arduino/Genuino Mega或Mega 2560错误。

    回复
      • 黑影

        感谢您的响应,我修改了LCD接线连接,因为我使用了I2C。我还需要一个像你所做的原理图所需的电阻吗?在图片中,有2个电阻连接到LCD ......

  2. Abhay Kalmegh

    谢谢你的创意,我是在你代码的帮助下完成这个项目的。
    在机器人学上做些更有创意的东西,这是我的要求。

    回复
  3. 迭戈

    你好,非常好!如何打开5V警报警报器,它必须是一个继电器吗?我可以将PIR传感器连接到超声波传感器吗?

    回复
    • Dejan Nedelkovski.

      是的,您可以使用PIR传感器而不是超声波传感器。并且您的警报器Siren为5V,您不需要继电器,因为该项目已经提供5V。

      回复
  4. 杜米尼克

    你好,伟大的项目!我有个问题:在传感器检测到什么东西之前,如何关闭警报?例如,我打开了闹钟,但我下定决心,没有离开房间。我想在警报器响之前把它关掉,知道吗?

    问候,含蓄

    回复
    • Dejan Nedelkovski.

      大家好,谢谢。Well for sure you could do that, everything is possible with Arduino. Maybe you can add some delay between the detection of the object and the activation of the siren, and in that time enter the password.

      回复
  5. Ignacio

    你好,我来自阿根廷,首先,感谢这个令人难以置信的项目。我如何可以插入一个RFID系统到这个项目,以及如何可以在同一个项目中使用超声波传感器和PIRSENSOR

    回复
  6. 戴夫

    我做了代码和所有接线,但所有液晶显示器都会变得亮,我尝试了2兆欧2560s

    回复
  7. 杰克

    你好,
    美丽的项目,但似乎错过了一步,你无法想象每次进入时都会触发警笛。必须添加与输出相同的定时器,这允许在Siren触发之前输入停用代码

    致以最亲切的问候
    杰克

    回复
  8. Imran Malik.

    你好,
    我是Arduino世界的新手。
    我想跟进这个项目,但我有Arduino UNO板。
    你已经在评论中提到,我们也可以使用这个板,但在Arduino中,UNO板没有你用于键盘的串行通信母连接器。

    请指导我。

    谢谢
    伊姆兰

    回复
    • Dejan Nedelkovski.

      Arduino UNO的问题是,如果使用本教程中使用的组件,则不会有足够的数字引脚。当然,如果使用一些不同的组件,就像一个将使用较少引脚的I2C驱动LCD,您可以使用Arduino UNO和一些修改。

      回复
  9. 皮特

    谢谢这个伟大的项目!多么好的一个例子!我6个月前偶然发现了这个,从那以后我就为我的车库建立了一个完整的安全系统。我修改了原来的代码,增加了警报触发时的10秒倒计时,并使用了4个PIR传感器。

    回复
  10. 埃米尔

    您好,我有兴趣为我的学校项目执行此操作。我有除了Arduino Mega之外的所有组成部分,但我有一个Arduino Uno,我可以使用Arduino Uno进行这个项目吗?我是Arduino地区的新人。

    回复
  11. Deshan

    主席先生,你的电路图中的两个抵抗力是什么,为什么要使用它?请帮我。

    回复
    • Dejan Nedelkovski.

      这些电阻适用于LCD亮度。如果我们将5V或0V(GND)连接到LCD的亮度引脚,则它将无法显示另一个。我们需要在0和5之间设置一些电压,以便获得适当的对比度,因此使用两个电阻器我们制作分压器并获得这样的值。

      回复
    • Dejan Nedelkovski.

      您可以使用UNO,但这取决于您将使用哪种类型的键盘以及LCD,在引脚使用方面。如果使用UNO,这种配置可能会缺少数字引脚,但如果使用I2C驱动的LCD或不同的键盘,Arduino上可能有足够的引脚。

      回复
  12. 丹尼尔Gaakungi北美自由贸易协定

    你好,有一个学生在肯尼亚攻读技术和应用物理的技术学士学位。我为你的好工作感到高兴,让我更新正在进行的项目bet188me

    回复
  13. 杰森

    你好,我有一个问题,出于某种原因,我的屏幕是空的,没有文本,但屏幕仍然亮着。我不知道是什么问题。

    回复
    • 德扬

      问题可能是液晶显示器的对比度。试着调整电压做对比引脚。试着用一个简单的分压器或电位器来照亮3伏左右的电压对比针。

      回复

留下一个回复

您的电子邮件地址将不会被公布。

推荐

2019年面向初学者和爱好者的最佳入门级示波器

为初学者和爱好者最好的示波器

推荐

2019年针对初学者的8个最佳Arduino入门工具包

初学者的8个最佳Arduino Starter Kits

推荐

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者