在这个项目中,我们将学习如何制作Arduino安防报警系统。你可以观看下面的视频或阅读下面的书面教程。
概述
按下A按钮后,警报在10秒内激活。对于检测物体,它使用超声波传感器,一旦警报检测到物体,蜂鸣器开始发出声音。为了停止警报,我们需要插入一个4位密码。预设密码是1234,但我们也可以更改它。
通过按B键,我们进入密码更改菜单,首先我们需要输入当前密码,以便继续,然后输入新的4位密码。一旦密码被更改,下次我们启动警报时,只有输入新密码才能停止警报。如果我们输入了一个错误的密码,我们将得到一个消息,我们需要再试一次。
所需组件
现在让我们看看这个项目所需的组件。显然,我们需要Arduino板,超声波传感器,液晶显示器,蜂鸣器和4×4键盘。
你可以从下面的链接获得这个Arduino项目所需的组件:
- 键盘 ............................................亚马逊/Banggood/阿里巴巴全球速卖通
- 液晶16×2 ........................................亚马逊/Banggood/阿里巴巴全球速卖通
- 超声波传感器 ...........................亚马逊/Banggood/阿里巴巴全球速卖通
- 蜂鸣器………………………………………亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino董事会…………………………。。亚马逊/Banggood/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/Banggood/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。
Arduino报警系统电路示意图
这是电路原理图。
因此,对于蜂鸣器,我们只需要一个单独的引脚,但一个与PWM支持。4×4键盘有8个引脚,其中4个是键盘的行,4个是键盘的列。每个按钮实际上是一个按钮开关,当按下时在一行和一列之间做一个短。
举个例子,如果我们设置行1线低,和所有列行高,当我们将媒体,例如,按钮3,由于两行之间的短,第三列线将降至低所以在这种情况下我们可以注册按钮3被按下。
至于本项目的其他两个组成部分超声波传感器和液晶显示器,你可以查看我以前的详细教程,如何连接和使用它们。
Arduino报警系统源代码
接下来,让我们看看Arduino代码。由于代码有点长,为了更好地理解,我将在小节中发布程序的源代码,并对每个小节进行描述。在本文的最后,我将发布完整的源代码。
因此,我们需要包括标准的液晶库和键盘库,需要额外安装。然后我们需要定义蜂鸣器和超声波传感器的引脚,定义程序所需的一些变量,定义键盘的按键,以及为键盘和LCD创建两个对象。
#include#define buzzer 8 #define trigPin 9 #define echoPin 10 long duration;int距离,initialDistance, currentDistance, i;int screenOffMsg = 0;字符串密码= " 1234 ";字符串tempPassword;Boolean activated = 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变量将成为现实。
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;}
在这种情况下,我们将在LCD上打印消息“Alarm will activated In”(警报将在中激活),并使用while循环在警报激活前进行9秒的倒计时。然后,将显示消息“Alarm activated”(警报已激活),我们将测量警报设备与对面物体之间的初始距离。
如果(activateAlarm){lcd.clear();lcd.setCursor(0,0);lcd.print(“报警将”);lcd.setCursor(0,1);lcd.print(“在中激活”);int countdown=9;//9秒在激活报警之前倒计时,而(倒计时!=0){lcd.setCursor(13,1);lcd.print(倒计时);倒计时--;铃声(蜂鸣器,700100);延迟(1000)}lcd.clear();lcd.setCursor(0,0);lcd.print(“报警激活!”);initialDistance=getDistance();activateAlarm=false;alarmActivated=true;}
因此,下一步是超声波传感器将不断检查当前测量的距离是否小于初始距离,并通过10 cm的值进行校正,如果这是真的,则意味着传感器前面出现了物体,警报将被激活。tune()函数将激活蜂鸣器,并调用enterPassword()自定义函数。
if (alarmActivated == true){currentDistance = getDistance() + 10;如果(currentDistance < initialDistance) {tone(蜂鸣器,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' || 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距离,initialDistance, currentDistance, i;int screenOffMsg = 0;字符串密码= " 1234 ";字符串tempPassword;Boolean activated = 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; }
最后的联系
为了完成这个项目,我使用了一个塑料电子盒,我安装了所有的组件,并将它们联系在一起。
这就是全部,我希望你喜欢这个项目,欢迎在下面的评论部分提出任何问题。
我在尝试验证代码时遇到了这个错误。你能帮我一下吗。
C:\Users\mybet188meprojects\Documents\Arduino\ smart_home_alarm_system \ smart_home_alarm_system。ino:3:20:致命错误:Keypad.h:没有这样的文件或目录
#包括
^
编译终止。
退出状态1
单板Arduino/Genuino Mega或Mega 2560编译错误。
您必须先下载并安装Keypad.h库。
如何在不连接电脑的情况下给它供电?
你可以通过适配器,9 - 12V,如果通过Arduino板电源插孔供电,或5V适配器,如果直接供电到Arduino的5+引脚。
谢谢你的回复,我修改了lcd的接线,因为我使用了I2C。我还需要像你做的原理图一样的电阻器吗?在图片中有一个2电阻连接到液晶....
你用什么电源,多少电压?
DC适配器5V 2A。适配器的正极需要连接到Arduino的5V引脚上
这个必须使用Arduino Mega吗?或者我可以使用Arduino Uno来做这个?
当然你可以用Arduino Uno。
嗯,先生,我用多少安培的9v适配器?
这个项目Arduino uno有足够的引脚吗?
不,但举例来说,如果你使用I2C液晶显示器,你将能够节省一些引脚。
谢谢你的创意,我做了这个项目与你的代码的帮助。
让机器人更有创意,这是我的要求。
很高兴听到你这么说。谢谢你的反馈!
你好,很好!我怎么打开5V警报警报器,一定是继电器吗?我可以用PIR传感器代替超声波传感器吗?
是的,你可以用PIR传感器代替超声波传感器。你的警报器是5V,你不需要继电器,因为这个项目已经用5V供电了。
你好,伟大的项目!我有一个问题:如何在传感器检测到什么之前关掉警报?例如,我打开了警报,但我下定决心,没有离开房间。我想在警笛响起前把它关掉,有办法吗?
你好,多米尼克
大家好,谢谢。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.
你好,我来自阿根廷,首先,感谢这个不可思议的项目。我如何在这个项目中插入一个RFID系统,以及如何在同一个项目中使用超声波传感器和PIRSENSOR
我已经有关于如何使用Arduino的PIR和RFID传感器的教程。您可以查看它们,并做出自己的组合。
我做了代码和所有的布线正确,但所有的LCD将做的是亮起来,我尝试了2兆2560
你可能在LCD的对比度针上有问题。试着用电位器作为分压器或不同的电阻器。
我也有同样的问题。我想问一下,我将使用多大的电阻值来代替220欧姆?
尝试几个不同的值,以获得最佳的对比度为您的LCD。比如220,330和1k。
电位器的k值是多少
1 k或10 k
两者的作用是一样的。
你好,
美丽的项目,但它似乎错过了一个步骤,你不能想象每次进入触发警报。一个与输出相同的定时器必须被添加,这允许在警报被触发之前进入失效代码
致以最亲切的问候
杰克
是的,这是个好建议。当然,可以实现许多不同的修改。
你好,
我是Arduino世界的新手。
我想继续这个项目,但我有Arduino UNO板。
你已经在评论中提到,我们也可以使用这个板,但是在Arduino的UNO板中没有你用于键盘的串行通信母连接器。
请指导我。
谢谢
伊姆兰
Arduino Uno的问题是,如果你使用我在本教程中使用的组件,你将没有足够的数字引脚。当然,如果你使用一些不同的组件,比如I2C驱动的LCD,它会使用更少的引脚,你可以让它与Arduino Uno和一些修改工作。
谢谢你这么棒的项目!多么好的例子啊!6个月前我偶然发现了这个,然后为我的车库建了一个完整的安全系统。我修改了原代码,增加了报警跳闸10秒倒计时,并使用了4个PIR传感器。
听到这个我很高兴。谢谢!
你好,我有兴趣为我的学校项目做这个。我有除了arduino mega之外的所有组件,但是,我有一个arduino uno,我可以用这个arduino uno来做这个项目吗?我是Arduino领域的新手。
是的,你可以这样做,但是我不确定你的Arduino Mega上是否有足够的引脚用于所有连接。确保你先数一数。
先生,电路图上的两个电阻是什么,为什么要用?请帮助我。
这些电阻是为LCD亮度。如果我们连接5V或0V(GND)到LCD的亮度引脚,它将不会显示另一个。我们需要在这些值0和5之间设置一些电压,以得到一个适当的对比,所以使用两个电阻,我们做一个电压分压器,并得到这样一个值。
这个项目我可以使用arduino uno吗?
您可以使用UNO,但就引脚使用而言,这取决于您将使用的键盘类型以及LCD。使用此配置时,如果使用UNO,您可能会缺少数字引脚,但如果您使用I2C驱动的LCD或不同的键盘,则Arduino上可能有足够的引脚。
你好,有一名肯尼亚的学生正在攻读技术和应用物理学的技术学士学位。我为你的良好工作感到高兴,让我更新正在进行的项目bet188me
非常棒,非常有帮助,非常感谢!
你好,我有一个问题,因为某些原因,我的屏幕是空的没有文本,但屏幕仍然亮起来。我不知道有什么问题。
问题可能是LCD的对比度。尝试调整对比度引脚的电压。尝试使用简单的分压器或电位计将对比度引脚的电压亮起3伏左右。