Arduino » Охранная система на Ардуино

Охранная система на Ардуино

Сегодня речь пойдет о том, как с помощью Ардуино собрать охранную систему. Наша «охрана» будет сторожить один контур и управлять одним оповещателем.

Охранная система на Ардуино

Для Ардуино это не проблема, и, как вы увидите по коду программы и по схеме устройства, можно легко увеличить количество охраняемых точек доступа и количество устройств оповещения или индикации.
Охранную систему можно применить для охраны как больших объектов (зданий и сооружений), так и небольших предметов (шкатулок, сейфов), и даже переносных кейсов и чемоданов. Хотя с последними надо быть поосторожнее, если вы установите систему охраны, например, на чемодан, с которым решите отправиться в путешествие, и система оповещения сработает в каком-нибудь аэропорту, то, думаю, вам предстоит серьезная беседа с местной службой безопасности :-)

Принцип работы охранной системы

Упрощенно принцип работы устройства выглядит следующим образом (рис. 1). После включения питания устройство переходит в рабочий режим и ждет постановки на охрану. Постановка и снятие с охраны осуществляются одной кнопкой. Для повышения безопасности эту кнопку лучше расположить внутри охраняемого помещения (сейфа или шкатулки). Перед включением режима охраны дверь нужно приоткрыть. При включении режима охраны (нажатии на кнопку) электронная схема ждет, пока вы не закроете дверь в помещение (дверцу сейфа, крышку шкатулки, и т.д.).

Принцип работы устройства

На двери (или дверце) должен быть установлен концевой выключатель любого типа, об этом позднее. Замыкаясь (или размыкаясь), концевой выключатель сообщит устройству, что охраняемый контур замкнут, и устройство перейдет в режим охраны. О переходе в режим охраны система оповестит двумя короткими сигналами (как в автомобильных сигнализациях). В этом режиме устройство «ловит» открытие двери. После открытия двери система ждет несколько секунд (это величина настраиваемая, для помещений около десяти секунд, для шкатулки одна-две) отключения режима охраны, если этого не происходит, включается сирена. Алгоритм и схема разработаны так, что отключить сирену можно, только полностью разобрав корпус и отключив питание.

Охранная система на Ардуино

Устройство охранной системы очень простое (рис. 2). В основе плата Ардуино. Концевые выключатели подключаются, как обычная кнопка, через подтягивающие резисторы. На концевиках остановлюсь отдельно. Они бывают нормально замкнутые и нормально разомкнутые. Можно в качестве концевика включить обычную кнопку, только ход обычной кнопки очень велик, люфт двери обычно больше. Поэтому необходимо придумать какой-нибудь толкатель для кнопки и подпружинить, чтобы не сломать кнопку дверью. Ну и если не лень, то можно дойти до магазина и купить магнитный выключатель (геркон) (рис. 3), он не боится пыли и загрязнений.

Охранная система на Ардуино

Подойдет и концевой выключатель для автосигнализации (рис. 4). Следует отметить, программа написана под геркон. При закрытой двери его контакт замкнут. Если использовать выключатель от автосигнализации, то при закрытой двери он будет скорее всего разомкнут, и в соответствующих местах кода нужно будет поменять 0 на 1 и наоборот.

Охранная система на Ардуино

В качестве сирены предлагаю использовать оповещатель звуковой ПКИ-1 ИВОЛГА белорусского производства (рис. 5). Напряжение питания 9 — 15 В, рабочий ток 20 — 30 мА. Это позволяет использовать его с батарейным питанием. При этом он «выдает» 95 — 105 дБ.

Охранная система на Ардуино

При таких характеристиках от батарейки «Крона» он будет звучать несколько десятков минут. Я его нашел в интернете за 110 руб. Там же геркон с магнитом стоит около 30 руб. Выключатель от автосигнализации в автозапчастях был куплен за 28 руб. Транзистор КТ315 можно взять с любой буквой или заменить на любой современный маломощный кремниевый транзистор соответствующей проводимости. Если громкости одного оповещателя не хватит (кто знает, может, вы захотите, чтобы было слышно за многие километры), можно подключить несколько оповещателей параллельно или взять более мощный, только в этом случае и транзистор нужно заменить на более мощный (например, знакомую нам транзисторную сборку ULN2003). В качестве разъемов для подключения геркона и сирены я применил самые простые разъемы для аудио/видеоустройств — цена на радиорынке 5 руб. за пару.

Корпус устройства можно склеить из пластика или фанеры; если охраняется серьезный объект, то его лучше сделать металлическим. Батареи или аккумуляторы питания для повышения надежности и безопасности желательно разместить внутри корпуса.

Для упрощения программного кода не были использованы элементы энергосбережения, и батареек надолго не хватает. Можно оптимизировать код, а еще лучше радикально переделать, применив обработку событий по прерываниям и спящий режим МК. В этом случае питания от двух квадратных батареек, включенных последовательно (9 В), должно хватить на несколько месяцев.

Теперь код

// постоянные
const int button = 12; // пин для кнопки
const int gerkon = 3; // пин для геркона
const int sirena = 2; // пин упр-ния сиреной
const int led = 13; // пин индикатора
// переменные
int buttonState = 0; // состояние кнопки
int gerkonState = 0; // состояние геркона
int N = 0; // счетчик кнопки отключения охраны
void setup() {
// управление сиреной и индикатором — выход
pinMode(sirena, OUTPUT);
pinMode(led, OUTPUT); // кнопка и геркон — входы
pinMode(gerkon, INPUT);
pinMode(button, INPUT);
}
void loop(){
digitalWrite(led, HIGH);
while(buttonState= =0){ // цикл ожидания, пока не нажмем кнопку
buttonState = digitalRead(button); // для перехода в режим охраны
}
digitalWrite(led, LOW);
buttonState = 0; // обнуляем значение кнопки
while(gerkonState= =0){ // цикл, пока не закроем дверь
gerkonState = digitalRead(gerkon);
}
delay (500); // :-)
digitalWrite(sirena, HIGH); // Код
delay (100); // индикации
digitalWrite(sirena, LOW); // включения
delay (70); // режима
digitalWrite(sirena, HIGH); // охраны
delay (100); // оповещение
digitalWrite(sirena, LOW); // звуковое
while(gerkonState= =1){ // ждем открытия двери
gerkonState = digitalRead(gerkon);
}
for (int i=0; i <= 5; i++){ // 7,5 секунды на нажатие
buttonState = digitalRead(button); // секретной кнопки
if (buttonState = = HIGH) { // отслеживаем свой — чужой
N=N+1;
}
delay(1500); // секретная фича :-)))
}
if (N > 0) { // самое главное
digitalWrite(sirena, LOW); // не включаем сирену
}
else {
digitalWrite(sirena, HIGH); // или включаем сирену
}
digitalWrite(led, HIGH); // включаем индикатор N = 0;
buttonState = 0;
delay(15000); // напоминание «чайникам», которым нравится
digitalWrite(led, LOW); // давить на кнопки без перерыва delay (1000);
}

Удачи!

Источник: Левша    Автор: К. Холостов


Комментариев: 7

  1. bigvlad | 03 Дек 2014

    Ну что, код вобщем то рабочий.
    Правда думал переделать, потом понял что проще написать все с нуля.

    Потому просто немного изменил код:

    1) Увеличил чувствительность кнопки на снятие охраны и убрал ожидание окончания задержки на снятие с охраны. То есть не нужно ждать 7,5 сек при снятии охраны а снимаем при нажатии кнопки.

    2) Для отключения сигнализации нужно нажать кнопку и закрыть дверь. Это практичнее чем отключать питание.

    Код получился такой:

    // постоянные
    const int button = 12; // пин для кнопки
    const int gerkon = 3; // пин для геркона
    const int sirena = 2; // пин упр-ния сиреной
    const int led = 13; // пин индикатора
    // переменные
    int buttonState = 0; // состояние кнопки
    int gerkonState = 0; // состояние геркона
    int N = 0; // счетчик кнопки отключения охраны
    void setup() {
    // управление сиреной и индикатором — выход
    pinMode(sirena, OUTPUT);
    pinMode(led, OUTPUT); // кнопка и геркон — входы
    pinMode(gerkon, INPUT);
    pinMode(button, INPUT);
    }
    void loop(){
    digitalWrite(led, HIGH);
    while(buttonState==0){ // цикл ожидания, пока не нажмем кнопку
    buttonState = digitalRead(button); // для перехода в режим охраны
    }
    digitalWrite(led, LOW);
    buttonState = 0; // обнуляем значение кнопки
    //digitalWrite(sirena, LOW);
    while(gerkonState==0){ // цикл, пока не закроем дверь
    gerkonState = digitalRead(gerkon);
    }
    delay (500); // :-)
    digitalWrite(sirena, HIGH); // Код
    delay (100); // индикации
    digitalWrite(sirena, LOW); // включения
    delay (70); // режима
    digitalWrite(sirena, HIGH); // охраны
    delay (100); // оповещение
    digitalWrite(sirena, LOW); // звуковое
    while(gerkonState==1){ // ждем открытия двери
    gerkonState = digitalRead(gerkon);
    }
    for (int i=0; i 0) { // самое главное
    digitalWrite(sirena, LOW); // не включаем сирену
    }
    else {
    digitalWrite(sirena, HIGH); // или включаем сирену
    }
    digitalWrite(led, HIGH); // включаем индикатор N = 0;
    buttonState = 0;
    N=0;
    delay(5000); // напоминание «чайникам», которым нравится
    digitalWrite(led, LOW); // давить на кнопки без перерыва delay (1000);
    }

    Спасибо ;)

  2. bigvlad | 04 Дек 2014

    PS: добавил в скетч автоматическую установку на охрану через определенное время (15 мин) — на случай если забыл хозяин.

  3. Svetocopy | 05 Дек 2014

    спасибо за доработку)

  4. bigvlad | 05 Дек 2014

    Скетч с последними изменениями.

    После срабатывания сигнализации: непрерывная и неотключаемая сирена 10 сек, далее прерывистая пока не отключить.
    Отключение: кнопка, закрыть дверь и если нужно войти то открыть и снять с охраны кнопкой.
    Можно раскоментировать 55ю строку и сирена будет сразу отключаться кнопкой.
    В будущем кнопку можно заменить пультом для удобства и повышения секретности местоположения кнопки.

    // постоянные
    const int button = 12; // пин для кнопки
    const int gerkon = 3; // пин для геркона
    const int sirena = 2; // пин упр-ния сиреной
    const int led = 13; // пин индикатора
    // переменные
    int buttonState = 0; // состояние кнопки
    int gerkonState = 0; // состояние геркона
    int N = 0; // счетчик кнопки отключения охраны
    int s = 0; // счетчик сирены
    int value = LOW; // состояние светодиода
    long previousMillis = 0; // переменная подсчета времени без delay
    int doorDelay = 0; // переменная задержки автовключения охраны
    // изменяемые переменные
    int timeDelay = 50; // время задержки (t/10=секунды) на снятие с охраны
    int autoSec = 15; // время (сек) автоматической постановки на охрану после закрывания двери

    void setup() {
    // управление сиреной и индикатором — выход
    pinMode(sirena, OUTPUT);
    pinMode(led, OUTPUT); // кнопка и геркон — входы
    pinMode(gerkon, INPUT);
    pinMode(button, INPUT);
    }
    void loop(){
    digitalWrite(led, HIGH);
    while(buttonState==0){ // цикл ожидания, пока не нажмем кнопку
    buttonState = digitalRead(button); // для перехода в режим охраны
    if (s==1) {
    if (millis() — previousMillis > 500) { // прерывистая работа сирены
    previousMillis = millis();
    digitalWrite(sirena, LOW);
    delay(200);
    digitalWrite(sirena, HIGH);
    }
    }
    if (digitalRead(gerkon) == 1) { // автоматическая постановка на охрану после закрывания двери
    if (millis() — previousMillis > 1000) {
    previousMillis = millis();
    doorDelay++;
    }
    if (doorDelay == autoSec) {
    buttonState = 1;
    }
    }
    else {
    doorDelay = 0;
    }
    }
    digitalWrite(led, LOW);

    buttonState = 0; // обнуляем значение кнопки
    s=0;
    previousMillis = 0;
    //digitalWrite(sirena, LOW); // отключение сирены кнопкой
    while(gerkonState==0){ // цикл, пока не закроем дверь
    gerkonState = digitalRead(gerkon);
    }
    delay (500); // :-)
    digitalWrite(sirena, HIGH); // Код
    delay (70); // индикации
    digitalWrite(sirena, LOW); // включения
    delay (70); // режима
    digitalWrite(sirena, HIGH); // охраны
    delay (70); // оповещение
    digitalWrite(sirena, LOW); // звуковое
    while(gerkonState==1){ // ждем открытия двери
    gerkonState = digitalRead(gerkon);
    }
    for (int i=0; i 0) { // самое главное
    digitalWrite(sirena, LOW); // не включаем сирену
    }
    else {
    s=1;
    digitalWrite(sirena, HIGH); // включаем сирену
    delay(10000); // непрерывно на 10 секунд
    }
    digitalWrite(led, HIGH); // включаем индикатор N = 0;
    buttonState = 0;
    N=0;
    doorDelay = 0;
    delay(2000); // напоминание «чайникам», которым нравится давить на кнопки без перерыва delay (1000);
    digitalWrite(led, LOW);
    }

  5. bigvlad | 05 Дек 2014

    int autoSec = 15; // время (сек) автоматической постановки на охрану после закрывания двери — лучше увеличить до 15-20 минут.

  6. Роман | 10 Янв 2015

    Спасибо. Очень полезно. Буду пробовать

  7. Павел | 08 Дек 2015

    Ребят проверьте скетч. У меня не компилируется. Кто может отпишитесь тут

Ваш комментарий

Предыдущая статья: Следующая статья: