Проект системы безопасности и сигнализации Arduino
<основной класс="главный сайт" id="главный">
В этом проекте мы узнаем, как сделать систему безопасности и сигнализации Arduino. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже.
Обзор
Будильник активируется через 10 секунд после нажатия кнопки A. Для обнаружения объектов он использует ультразвуковой датчик, и как только сигнализация что-то обнаруживает, зуммер начинает издавать звук. Чтобы остановить будильник, нам нужно ввести 4-значный пароль. Предустановленный пароль — 1234, но у нас также есть возможность его изменить.
Нажав кнопку B, мы попадаем в меню смены пароля, где сначала нам нужно ввести текущий пароль, чтобы продолжить, а затем ввести новый 4-значный пароль. Как только пароль будет изменен, в следующий раз, когда мы активируем будильник, мы сможем остановить будильник, только введя новый пароль. Если мы введем неправильный пароль, мы получим сообщение о том, что нам нужно повторить попытку.
Обязательные компоненты
Теперь давайте посмотрим на необходимые компоненты для этого проекта. Очевидно, нам нужна плата Arduino, ультразвуковой датчик, ЖК-дисплей, зуммер и клавиатура 4×4.
Вы можете получить компоненты, необходимые для этого проекта Arduino, по ссылкам ниже:
- Клавиатура ………………………………………..
- ЖК-дисплей 16×2 ………………………………….
- Ультразвуковой датчик ………………………
- Зуммер …………………………………………
- Плата Arduino …………………………..
- Макет и соединительные провода………
Схемы систем сигнализации Arduino
Вот принципиальная схема.
Итак, для зуммера нам нужен только один контакт, но с поддержкой ШИМ. Клавиатура 4×4 имеет 8 контактов, 4 из них для рядов и 4 для столбцов клавиатуры. Каждая кнопка на самом деле представляет собой кнопочный переключатель, который при нажатии замыкает строку между строкой и столбцом.
Так, например, если мы установим строку строки 1 на низкий уровень, а все строки столбца на высокий уровень, когда мы нажмем, например, кнопку 3, из-за короткого замыкания между двумя линиями строка столбца 3 опустится до низкого уровня, поэтому в таком случае мы можем зарегистрировать, что кнопка 3 была нажата.
Что касается двух других компонентов этого проекта, ультразвукового датчика и ЖК-дисплея, вы можете ознакомиться с моими предыдущими подробными руководствами о том, как их подключить и использовать.
Исходный код системы сигнализации Arduino
Далее давайте посмотрим код Arduino. Так как код немного длиннее, для лучшего понимания я буду размещать исходный код программы в разделах с описанием для каждого раздела. И в конце этой статьи я опубликую полный исходный код.
Поэтому нам нужно включить стандартную библиотеку LiquidCrystal для ЖК-дисплея и библиотеку Keypad, которую нужно установить дополнительно. Затем нам нужно определить контакты зуммера и ультразвукового датчика, определить некоторые переменные, необходимые для программы, определить клавиши клавиатуры, а также создать два объекта для клавиатуры и ЖК-дисплея.
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Keypad.h>
#define buzzer 8
#define trigPin 9
#define echoPin 10
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // State of the alarm
boolean 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
}
Code language: Arduino (arduino)
В разделе настройки нам просто нужно инициализировать ЖК-дисплей и определить режимы контактов для зуммера и ультразвукового датчика.
В разделе петли сначала проверяем, активирована ли сигнализация или нет. Поэтому, если будильник не активирован, на ЖК-дисплее у нас будет главный экран программы, который предлагает два варианта:A для активации будильника и B для изменения пароля. Затем с помощью функции myKeypad.getKey() мы считываем, какая кнопка на клавиатуре была нажата, и если это кнопка A, зуммер будет издавать звук длительностью 200 миллисекунд, а переменная activeAlarm станет истинной.
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;
}
Code language: Arduino (arduino)
В этом случае на ЖК-дисплее мы напечатаем сообщение «Тревога будет активирована через», и с помощью цикла while мы сделаем обратный отсчет 9 секунд до активации будильника. Затем появится сообщение «Тревога активирована» и мы измерим начальное расстояние от нашего сигнализатора до объектов напротив него.
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;
}
Code language: Arduino (arduino)
Итак, следующим шагом является то, что ультразвуковой датчик будет постоянно проверять, меньше ли текущее измеренное расстояние, чем начальное расстояние, скорректированное на значение 10 см, и если это так, это означает, что объект появился перед датчиком и тревога будет активирован. Функция tune() активирует звуковой сигнал, и будет вызвана пользовательская функция enterPassword().
if (alarmActivated == true){
currentDistance = getDistance() + 10;
if ( currentDistance < initialDistance) {
tone(buzzer, 1000); // Send 1KHz sound signal
lcd.clear();
enterPassword();
}
}
Code language: Arduino (arduino)
Эта пользовательская функция напечатает сообщение о том, что тревога активирована и что нам нужно ввести пароль, чтобы остановить тревогу. Таким образом, используя следующий цикл while, мы постоянно проверяем, нажали ли мы кнопку на клавиатуре, и каждое нажатие кнопки добавляется в переменную tempPassword. Если мы введем более 4 цифр или нажмем клавишу быстрого доступа, ранее введенные цифры будут очищены, поэтому мы можем ввести их снова с самого начала.
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>");
}
}
}
}
Code language: Arduino (arduino)
С другой стороны, если мы нажмем кнопку со звездочкой, мы проверим, совпадает ли текущий введенный пароль с первоначально установленным паролем. Если это так, будильник будет отключен, зуммер перестанет издавать звук, и мы вернемся на главный экран. Но если мы ввели неправильный пароль, появится сообщение «Неправильно! Попробуйте еще раз!" появится, и нам придется снова попытаться ввести правильный пароль.
Для смены пароля используем аналогичный метод. Здесь сначала нам нужно ввести текущий пароль, чтобы иметь возможность установить новый пароль.
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;
}
}
}
}
}
}
Code language: Arduino (arduino)
Вот полный исходный код системы сигнализации Arduino:
/*
* Arduino Security and Alarm System
*
* by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Keypad.h>
#define buzzer 8
#define trigPin 9
#define echoPin 10
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // State of the alarm
boolean 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;
}
Code language: Arduino (arduino)
Последний штрих
Для завершения проекта я использовал пластиковую электрическую коробку, в которую поместил все компоненты и соединил их вместе.
Вот и все. Надеюсь, вам понравился этот проект, и вы можете задать любой вопрос в разделе комментариев ниже.
Производственный процесс
- Система посещаемости с использованием Arduino и RFID с Python
- ЖК-анимация и игры
- Система сигнализации Arduino:SERENA
- Проверка безопасности системы охранной сигнализации
- Детектор звуковой частоты
- Система автоматизации и безопасности умного дома с использованием 1Sheeld
- Tech-TicTacToe
- DIY вольтметр с Arduino и дисплеем Nokia 5110
- Таймер обратного отсчета Arduino
- Система вентиляции подвала / подвала