Урок 17. Рабочий проект Ардуино. Охранная сигнализация.

Урок 17. Рабочий проект Ардуино. Охранная сигнализация.

В уроке разработаем реальный, работоспособный проект охранной сигнализации. Вы можете легко адаптировать устройство под свои задачи и условия.

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

Это аналог моей разработки на PIC-контроллере, только выполненный на базе платы Arduino UNO.

Можете прочитать статью об этом устройстве. Я повторю задачу.

Общая информация об устройстве.

  • Контроль состояния двух охранных шлейфов с измерением сопротивления цепей датчиков и цифровой фильтрацией сигналов.
  • Управление устройством с помощью пульта (светодиод и две кнопки):
    • включение сигнализации;
    • отключение сигнализации с помощью секретного кода;
    • установка секретного кода (код содержится в EEPROM контроллера).

    Структурная схема устройства.

    К управляющему блоку сигнализации подключены:

    • 2 стандартных охранных шлейфа с:
      • НР – нормально разомкнутыми датчиками;
      • НЗ – нормально замкнутыми датчиками;
      • Rок – оконечными резисторами.

      Режимы и управление сигнализацией.

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

      Устанавливать пульт лучше внутри помещения около входной двери. С помощь него включается и отключается сигнализация, меняется секретный код.

      При подаче питания устройство переходит в режим СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА. Светодиод пульта не светится. В этом режиме сигнализация находится в течение рабочего дня.

      Включается сигнализация (режим ОХРАНА) нажатием на две кнопки одновременно. Светодиод начинает мигать с частотой 5 раз в секунду, и через 20 секунд устройство переходит в режим ОХРАНА, т.е. контролирует состояние охранных датчиков. Время 20 секунд необходимо для того, чтобы выйти из помещения, закрыть входную дверь.

      Если в течение этого времени (20 секунд) нажать любую кнопку пульта, то устройство вернется в режим СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА. Люди часто что-то вспоминают перед выходом из помещения.

      Через 20 секунд после включения сигнализация перейдет в режим ОХРАНА. Светодиоды пульта и блока наружной индикации мигают раз в секунду, контролируется состояние датчиков.

      При срабатывании любого датчика светодиод пульта начинает мигать с частотой 5 раз в секунду, и устройство отсчитывает время, по истечении которого прозвучит сигнал сирены. Это время (30 секунд) необходимо для того, чтобы отключить сигнализацию, набрав кнопками пульта секретный код.

      На пульте всего две кнопки. Поэтому код это комбинация цифр 1 и 2. Например, код 2122221 означает, что надо последовательно нажать кнопки 2, 1, четыре раза 2 и 1. Секретный код может содержать от 1 до 8 цифр.

      Если код был набран неправильно, надо нажать 2 кнопки пульта одновременно и повторить набор кода.

      Правильно набранный код переводит устройство в режим СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА.

      Если в течение 30 секунд после срабатывания охранного датчика правильный код не был набран, то включается сирена. Отключить ее можно набрав правильный код. Иначе сирена будет звучать в течение минуты, а затем устройство перейдет в режим СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА.

      Секретный код можно задать только из режима СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА. Для этого надо удерживать обе кнопки пульта нажатыми не менее 6 секунд. Отпустить, когда загорится светодиод пульта. Это означает, что сигнализация перешла в режим задания секретного кода.

      Теперь надо набрать новый секретный код (от 1 до 8 цифр). Пауза между нажатиями кнопок должна быть не более 5 секунд. Подождать пока светодиод погаснет (еще 5 секунд). Новый секретный код будет сохранен в энергонезависимой памяти контроллера.

      Состояния охранной сигнализации сведены в таблицу.

      Управление сигнализацией практически сводится к двум операциям:

      • Покидая помещение – нажать обе кнопки пульта одновременно и закрыть дверь.
      • Войдя в помещение – набрать секретный код.

      Разработка аппаратной части устройства.

      При всей многофункциональности платы Ардуино, для создания работоспособного устройства необходимо добавить к ней электронные узлы для подключения:

      • охранных шлейфов;
      • кнопок и светодиода пульта;
      • сирены и наружной световой индикации
      • системы питания.

      Рассмотрим эти узлы подробно.

      Шлейф охранной сигнализации.

      В охранных системах для подключения датчиков используются охранные шлейфы. Охранный шлейф это цепь из последовательно и параллельно включенных датчиков. К одному шлейфу могут быть подключены несколько датчиков, как нормально замкнутых (НЗ), так и нормально разомкнутых (НР).

      Блок сигнализации контролирует сопротивление шлейфа. Если сопротивление меньше нижнего или больше верхнего порога, то устройство формирует сигнал тревоги. Нормальным считается сопротивление шлейфа , заданного оконечным резистором (часто 2 кОм). Если злоумышленник замкнет провода шлейфа или разорвет их, то сработает сигнализация.

      Выберем параметры шлейфа такие же, как в прототипе на PIC-контроллере.

      Сопротивление шлейфа Номинальное значение 2000 Ом Верхний порог 5900 Ом Нижний порог 540 Ом

      Сопротивление шлейфа в диапазоне 540…5900 Ом считаем нормальным. При выходе значения сопротивления шлейфа за указанные пределы должна срабатывать сигнализация.

      Для того чтобы контроллер мог измерять сопротивление шлейфов подключим их к аналоговым входам платы Ардуино. Схема для подключения охранного шлейфа выглядит так:

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

      Сопротивление шлейфа Напряжение на входах A0, A1 5900 Ом 3,6 В 2000 Ом 2,43 В 540 Ом 1,04 В

      Конденсатор C1 вместе с резисторами осуществляет аналоговую фильтрацию сигнала шлейфа. Для повышения помехозащищенности системы в устройстве происходит еще и цифровая фильтрация сигнала.

      Кнопки пульта.

      Кнопки пульта, как и охранные датчики, подключены к контроллеру длинными проводами. Сигналы от них также требуют аналоговой и цифровой фильтрации для обеспечения высокой помехозащищенности и устранения дребезга. Подключим кнопки к цифровым выводам платы 9 и 10.

      При разомкнутой кнопке напряжение 12 В ограничивается на уровне 5 В внутренним защитным диодом микроконтроллера.

      Наружная индикация режима и сирена.

      Сирена и источник света для наружной индикации режима могут потребовать значительных токов питания. Кроме того они подключены к контроллеру длинными проводами. Поэтому для коммутации этих элементов необходимы транзисторные ключи. Вот схема одного ключа на ток до 2 А.

      Резистор R12 ограничивает ток базы транзистора. Диоды защищают транзистор от выбросов сигнала длинной линии связи при коммутации.

      Система питания.

      Устройство питается от блока питания напряжением 12 В. Такое напряжение подходит для питания как платы Ардуино, так и сирены. Для подключения резервного питания от батареи можно использовать простую схему на двух диодах.

      В качестве диода для основного питания используется диод Шоттки (VD1). Это обеспечивает приоритет блоку питания при равенстве напряжения на его выходе с напряжением резервного питания.

      Схема охранной сигнализации на базе платы Arduino UNO R3.

      Собрал макет сигнализации. Вместо транзисторных ключей поставил светодиоды. На этом макете можно полностью отладить программу, а потом создать рабочий вариант конструкции устройства.

      Разработка программы.

      Прежде всего, подключаем библиотеки, назначаем выводы контроллера, создаем объекты, переменные, с которыми мы будем работать:

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

      В результате у нас есть следующие переменные с которыми мы будем работать:

      • признаки состояния кнопок пульта:
        • button1.flagPress;
        • button1.flagClick;
        • button2.flagPress;
        • button2.flagClick;
        • avarageShleif1;
        • avarageShleif2.

        Для проверки посылаем состояние этих переменных через последовательный порт на компьютер. // охранная сигнализация #include <MsTimer2.h> #include <Button.h> #include <avr/wdt.h>

        // назначение выводов #define BUTTON_1_PIN 9 // кнопка 1 пульта #define BUTTON_2_PIN 10 // кнопка 2 пульта #define LED_PIN 11 // светодиод пульта и внешняя индикация #define SIREN_PIN 12 // сирена подключена к выводу 9 #define SHLEIF_1_PIN A0 // шлейф 1 #define SHLEIF_2_PIN A1 // шлейф 2

        Button button1(BUTTON_1_PIN, 25); // создание объекта кнопка 1 Button button2(BUTTON_2_PIN, 25); // создание объекта кнопка 2

        unsigned int sumShleif1, sumShleif2; // переменные для суммирования кодов АЦП unsigned int avarageShleif1, avarageShleif2; // сумма кодов АЦП (среднее напряжение шлейфов * 50) int avarageCount; // счетчик усреднния кодов АЦП (напряжения шлейфов) int serialCount; // счетчик времени передачи отладочных данных через UART void setup() void loop() Serial.print( (float)avarageShleif2 * 0.000097656, 2); Serial.println(" V"); // * 0.000097656 = / 50. * 5. / 1024. > >

        // обработчик прерывания, 2 мс void timerInterrupt()

        Загружаем программу в плату. Запускаем монитор порта. Проверяем:

        • Нажатие на каждую кнопку.
        • Подключаем вместо каждого шлейфа переменный резистор (например, с сопротивлением 10 кОм), а к входу платы вольтметр и проверяем, что измерение напряжений на выходах шлейфов происходит правильно.

        Дальше задумываемся о структуре программы. Варианты могут быть разные. Я выбрал такой.

        Создаем переменную режим – mode, которая определяет текущий режим работы программы. Выбираем режимы:

        mode Режим Описание 0 СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА 1 УСТАНОВКА НА СИГНАЛИЗАЦИЮ Отсчет времени (20 сек) на то, чтобы выйти из помещения и закрыть двери 2 ОХРАНА Контроль состояния датчиков 3 БЛОКИРОВКА Время на то, чтобы отключить сигнализацию секретным кодом (30 сек) 4 ТРЕВОГА Время звучания сирены (60 сек) 5 УСТАНОВКА КОДА Установка нового секретного кода

        Создадим в бесконечном цикле конструкцию для для перехода на нужный режим.

        else if ( mode == 1 )

        Для перехода на другой режим достаточно изменить значение переменной mode.

        Добавляем в отладочные данные режим.

        // назначение выводов #define BUTTON_1_PIN 9 // кнопка 1 пульта #define BUTTON_2_PIN 10 // кнопка 2 пульта #define LED_PIN 11 // светодиод пульта и внешняя индикация #define SIREN_PIN 12 // сирена подключена к выводу 9 #define SHLEIF_1_PIN A0 // шлейф 1 #define SHLEIF_2_PIN A1 // шлейф 2

        // параметры #define SET_COD_TIME 3000 // время удержания кнопок для перехода на режим установки кода (* 2 мс = 6 сек) #define FAST_TIME_FLASH_LED 50 // время частого мигания светодиода (* 2 мс, 5 раз в сек) #define SLOW_TIME_FLASH_LED 250 // время редкого мигания светодиода (* 2 мс, 1 раз в сек) #define TIME_SET_GUARD 10000 // время установки на сигнализацию (* 2 мс, 20 сек) #define TIME_BLOCK 15000 // время на ввод секретного кода (* 2 мс, 30 сек) #define TIME_ALARM 30000 // время на звучание сирены (* 2 мс, 60 сек) #define TIME_SET_COD 2500 // время паузы между вводом цифр кода (* 2 мс, 5 сек) #define MAX_U 36864 // верхний предел напряжение шлейфов (3,6 В, код = 3,6 * 1024 / 5 * 50 = 36864 ) #define MIN_U 10650 // нижний предел напряжение шлейфов (1,04 В, код = 1,04 * 1024 / 5 * 50 = 10650 )

        // адреса EEPROM #define COD_ADR 2 // адрес секретного кода #define NUMBER_ADR 4 // адрес числа битов секретного кода

        Button button1(BUTTON_1_PIN, 25); // создание объекта кнопка 1 Button button2(BUTTON_2_PIN, 25); // создание объекта кнопка 2

        unsigned int sumShleif1, sumShleif2; // переменные для суммирования кодов АЦП unsigned int avarageShleif1, avarageShleif2; // сумма кодов АЦП (среднее напряжение шлейфов * 50) unsigned int avarageCount; // счетчик усреднния кодов АЦП (напряжения шлейфов) unsigned int serialCount; // счетчик времени передачи отладочных данных через UART byte mode; // режим boolean flagTwoButtons; // признак были нажаты две кнопки unsigned int commonTimer; // таймер для разных целей unsigned int ledFlashCount; // счетчик мигания светодиода byte secretCod; // переменная для секретного кода byte bitNum; // переменная для номера бита секретного кода

        void setup()

        digitalWrite(SIREN_PIN, LOW); // сирена не звучит

        // светодиод мигает 1 раз в сек if ( ledFlashCount > SLOW_TIME_FLASH_LED )

        // проверка состояния шлейфов (датчиков) if ( (avarageShleif1 > MAX_U) || (avarageShleif1 < MIN_U) || (avarageShleif2 > MAX_U) || (avarageShleif2 < MIN_U))

        // проверка секретного кода (оформлена функцией) secretCodCheck(); >

        digitalWrite(SIREN_PIN, LOW); // сирена не звучит

        // светодиод мигает 5 раз в сек if ( ledFlashCount > FAST_TIME_FLASH_LED )

        // проверка времени на ввод секретного кода if ( commonTimer >= TIME_BLOCK )

        // проверка секретного кода (оформлена функцией) secretCodCheck(); >

        digitalWrite(SIREN_PIN, HIGH); // звучит сирена

        // светодиод мигает 5 раз в сек if ( ledFlashCount > FAST_TIME_FLASH_LED )

        // проверка времени звучания сирены if ( commonTimer >= TIME_ALARM )

        // проверка секретного кода (оформлена функцией) secretCodCheck(); >

        digitalWrite(SIREN_PIN, LOW); // сирена не звучит digitalWrite(LED_PIN, HIGH); // светодиод светится

        // ввод секретного кода if ( (button1.flagClick == true) || (button2.flagClick == true) )

        // проверка времени паузы между вводом цифр if ( commonTimer >= TIME_SET_COD ) > else mode= 0; // передача отладочных данных через UART // каждые 500 мс if ( serialCount >= 250 ) // состояние кнопок if ( button1.flagPress == true ) Serial.print(" Btn1 -_- "); else Serial.print(" Btn1 _-_ "); if ( button2.flagPress == true ) Serial.print("Btn2 -_- "); else Serial.print("Btn2 _-_ ");

        // напряжения шлейфов Serial.print(" Shleif1 color: #000080;"> Serial.print( (float)avarageShleif1 * 0.000097656, 2); Serial.print(" V"); Serial.print(" Shleif2 color: #000080;"> Serial.print( (float)avarageShleif2 * 0.000097656, 2); Serial.println(" V"); // * 0.000097656 = / 50. * 5. / 1024. > >

        button1.filterAvarage(); // вызов метода фильтрации сигнала кнопки 1 button2.filterAvarage(); // вызов метода фильтрации сигнала кнопки 2

        // чтение АЦП и усреднение значений напряжений шлейфов // в результате avarageShleif = среднее напряжение шлейфа * 50 avarageCount++; // +1 счетчик усреднения sumShleif1 += analogRead(SHLEIF_1_PIN); // суммирование кодов АЦП sumShleif2 += analogRead(SHLEIF_2_PIN); // суммирование кодов АЦП

        // проверка количества выборок усреднения (50) if ( avarageCount >= 50 )

        serialCount++; // счетчик времени передачи отладочных данных через UART commonTimer++; // таймер ledFlashCount++; // счетчик мигания светодиода > // ----------------------------- проверка секретного кода // при правильном коде устанавливает mode = 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА) void secretCodCheck()

        Загрузить скетч программы и библиотеки можно по этим ссылкам:

        Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

        Как установить библиотеку, рассказано в уроке 9. Библиотеку avr/wdt искать в интернете и устанавливать не надо. Это стандартная библиотека. Она находится в программном обеспечении для Ардуино.

        Загружаем программу в плату. Проверяем. У меня работает.

        Какой вариант устройства лучше: на базе платы Ардуино или на PIC-контроллере PIC12F629?

        Второй вариант, конечно, намного дешевле, надежнее. Но к нему невозможно добавить никаких дополнительных функций. Нет свободных выводов, да и программа написана на ассемблере. А вариант устройства на базе плате Ардуино можно развивать бесконечно. И разработка, и отладка программы для него намного проще. Решайте сами. Я думаю, все зависит от Ваших целей и возможностей.

        Алгоритмы работы устройств совершенно одинаковые. Сигнализация на PIC-контроллере почти год охраняет здание нашей фирмы, и к алгоритму работы претензий нет. Все сотрудники без проблем научились управлять устройством.