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

 

Охранная сигнализация

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

Предыдущий урок     Список уроков     Следующий урок

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

 

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

Охранная сигнализация

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

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

Сигнализация обеспечивает:

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

 

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

Структурная схема

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

  • 2 стандартных охранных шлейфа с:
    • НР – нормально разомкнутыми датчиками;
    • НЗ – нормально замкнутыми датчиками;
    • Rок – оконечными резисторами.
  • Пульт управления.
  • Наружный блок индикации режима и звукового оповещения.
  • Блок питания 12 В.
  • Источник резервного питания.

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

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

Пульт

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

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

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

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

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

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

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

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

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

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

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

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

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

Режим Состояние
светодиода
Условие перехода Переход на режим
СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА Не светится  Нажатие двух кнопок одновременно Ожидание ОХРАНЫ (20 сек).

Необходимо на то, чтобы выйти и закрыть входную дверь.

Удержание  двух кнопок нажатыми 6 сек Установка секретного кода
Ожидание охраны

Необходимо на то, чтобы выйти и закрыть входную дверь.

Часто мигает (5раз в сек) Время 20 сек                          ОХРАНА
Нажатие любой кнопки (отмена) СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА
ОХРАНА Мигает раз в секунду Срабатывание датчиков Время на отключение сигнализации секретным кодом (30 сек)

Необходимо для того, чтобы отключить сигнализацию набором кода

Время на отключение сигнализации кодом (30 сек)

Необходимо для того, чтобы отключить сигнализацию набором кода

Часто мигает
(5 раз в сек)
Набран правильный код СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА
Правильный код не набран в течение 30 сек Звукой сигнал сирены
(тревога)
Звукой сигнал сирены (тревога) Часто мигает Набран правильный код СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА
Время 60 сек СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА
Установка секретного кода Постоянно светится Набор кода СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА

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

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

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

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

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

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

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

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

Схема охранного шлейфа

Блок сигнализации контролирует сопротивление шлейфа. Если сопротивление меньше нижнего или больше верхнего порога, то устройство формирует сигнал тревоги. Нормальным считается сопротивление шлейфа , заданного оконечным резистором (часто 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.

Схема охранной сигнализации 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() {
  pinMode(LED_PIN, OUTPUT);      // вывод светодиода
  pinMode(SIREN_PIN, OUTPUT);    // вывод сирены
 
  MsTimer2::set(2, timerInterrupt); // период прерывания по таймеру 2 мс
  MsTimer2::start();                // разрешаем прерывание по таймеру

  Serial.begin(9600); // инициализируем порт, скорость 9600
  wdt_enable(WDTO_15MS); // разрешаем сторожевой таймер, тайм-аутом 15 мс 
}
void loop() {

  // передача отладочных данных через 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= ");
    Serial.print( (float)avarageShleif1 * 0.000097656, 2);
    Serial.print(" V");
    Serial.print(" Shleif2= ");
    Serial.print( (float)avarageShleif2 * 0.000097656, 2);
    Serial.println(" V");   
    // * 0.000097656 = / 50. * 5. / 1024.           
  }
}

// обработчик прерывания, 2 мс
void  timerInterrupt() {
  wdt_reset();  // сброс сторожевого таймера 

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

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

  // проверка количества выборок усреднения (50)
  if ( avarageCount >= 50 ) {
    avarageCount= 0;
    avarageShleif1 = sumShleif1; // перегрузка среднего значения
    avarageShleif2 = sumShleif2; // перегрузка среднего значения
    sumShleif1 = 0;
    sumShleif2 = 0;
    }

  serialCount++;  // счетчик времени передачи отладочных данных через UART 
}

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

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

Окно монитора порта

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

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

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

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

  if ( mode == 0 )  {
    // СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА   
  }

  else if ( mode == 1 )  {
    // УСТАНОВКА НА СИГНАЛИЗАЦИЮ   
  }

  else if ( mode == 2 )  {
    // ОХРАНА   
  }

  else if ( mode == 3 )  {
    // БЛОКИРОВКА   
  }

  else if ( mode == 4 )  {
    // ТРЕВОГА   
  }

  else if ( mode == 5 )  {
    // УСТАНОВКА КОДА   
  }
  else  mode= 0;

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

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

// режим     
Serial.print("Mode= ");  Serial.print(mode);

Теперь заполняем блоки – режимы.

Все программные блоки я подробно поясняю в комментариях программы. При заполнении каждого блока можно загружать программу в плату и проверять. Лучше отлаживать каждый блок отдельно, не дожидаясь пока накопятся ошибки. Например, можно добавить модуль ” переход на режим установки на сигнализацию”, загрузить в плату и проверить, что по нажатию двух кнопок одновременно, программа переходит на режим 1. А на нажатие одной кнопки не реагирует. Для этого мы и создавали блок передачи отладочных данных на компьютер.

Затем добавляем блок “переход на установку кода (долгое удержание двух кнопок)” и опять проверяем, что программа переходит на режим 5 при удержании обеих кнопок нажатыми в течение 6 секунд. И так постепенно отлаживаем всю программу.

Вот полный скетч программы.
// охранная сигнализация
#include <MsTimer2.h>
#include <Button.h>
#include <avr/wdt.h>
#include <EEPROM.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

// параметры
#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() {
  pinMode(LED_PIN, OUTPUT);      // вывод светодиода
  pinMode(SIREN_PIN, OUTPUT);    // вывод сирены
 
  MsTimer2::set(2, timerInterrupt); // период прерывания по таймеру 2 мс
  MsTimer2::start();                // разрешаем прерывание по таймеру

  Serial.begin(9600); // инициализируем порт, скорость 9600
  wdt_enable(WDTO_15MS); // разрешаем сторожевой таймер, тайм-аутом 15 мс 

  flagTwoButtons= false;
}
void loop() {

  if ( mode == 0 )  {
    //---------------------------------- СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА --------------------------  
   
    digitalWrite(LED_PIN, LOW); // светодиод не горит
    digitalWrite(SIREN_PIN, LOW); // сирена не звучит

    // переход на режим установки на сигнализацию (коротокое удержание двух кнопок)
    // при нажатии двух кнопок одновремено вырабатывается признак flagTwoButtons
    // переход на режим 1 происходит, если были нажаты обе кнопки, а затем они обе отжаты
    if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;
    if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false)  ) {
      // переход на установку сигнализации
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      mode = 1;  
    }

    // переход на установку кода (долгое удержание двух кнопок) 
    // если не нажата хотя бы одна кнопка, то обнуляем commonTimer
    // как только commonTimer насчитывает 6 сек, то переходим на режим 5 
    if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;
    if ( commonTimer > SET_COD_TIME ) {
      // переход на режим 5
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      secretCod= 0;
      bitNum= 0;     
      mode= 5;     
    }  
  }

  else if ( mode == 1 )  {
    //---------------------------------- УСТАНОВКА НА СИГНАЛИЗАЦИЮ ----------------------- 

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

    // светодиод мигает 5 раз в сек
    if ( ledFlashCount > FAST_TIME_FLASH_LED ) {
      ledFlashCount= 0;
      digitalWrite(LED_PIN, ! digitalRead(LED_PIN));  // инверсия светодиода
    }

    // проверка времени перехода на режим ОХРАНА
    if ( commonTimer >= TIME_SET_GUARD ) {
      // переход на режим 2 (ОХРАНА)
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      secretCod= 0;
      bitNum= 0;
      mode= 2;                       
    }

    // отказ при нажатии на любую кнопку
    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {
      // переход на режим 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА)
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      flagTwoButtons= false;
      mode= 0;             
    }                               
  }

  else if ( mode == 2 )  {
    //---------------------------------- ОХРАНА -----------------------------------------   

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

    // светодиод мигает 1 раз в сек
    if ( ledFlashCount > SLOW_TIME_FLASH_LED ) {
      ledFlashCount= 0;
      digitalWrite(LED_PIN, ! digitalRead(LED_PIN));  // инверсия светодиода
    }

    // проверка состояния шлейфов (датчиков)
    if ( (avarageShleif1 > MAX_U) || (avarageShleif1 < MIN_U) ||
         (avarageShleif2 > MAX_U) || (avarageShleif2 < MIN_U)) {
          // переход на режим 3 (БЛОКИРОВКА)
          commonTimer= 0;
          button1.flagClick= false;
          button2.flagClick= false;
          secretCod= 0;
          bitNum= 0;
          mode= 3;                       
         }

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

  else if ( mode == 3 )  {
    //---------------------------------- БЛОКИРОВКА -------------------------------------

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

    // светодиод мигает 5 раз в сек
    if ( ledFlashCount > FAST_TIME_FLASH_LED ) {
      ledFlashCount= 0;
      digitalWrite(LED_PIN, ! digitalRead(LED_PIN));  // инверсия светодиода
    }

    // проверка времени на ввод секретного кода
    if ( commonTimer >= TIME_BLOCK ) {
      // переход на режим 4 (ТРЕВОГА)
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      secretCod= 0;
      bitNum= 0;
      mode= 4;                       
    }

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

  else if ( mode == 4 )  {
    //---------------------------------- ТРЕВОГА ---------------------------------------

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

    // светодиод мигает 5 раз в сек
    if ( ledFlashCount > FAST_TIME_FLASH_LED ) {
      ledFlashCount= 0;
      digitalWrite(LED_PIN, ! digitalRead(LED_PIN));  // инверсия светодиода
    }

    // проверка времени звучания сирены
    if ( commonTimer >= TIME_ALARM ) {
      // переход на режим 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА)
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      flagTwoButtons= false;
      mode= 0;   
    }                   

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

  else if ( mode == 5 )  {
    //---------------------------------- УСТАНОВКА КОДА -------------------------------

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

    // ввод секретного кода
    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {
      // кнопку нажали
      commonTimer= 0; // сброс счетчика времени
      secretCod= secretCod << 1; // сдвиг secretCod на 1 бит
      // если нажали кнопку 1 установка 0 в младший бит secretCod
      if ( button1.flagClick == true ) {
        button1.flagClick= false;
        secretCod &= 0xfe;  // установка 0 в младший бит
      }
      // если нажали кнопку 2 установка 1 в младший бит secretCod
      if ( button2.flagClick == true ) {
        button2.flagClick= false;
        secretCod |= 1;  // установка 1 в младший бит
      }
      bitNum++; // еще один бит ввели     
    }

    // проверка времени паузы между вводом цифр
    if ( commonTimer >= TIME_SET_COD ) {
      // запись кода и числа цифр кода в EEPROM
      EEPROM.write(COD_ADR, secretCod); 
      EEPROM.write(NUMBER_ADR, bitNum);       
      // переход на режим 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА)
      commonTimer= 0;
      button1.flagClick= false;
      button2.flagClick= false;
      flagTwoButtons= false;
      mode= 0;   
    }                       
  }
  else  mode= 0;

  // передача отладочных данных через UART
  // каждые 500 мс
  if ( serialCount >= 250 ) {

    // режим
    Serial.print("Mode= "); Serial.print(mode);
   
    // состояние кнопок
    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= ");
    Serial.print( (float)avarageShleif1 * 0.000097656, 2);
    Serial.print(" V");
    Serial.print(" Shleif2= ");
    Serial.print( (float)avarageShleif2 * 0.000097656, 2);
    Serial.println(" V");   
    // * 0.000097656 = / 50. * 5. / 1024.           
  }
}

// ---------------------------------------------------обработчик прерывания, 2 мс
void  timerInterrupt() {
  wdt_reset();  // сброс сторожевого таймера 

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

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

  // проверка количества выборок усреднения (50)
  if ( avarageCount >= 50 ) {
    avarageCount= 0;
    avarageShleif1 = sumShleif1; // перегрузка среднего значения
    avarageShleif2 = sumShleif2; // перегрузка среднего значения
    sumShleif1 = 0;
    sumShleif2 = 0;
    }

  serialCount++;  // счетчик времени передачи отладочных данных через UART 
  commonTimer++;  // таймер
  ledFlashCount++; // счетчик мигания светодиода
}

//----------------------------- проверка секретного кода
// при правильном коде устанавливает mode = 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА)
void secretCodCheck() {
   
    // ввод секретного кода
    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {
      // кнопку нажали
      secretCod= secretCod << 1; // сдвиг secretCod на 1 бит
      // если нажали кнопку 1 установка 0 в младший бит secretCod
      if ( button1.flagClick == true ) {
        button1.flagClick= false;
        secretCod &= 0xfe;  // установка 0 в младший бит
      }
      // если нажали кнопку 2 установка 1 в младший бит secretCod
      if ( button2.flagClick == true ) {
        button2.flagClick= false;
        secretCod |= 1;  // установка 1 в младший бит
      }
      bitNum++; // еще один бит ввели     
    }

    // проверка секретного кода
      // проверка числа цифр   
      if ( bitNum == EEPROM.read(NUMBER_ADR) ) {
        // ввели все цифры кода
        // проверка секретного кода
        if ( secretCod == EEPROM.read(COD_ADR) ) {
          // код совпал, переход на режим 0 (СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА)
          commonTimer= 0;
          button1.flagClick= false;
          button2.flagClick= false;
          flagTwoButtons= false;
          mode= 0;             
        }   
        // код набрали неправильный
        else { secretCod= 0; bitNum= 0; }   
      }

    // сброс кода по нажатию на две кнопки
    if ( (button1.flagPress == true) && (button2.flagPress == true) ) {
        button1.flagClick= false;
        button2.flagClick= false;
        secretCod= 0;
        bitNum= 0;     
    }   
}

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

 MsTimer2 загрузить 

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

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

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

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

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

 

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

Предыдущий урок     Список уроков     Следующий урок

4

Автор публикации

не в сети 6 часов

Эдуард

285
Комментарии: 1945Публикации: 197Регистрация: 13-12-2015

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

  1. А чем обусловлен выбор конденсаторов номиналом 1 мкф в цепях кнопок и шлейфов? 0.1 мкф или даже 0.01 мкф разве недостаточно будет?

    0
    • Шлейфы могут быть длинные, а цифровая фильтрация работает в диапазоне только 0…5 В. Я бы все таки оставил 1 мкФ.

      0
  2. Вполне реальна ситуация полного пропадания питания, ну к примеру на даче.
    У вас сигнализация стартует с нуля, я бы записывал последнее состояние в EEPROM, ну в крайнем случае стартовал бы с тревоги.
    Еще раз спасибо за код.

    0
    • Я хотел реализовать такой вариант, но отказался. Можно забыть секретный код, и тогда его никогда не установить.

      0
  3. Уважаемый Эдуард!
    Сделал попытку подключить к этому проекту GSM модуль для управления на постановка \ снятие. Похоже мешает таймер прерываний. Подскажите в в чем может быть моя ошибка. Скетч находится по ссылке: https://yadi.sk/d/zpF4ZLoUyhbtU

    0
    • Евгений, здравствуйте! Мне трудно найти ошибку по скетчу. Я могу Вам посоветовать вести протокол всего, что у вас происходит с GSM модулем. Перед вызовом каждой функции посылайте в последовательный порт сообщение, а затем сообщение о результате выполнения функции. Увидите в каком месте ошибка.

      0
  4. Эдуард, большой респект за проделанную работу. Повторил систему сигнализации по предложенной схеме и всё прошло штатно.
    Для идущих следом следом сообщаю: после проверки монтажа и уровней на всех входах, начинать надо с введения кода. И не ленитесь читать весь текст от Эдуарда.

    0
  5. Помогите скетч не работает.
    Пишет ошибку:
    Arduino: 1.8.0 (Windows 7), Плата:»Arduino/Genuino Uno»

    sketch_dec28a:31: error: no matching function for call to ‘Button::Button(int, int)’

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

    ^

    C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino:31:32: note: candidates are:

    In file included from C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino:4:0:

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:14:3: note: Button::Button(uint8_t)

    Button(uint8_t pin);

    ^

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:14:3: note: candidate expects 1 argument, 2 provided

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: constexpr Button::Button(const Button&)

    class Button

    ^

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: constexpr Button::Button(Button&&)

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    sketch_dec28a:32: error: no matching function for call to ‘Button::Button(int, int)’

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

    ^

    C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino:32:32: note: candidates are:

    In file included from C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino:4:0:

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:14:3: note: Button::Button(uint8_t)

    Button(uint8_t pin);

    ^

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:14:3: note: candidate expects 1 argument, 2 provided

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: constexpr Button::Button(const Button&)

    class Button

    ^

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: constexpr Button::Button(Button&&)

    C:\Users\Руслан\Documents\Arduino\libraries\Button/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino: In function ‘void loop()’:

    sketch_dec28a:70: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

    ^

    sketch_dec28a:70: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

    ^

    sketch_dec28a:71: error: ‘class Button’ has no member named ‘flagPress’

    if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {

    ^

    sketch_dec28a:71: error: ‘class Button’ has no member named ‘flagPress’

    if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {

    ^

    sketch_dec28a:74: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:75: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:82: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

    ^

    sketch_dec28a:82: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

    ^

    sketch_dec28a:86: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:87: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:109: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:110: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:117: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:117: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:120: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:121: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:143: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:144: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:169: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:170: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:195: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:196: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:212: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:212: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:217: error: ‘class Button’ has no member named ‘flagClick’

    if ( button1.flagClick == true ) {

    ^

    sketch_dec28a:218: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:222: error: ‘class Button’ has no member named ‘flagClick’

    if ( button2.flagClick == true ) {

    ^

    sketch_dec28a:223: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:236: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:237: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:253: error: ‘class Button’ has no member named ‘flagPress’

    if ( button1.flagPress == true ) Serial.print(» Btn1 -_- «);

    ^

    sketch_dec28a:255: error: ‘class Button’ has no member named ‘flagPress’

    if ( button2.flagPress == true ) Serial.print(«Btn2 -_- «);

    ^

    C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino: In function ‘void timerInterrupt()’:

    sketch_dec28a:273: error: ‘class Button’ has no member named ‘filterAvarage’

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

    ^

    sketch_dec28a:274: error: ‘class Button’ has no member named ‘filterAvarage’

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

    ^

    C:\Users\27C6~1\AppData\Local\Temp\arduino_modified_sketch_57337\sketch_dec28a.ino: In function ‘void secretCodCheck()’:

    sketch_dec28a:302: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:302: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^

    sketch_dec28a:306: error: ‘class Button’ has no member named ‘flagClick’

    if ( button1.flagClick == true ) {

    ^

    sketch_dec28a:307: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:311: error: ‘class Button’ has no member named ‘flagClick’

    if ( button2.flagClick == true ) {

    ^

    sketch_dec28a:312: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:326: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:327: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    sketch_dec28a:336: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

    ^

    sketch_dec28a:336: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

    ^

    sketch_dec28a:337: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^

    sketch_dec28a:338: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^

    Несколько библиотек найдено для «Button.h»
    Используется: C:\Users\Руслан\Documents\Arduino\libraries\Button
    Не используется: D:\ПРОГРАММЫ\Ардуино\arduino-1.8.0-windows\arduino-1.8.0\libraries\Button
    Несколько библиотек найдено для «MsTimer2.h»
    Используется: C:\Users\Руслан\Documents\Arduino\libraries\MsTimer2
    Не используется: D:\ПРОГРАММЫ\Ардуино\arduino-1.8.0-windows\arduino-1.8.0\libraries\MsTimer2
    exit status 1
    no matching function for call to ‘Button::Button(int, int)’

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    «Показать подробный вывод во время компиляции»

    0
  6. Эдуард, спасибо большое за интересный и полезный материал.

    Объясните пожалуйста, почему в разделе «установка кода» нулевой бит вы присваиваете оператором &= и ноль записываете в шестнадцатеричном формате (0xfe), а единицу присваиваете оператором |= уже в десятичном формате (1).

    0
    • Разницы особой нет. Просто 1 в любом коде задается одинаково. А 0 в младшем разряде легко представляется в двоичном 11111110 и шестнадцатеричном fe форматах. Делайте как вам удобно.

      0
  7. Эдуард, а Вы не думали добавить в проект GSM модуль для отправки сигнала о тревоге? Я хотел попробовать взять из одного проекта готового и скрестить их, но что-то не получаеться.(

    0
  8. Здравствуйте Эдуард.

    пробовал воспроизвести скетч путём ручного перепечатывания) так вот в моей версии почему-то flagTwoButton по умолчанию в true проверял до запятой всё вроде правильно перенёс, попробовал скетч по ссылке скопировал залил работает как и должно быть. Не могу понять в чём может быть дело))

    0
    • ещё раз учитесь у Эдуарда . программу компилируйте шаг за шагом после записи каждого блока . а если сразу всю напишите то ошибку компилятор будет показывать в одном месте хотя на самом деле ошибка будет в совсем другом конце программы , и ошибку не найдёте . а так идёте шаг за шагом и оппа вылезла ошибка значит надо искать ошибку прямо здесь . сначала пишете верх проги с включением библиотек , переменные и константы . затем в void setup всё заполняете как надо . затем в void loop вставляете конструкцию
      if ( mode == 0 ) {
      // СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА
      }

      else if ( mode == 1 ) {
      // УСТАНОВКА НА СИГНАЛИЗАЦИЮ
      }

      else if ( mode == 2 ) {
      // ОХРАНА
      }

      else if ( mode == 3 ) {
      // БЛОКИРОВКА
      }

      else if ( mode == 4 ) {
      // ТРЕВОГА
      }

      else if ( mode == 5 ) {
      // УСТАНОВКА КОДА
      }
      else mode= 0;
      это остов будущей программы . и начинаете заполнять блоки один за другим и после каждого блока компилируете . сначала компилятор потребует у вас функцию timerInterrupt . недолго думая после конструкции дописываете
      void timerInterrupt {
      }
      и кампиляция пойдёт нормально до третьего блока mode==3 .здесь кампилятор попросит показать secretCodCheck
      опять недолго думая ниже timeInterrupt () {
      }
      пишете void secretCodCheck() {
      } ( пока всё пустое заполнять будете после блоков )
      и дальше шаг за шагом идёте и записываете и компилируете блок за блоком .и ошибки сразу видно дальше шаг за шагом заполняете timerInterrupt и secretCodCheck. главное не забудьте что в шестьнадцетеричном описании 0xfe символ 0 —это кнопка цифры 0 нуля , но не буква о . и в будущем научитесь легко и не страдая писать программы шаг за шагом компилируя каждый шаг .

      0
  9. Здравствуйте, Эдуард. Поясните, а какие датчики являются нормально разомкнутыми (я так понимаю, что герконы на дверях нормально замкнуты)? И еще, обязательно ли в шлейфе наличие и нормально-замкнутых и нормально-разомкнутых датчиков?

    0
    • Здравствуйте!
      Посмотрите внимательно на схему шлейфа. В нормальном состоянии (когда сигнализация не должна сработать) полная цепь шлейфа должна иметь сопротивление равное оконечному резистору. На моей схеме 2 кОм. Если разомкнется любой НЗ датчик, то сопротивление шлейфа будет бесконечное. Если замкнется любой НР датчик, то сопротивление шлейфа будет близко к 0.
      Можно использовать любые датчики НЗ и НР в любых сочетаниях. На схеме состояния датчиков показаны для режима целостности шлейфа (сигнализация не должна срабатывать).

      0
    • Датчики движения или акустические датчики разбития стекла могут быть нормально разомкнутыми

      0
  10. Здравствуйте, Эдуард. Поясните пожалуйста по каким критериям ( формулам) Вы выбирали резисторы (R7, R8) , конденсатор ( С4) от дребезга кнопки 1 и их номиналы ?
    Спасибо за ответ
    P/S: можно пожалуйста подробно я просто только начинающий 😉

    0
    • Здравствуйте!
      Я уже точно не помню, но логика была примерно такой.
      Резистор R7 чем меньше, тем выше помехозащищенность линии. Но с уменьшением его сопротивления увеличивается ток через кнопку, увеличивается мощность рассеивания на резисторе R7 и ток потребления схемы.
      Есть еще серьезное ограничение снизу сопротивления R7.
      Ток от источника 12 В через R7 и R8 втекает во вход микроконтроллера. Дальше он через защитный диод поступает на источник питания микроконтроллера 5 В. Этот ток не должен сжечь защитный диод (примерно 25 мА) и не должен поднять напряжение 5 В. Т.е. он должен быть гарантированно меньше тока потребления платы от источника 5 В.
      Из этих соображения я выбрал сопротивления резисторов. В моей схеме:
      — ток при замыкании кнопки = 12 / 4.3 = 3 мА;
      — при разомкнутой кнопке ток = (12 — 5) / (4.3 + 1) = 1,3 мА.
      С учетом того, что сигналы в цепи медленные, конденсатор я выбрал максимальной емкости типа 0805 из тех, что у меня были под рукой.
      Постоянная времени 1 кОм * 1 мкФ = 1 мс. Можно выбрать и больше, не будут нажимать кнопку с частотой 1000 раз в секунду.
      Я не претендую на то, что сопротивления резисторов выбраны оптимально.
      Самат, если у вас какие-то достаточно объемные вопросы требующие рисунков, расчетов, то лучше открывайте тему на форуме сайта.

      0
      • Забыл добавить, что резистор R8 ограничивает ток на входе микроконтроллера, который может появиться из-за выбросов и наводок в длинной линии связи с кнопкой.

        0
  11. Здравствуйте , хотел попробовать на практике но к сожалению скетч по ссылки не грузится ( исправте пожалуйста.

    0
    • Здравствуйте!
      У всех грузится. Какую ошибку выдает?
      Может библиотеки не подключили. Скетч должен быть в папке, названной латинскими символами.

      0
  12. Очень качественный материал! Читаю с упоением 🙂
    Позвольте имхо: в режиме СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА было бы здорово приделать еще индикацию готовности помещения к переходу в режим охраны: то есть все двери , окна, и прочие элементы шлейфа охраны находятся в «закрытом» состоянии. А то ставим на охрану, а оно орет… а, блин, окно забыли закрыть! Из жизни. 🙂 Вам респект и глубочайшая уважуха!

    1
    • Здравствуйте!
      Спасибо за такую оценку сайта.
      По поводу замечания. У нас эксплуатируется вариант на PIC контроллере. Да, мы тоже заметили этот недостаток. Но это самый простой вариант сигнализации. На PIC контроллере даже выводов нет добавить индикацию текущего состояния датчиков охраны. А на Ардуино это скорее учебный проект. Собираюсь создать на сайте раздел проекты Ардуино, может там доработаю устройство.

      0
  13. Здравствуйте Эдуард,
    я очень заинтерисовался вашим сайтом и могу сказать что здесь у вас очень много интересного и полезного.
    Так вот вопрос по поводу сигнализации:
    можно ли подключить не выключатель а какой нибудь фотоэлемент. Идея такая — на окнах жалюзи закрыты и в помощении очень темно поэтому тот кто залезет все равно захочет включить свет))). В моем случае к телефону с крышы идут четырех жильные тонкие провода так вот 2 из них свободны и можно использовать.

    PC Ждем проекты Ардуино где будет доработана сигнализация.

    0
    • Здравствуйте!
      Надо подключить фотодатчик к аналоговому входу вместо шлейфа. И в программе задать нужные пороги.
      #define MAX_U 36864 // верхний предел напряжение шлейфов (3,6 В, код = 3,6 * 1024 / 5 * 50 = 36864 )
      #define MIN_U 10650 // нижний предел напряжение шлейфов (1,04 В, код = 1,04 * 1024 / 5 * 50 = 10650 )
      Шлейфы в программе обрабатываются как аналоговые датчики.

      0
  14. Здравствуйте!
    Я не понимаю как сделать нз нр датчики. Это два провода, что разомкнуты и два провода, что замкнуты?

    0
    • Здравствуйте!
      НЗ (нормально замкнутые) — датчики, которые в рабочем состоянии замкнуты, а при взломе размыкаются. Например, геркон, установленный рядом с дверью. На двери расположен магнит. При закрытой двери геркон замкнут.
      НР (нормально разомкнутый) — датчик замыкается при взломе.

      0
        • Здравствуйте!
          Насколько я знаю, существует много разных типов датчиков охраны. Поищите в интернете. Я использовал герконы на двери, которые уже были установлены.

          0
          • Здравствуйте!
            У Вас установлены такие герконы? (https://drive.google.com/file/d/1CotvprOQxWDEcXip1tZZJxny909Gp72G/view?usp=sharing)

            0
  15. Здравстуйте!
    Нз и нр датчики это простые провода, что спаянны вместе и наоборот распаяны?

    0
  16. Здравствуйте Эдуард.
    Мне не понятно для чего после модуля установки кода:
    else if ( mode == 5 ) {
    …код
    }
    идет оператор: else mode = 0;
    У меня все работает без него. Спасибо вам за уроки.

    0
    • Здравствуйте!
      При правильной работе программы переменная mode никогда не может принимать значения больше 5. Поэтому этот блок (else) никогда выполняться не будет. Но в реальных условиях может произойти сбой. Представьте себе, что mode стало равным 10. Тогда программа просто зависнет. Ни один из блоков выполняться не будет.
      Хороший стиль — разрабатывать программы, которые ни при каких условиях не зависают. С этим блоком (else) при сбое переменной mode программа зависать не будет.

      0
    • Здравствуйте!
      Конструктор класса Button описан в уроке 7.
      Это число выборок состояния кнопки для фильтрации от помех. В данном случае время усреднения равно 25 * 2 мс = 50 мс.

      0
  17. Здравствуйте! Питания от сети usb входа достаточно, чтобы схема работала?

    0
    • Здравствуйте!
      Да, 500 мА вполне достаточно. Но в схеме используется 12 В для шлейфов, кнопок, сирены… Если все это подключить к 5 В, то хуже будет помехозащищенность устройства. При этом необходимо пересчитать сопротивление резисторов.

      0
  18. Здравствуйте. А для счетчика отладочных данных тоже надо сброс делать? У Вас сброс отсутствует.
    Спасибо большое за статьи, очень полезная информация.

    0
      • Это понятно, но частота вывода отладочной информации не будет каждые 500 мс, т.к. нету в коде обнуления переменной serialCount, информация будет выводиться с максимально возможной частотой. В блоке «передача отладочных данных через UART» не хватает строки serialCount= 0.

        0
  19. Эдуард, отличная работа!
    Программа для проверки отсылает данные на com чуть больше минуты, затем пауза также чуть больше минуты, затем снова работа и т.д. Как это объяснить?

    0
    • Причем при обнулении счетчика serialCount (см выше коммент Михаила) такой эффект не наблюдается, ну или ждать нужно долго.

      0
      • Скорее всего наступает переполнение счетчика serialCount, и программа подвисает. Затем сторожевой таймер делает ресет и работа до следующего зависона.

        0
  20. Можно вопрос. Планирую систему полива с датчиками влажности земли и воздуха на удалении 6 м от про мини и клапан на воду 12в через реле примерно 3 метра. Будет ли работать из-за расстояния система, или нужно поставить как в вашей сигнализации усилитель сирены на клапан , а датчики подключить как шлейф герконов. Питание планирую 12в, но на плату подать 5 вольт через преобразователь.

    0
    • Здравствуйте!
      А какие у вас датчики? Активные, т.е. на них поступает питание, а на выходе аналоговый сигнал? Какой уровень сигнала?
      Эмпирически расстояние 6 м на грани допустимого. Если поставите RC фильтр и сделаете цифровую фильтрацию, возможно будет работать.

      0
      • Датчики для Ардуино. DHT22 и почвы LM393 . У вас на схеме питания от батареек и блока питания нет с3 на 470пф, который присутствует на общей схеме. Он нужен?

        0
        • Здравствуйте!
          Да, конденсатор 470 мкФ лучше ставить, особенно если блок питания установлен не рядом с контроллером. При питании от батареи он сгладит резкие перепады тока потребления, позволит работать устройству при более разряженной батареи.

          0
  21. Да ещё на схеме питания не указан с3 на 470пф, котрый присутствует на общей схеме.

    0
  22. Добрый день Эдуард. Понравилась Ваша сигнализация на ардуино. У меня вопрос, могли бы Вы написать скетч под немного изменённую схему, с электроникой знаком хорошо ,а вот программирование пока тяжело даётся после 55 лет.

    0
      • Вход 6 шлейфов, выход 6 светодиодов (контроль зон),1 светодиод мигающий (контроль работы устройства) ,вместо бузера будет релюшка. кнопка сброс, постановка на охрану кнопка с фиксацией, при срабатывании любой из зон загорается соответствующий светодиод. релюшка срабатывает при нарушении любого шлейфа, данное устройство необходимо на пульт охраны, коды на включение(отключение) не нужны. Обязуюсь предоставить Вам схему, плату для данного проекта.Заранее благодарен!

        0
  23. Эдуард, а подскажите плиз такой вопрос. Вот Вы для работы с кнопками сделали свой класс Button и активно его используете в своих программах. А есть ли смысл для светодиода сделать класс Led? И все что связано со светодиодом поместить в это класс, сделать для него, например, методы Blink(), Fader(),… ledTimeCount тоже сделать свойством этого класса. Или для таких «мелких» объектов нет смысла перегружать программу лишними классами?

    0
    • Здравствуйте!
      Вы сами ответили на вопрос. Если вы превращаете светодиод в сложный объект, который должен мигать с разной частотой и т.п., то возможно, и имеет смысл создать класс. Если вам необходимо только зажигать и гасить светодиод, то необходимость в классе отпадает. К тому же, каждое обращение к функции занимает достаточно много времени.

      0
  24. Здравствуйте!
    Я загрузил скетч в ардуино. Собрал на макетке, но столкнулся с проблемами:
    1) Кнопками я управляю, когда вытаскиваю провода от минуса с земли. То есть, если ничего не трогать, то в мониторе порта «mode=0», а если вытащить землю от кнопки, то переходит в «mode =1». Или даже так, сначала нажимаешь, потом вынимаешь землю и переходит в режим. 2 раза получилось, дошло до 4 режима и заработала сигнализация.
    2) Я не подключал геркон в этот момент. Вообще, я максимально упростил все, оставив резисторы, чтобы не сгорело, хотя, что там может сгореть от 5 вольт?хммм… Кстати, от 5в все работает.
    3) Если подключить геркон, то Shleif1= 0.1 V Shleif2= 0.1 V, а если не подключать Shleif1= 0.29 V Shleif2= 0.29 V. Что нужно менять в скетче, чтобы настроить тревогу на новые параметры шлейфов?
    4) Почему я не питаю плату от 12 или 9В? Вот, что мне сказал друг: «если ты посмотришь на плату — Vin не идёт на стабилизатор, там дорожка идёт прямо в чип
    А через коннектор, который круглый, дорожки идут на стабилизатор»
    5)Иногда, когда удавалось запустить работу схемы через непонятно как работающие кнопки, после режима 1, шел 2 и сразу обратно в 0, с чем это может быть связано?

    0
    • Здравствуйте!
      1. Устройство работает с нормально разомкнутыми кнопками. Активное состояние низкий уровень.
      3. Элементы схемы измерения сопротивления шлейфов рассчитаны на питание 12 В. Напряжение на соответствующих аналоговых входах зависят от сопротивления шлейфа и они указаны в статье.
      4. На плате Arduino Uno R3 с вывода Vin питание подается на стабилизатор. Если используется питание одновременно от USB компьютера и внешнего источника питания, то питание на плату Ардуино лучше подавать через разъем внешнего питания. При этом в цепь питания включается защитный диод. Он исключает ситуацию, когда на выход стабилизатора 5 В платы подается питание от USB, а вход стабилизатора замыкается на землю через отключенный внешний блок питания.
      5. Необходимо добиться нормальной работы измерителе напряжения шлейфов и кнопок (контроль состояния по данным монитора последовательного порта). Схема простая. Какие там могут быть проблемы? Можно измерить напряжение на входах платы Ардуино, соответствующих кнопкам и шлейфам.

      0
      • Собрал еще раз. Ели ничего не трогать, то идет mod=0, и кнопки в состоянии «_-_». Как только я нажимаю их, идет режим 1, потом наступает режим и мгновенно сброс до режима 0. С чем моет быть связано?

        0
      • Подумал еще раз, немного переписал код и все получилось! Добился работы схемы от usb, убрал только установку кода. Отличная статься и сайт!

        0
      • Произошла странность. Как то сделал, что при разрыве геркона напряжение было больше, а при установке геркона меньше и все работало. Как я это мог сделать?

        0
        • Добейтись уверенного срабатывания кнопок и измерения напряжения шлейфов без учета режимов. Монитор последовательного порта должен отображать правильно текущее состояние. Только затем проверяйте алгоритм.

          0
  25. Здравствуйте, Эдуард. Спасибо за отличную идею использовать промышленные охранные извещатели на платформе Arduino, тем более, что сертифицированные КПП стоят довольно дорого, те же Гранит, Болит, Стрелец или Рубеж. А здесь получается очень простая и недорогая конструкция, которую каждый может сам собрать и пользоваться, для себя, конечно. Это здорово! Далее, хотел спросить… А вот хорошо бы в схеме использовать и пожарные извещатели, например, те же ИП212 ? И ещё, у охранных имеется кнопка тампера. Может её бы тоже завести на вход прибора?

    0
    • Здравствуйте!
      У меня нет достаточного опыта в этой области. Насколько я понимаю, пожарные извещатели имеют такой же интерфейс и могут быть подключены к устройству.
      Кнопку тоже можно подключить к охранному шлейфу.
      Единственно, на сайте есть аналог http://mypractic.ru/oxrannaya-signalizaciya-svoimi-rukami.html. Меня попросили в нем сделать, чтобы на второй шлейф сигнализация срабатывала мгновенно. На форуме сайта есть измененная программа. Для кнопки нужен такой шлейф без задержки.

      0
  26. Здравствуйте, Эдуард. Очень понравился ваш урок по охранной сигнализации. Интересно узнать, что вы использовали для её создания(в особенности о, что вы использовали в качестве сирены ). Можете ли вы об этом написать или что-нибудь подсказать по выбору компонентов?

    0
    • Здравствуйте!
      Посмотрите в рубрике Разработки описание этого устройства на PIC контроллере. Вроде там написано.
      Я использовал активную сирену, оставшуюся со старой сигнализации.

      0
  27. Здравствуйте, Эдуард.
    Выше в комментариях Вы говорите что, переменная mode не
    может принимать значение больше 10. Скажите почему? И что если Мне в моем проекте необходимо установить девять блоков
    if (mode==0)…..else if (mode==9) Как быть в таком случае.?

    0
    • Здравствуйте!
      Я не понял вопроса. По сути это конструкция множественного выбора. Вы задаете столько элементов else if, сколько вам надо, сколько существует шагов автомата в вашем алгоритме.

      0
  28. Эдуард! Подсветите, пожалуйста, почему в функции secretCodCheck сдвиг на разряд производится до установки бита.
    С уважением.

    0
    • Здравствуйте!
      Я точно не помню. Скорее всего бит устанавливается в старшем разряде. Значит надо сначала сдвинуть, чтобы не потерять предыдущий.

      0
  29. В функции secretCodCheck :// ввод секретного кода
    if ( (button1.flagClick == true) || (button2.flagClick == true) )

    Что бы исключить вариант одновременного нажатия двух кнопок (это особое действие) — использовать ИСКЛЮЧАЮЩЕЕ ИЛИ?

    0
  30. ZDRAVSTVUYTE. MNE OCHEN PONRAVİLSYA VASH PROEKT. YA MNOGO NE RAZBERAYUS S KODAMİ. MOJET YA CHTO TO NE PRAVİLO DELAYU. ESLİ MOJNO POMOGİTE İSPRAVİT OSHİBKU MOYU.
    VOT TOT OSHİBKA KOTORUYU POKAZİVAET;

    Arduino:1.8.10 (Windows 10), Kart:»LilyPad Arduino USB»

    Taslak adının değiştirilmesi gerekiyordu.
    Eskiz isimleri bir harf veya rakamla başlamalı, ardından harf
    sayılar, kısa çizgiler, noktalar ve alt çizgiler izlemeli. Maksimum uzunluk 63 karakterdir.

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:30:32: error: no matching function for call to ‘Button::Button(int, int)’

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

    ^

    In file included from C:\Users\zabit\Desktop\arduino dosyasi\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino:3:0:

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:14:3: note: candidate: Button::Button(uint8_t)

    Button(uint8_t pin);

    ^~~~~~

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:14:3: note: candidate expects 1 argument, 2 provided

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate: constexpr Button::Button(const Button&)

    class Button

    ^~~~~~

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate: constexpr Button::Button(Button&&)

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:31:32: error: no matching function for call to ‘Button::Button(int, int)’

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

    ^

    In file included from C:\Users\zabit\Desktop\arduino dosyasi\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino:3:0:

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:14:3: note: candidate: Button::Button(uint8_t)

    Button(uint8_t pin);

    ^~~~~~

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:14:3: note: candidate expects 1 argument, 2 provided

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate: constexpr Button::Button(const Button&)

    class Button

    ^~~~~~

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate: constexpr Button::Button(Button&&)

    C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0/Button.h:11:7: note: candidate expects 1 argument, 2 provided

    C:\Users\zabit\Desktop\arduino dosyasi\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino: In function ‘void loop()’:

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:67:19: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:67:50: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:68:47: error: ‘class Button’ has no member named ‘flagPress’

    if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:68:79: error: ‘class Button’ has no member named ‘flagPress’

    if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:71:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:72:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:79:19: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:79:51: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:83:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:84:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:106:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:107:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:114:19: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:114:50: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:117:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:118:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:140:19: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:141:19: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:166:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:167:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:192:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:193:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:209:19: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:209:50: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:214:20: error: ‘class Button’ has no member named ‘flagClick’

    if ( button1.flagClick == true ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:215:17: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:219:20: error: ‘class Button’ has no member named ‘flagClick’

    if ( button2.flagClick == true ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:220:17: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:233:15: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:234:15: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:249:18: error: ‘class Button’ has no member named ‘flagPress’

    if ( button1.flagPress == true ) Serial.print(» Btn1 -_- «);

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:251:18: error: ‘class Button’ has no member named ‘flagPress’

    if ( button2.flagPress == true ) Serial.print(«Btn2 -_- «);

    ^~~~~~~~~

    C:\Users\zabit\Desktop\arduino dosyasi\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino: In function ‘void timerInterrupt()’:

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:269:11: error: ‘class Button’ has no member named ‘filterAvarage’

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

    ^~~~~~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:270:11: error: ‘class Button’ has no member named ‘filterAvarage’

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

    ^~~~~~~~~~~~~

    C:\Users\zabit\Desktop\arduino dosyasi\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH\UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino: In function ‘void secretCodCheck()’:

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:297:19: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:297:50: error: ‘class Button’ has no member named ‘flagClick’

    if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:301:20: error: ‘class Button’ has no member named ‘flagClick’

    if ( button1.flagClick == true ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:302:17: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:306:20: error: ‘class Button’ has no member named ‘flagClick’

    if ( button2.flagClick == true ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:307:17: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:321:19: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:322:19: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:331:19: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:331:50: error: ‘class Button’ has no member named ‘flagPress’

    if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:332:17: error: ‘class Button’ has no member named ‘flagClick’

    button1.flagClick= false;

    ^~~~~~~~~

    UNO_OHRANA_2_BUTTON_POLNIY_SCETCH:333:17: error: ‘class Button’ has no member named ‘flagClick’

    button2.flagClick= false;

    ^~~~~~~~~

    «MsTimer2.h» için birden fazla library bulundu
    Kullanılıyor: C:\Users\zabit\Documents\Arduino\libraries\MsTimer2
    Kullanılmıyor: C:\Users\zabit\Documents\Arduino\libraries\MsTimer2-master
    «Button.h» için birden fazla library bulundu
    Kullanılıyor: C:\Users\zabit\Documents\Arduino\libraries\Button-1.0.0
    Kullanılmıyor: C:\Users\zabit\Documents\Arduino\libraries\Arduino-Library-Button-master
    «EEPROM.h» için birden fazla library bulundu
    Kullanılıyor: C:\Users\zabit\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\EEPROM
    exit status 1
    no matching function for call to ‘Button::Button(int, int)’

    This report would have more information with
    «Show verbose output during compilation»
    option enabled in File -> Preferences.

    0
    • Здравствуйте!
      Скорее всего у вас установлена не та библиотека Button. Есть другая библиотека с таким же именем. Загрузите библиотеку Button с моего сайта. Если у вас не получается оформить доступ, то напишите мне, я вышлю.

      0
  31. Образцы
    buttonLibrary_Ex12_AsBitMask
    buttonLibrary_Ex11_ShiftRegister
    buttonLibrary_Ex10_holdDelay
    buttonLibrary_Ex07_toggle
    buttonLibrary_Ex05_onRelease
    buttonLibrary_Ex04_onPress
    buttonLibrary_Ex08_onDoubleClick
    buttonLibrary_Ex01_if_MainListener
    buttonLibrary_Ex03_onChange
    buttonLibrary_Ex09_pressCounters
    buttonLibrary_Ex02_while_forcedListen
    buttonLibrary_Ex06_debouncing

    mojet odin iz etih. neskolko biblioteku zagruzil . opyat odnoi toje.

    0
  32. dobriy vecher. ya opyat vas bespokoyu. za eto izvenyayus. .

    ya vseo poprobival. teper vot chto pokazivaet

    Arduino: 1.8.10 (Windows 10), карта: «Arduino Uno»

    Найдено несколько библиотек для «MsTimer2.h»
    Использование: C: \ Users \ zabit \ Documents \ Arduino \ library \ MsTimer2
    Не используется: C: \ Users \ офицер \ Documents \ Arduino \ library \ MsTimer2-master
    Найдено несколько библиотек для «Button.h»
    Использование: C: \ Users \ офицер \ Documents \ Arduino \ library \ Button
    Не используется: C: \ Users \ офицер \ Documents \ Arduino \ library \ Button-1.0.0
    Не используется: C: \ Users \ офицер \ Documents \ Arduino \ library \ Button-master
    В файл включен из C: \ Users \ employee \ Desktop \ arduino file \ UNO_OHRANA_2_BUTTON_POLNIY_SCETCH \ UNO_OHRANA_2_BUTTON_POLNIY_SCETCH.ino: 4: 0:

    Не используется: C: \ Users \ офицер \ Documents \ Arduino \ library \ Arduino-Library-Button-master
    C: \ Users \ zabit \ Documents \ Arduino \ library \ Button / Button.h: 23: 10: фатальная ошибка: WProgram.h: такого файла или каталога нет

     #include «WProgram.h»

              ^ ~~~~~~~~~~~

    компиляция прекращена.

    статус выхода 1
    Ошибка компиляции для платы Arduino Uno.

    Этот отчет будет иметь больше информации с
    «Показать подробный вывод во время компиляции»
    опция включена в Файл -> Настройки.

    0
    • Здравствуйте! Не беспокойтесь, спрашивайте сколько надо.

      Удалите другую библиотеку Button. Оставьте только мою.

      0
  33. А что будет, если на охранный шлейф будет подано напряжение 220 вольт? Иди от шокера несколько киловольт. Что сгорит один пин или весь контроллер? Такие испытания проводились?

    0
    • Здравствуйте!
      Зависит от того, какой мощности резисторы используются в шлейфе. Может ничего и не сгореть.

      0
  34. Здравствуйте, Эдуард. Использую Ваш код не для охранной сигнализации. Столкнулся с такой проблемой: мне не нужен режим ожидания (mode = 1). Я изменил код чтобы по нажатию сразу двух кнопок включался mode 2. Но после первого включения платы первый переход из mode 0 в mode 2 и обратно в mode 0 (после ввода кода) происходит правильно. А при следующей попытке перейти в mode 2 происходит включение на мгновение mode 2 и сразу обратно в mode 0. После перезапуска монитора порта или сброса платы первое включение mode 2 опять происходит правильно. В чем может быть проблема? Подскажите пожалуйста.

    0
  35. И еще вопрос. Как в функции void secretCodCheck() определяется окончание ввода кода? Там же нет привязки к таймеру commonTimer (как в режиме установки кода), хотя есть его сброс.

    0
  36. Вопрос с невключением mode 2 решен. Добавил сброс secretCod = 0; bitNum = 0 в функцию secretCodCheck() после успешной проверки кода.

    0
    • Здравствуйте!
      Ограничения по времени для ввода кода нет. Нужно нажать 2 кнопки одновременно и можно вводить новый код.

      0
  37. Добрый день!
    Столкнулся с проблемой. После снятия с охраны секретным кодом сирена не отключается и в скетче не вижу этого хотя светодиод перестает гореть.
    В чем может быть проблема?

    0
    • Здравствуйте!
      Отключается в этой функции
      // проверка секретного кода (оформлена функцией)
      secretCodCheck();
      Вы уверены, что правильно код набираете? В каком режиме не отключается ОХРАНА или ТРЕВОГА? Или в обоих?

      0
  38. Я так понимаю что сирена должна отключатся этим выражением digitalWrite(SIREN_PIN, LOW); в конструкции тревога. Но его там нет.Есть подозрение что при снятии сигнала с базы транзистора не происходит разрыв контакта между эмитером и коллектором. Код верный, не отключается в режиме охрана

    0
    • Здравствуйте!
      Сирена отключается за счет того, что устройство переходит на режим 0.
      if ( mode == 0 ) {
      //———————————- СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА —————————

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

      А там она отключается циклически.

      0
  39. Спасибо собрал заработала сразу. Но есть вопросы: 1- при сработке и отсчете положенного времени тревоги система становится в выключенное состояние, что не всегда удобно. 2- как добавить еще один шлейф где не будет задержки срабатывания тревоги (для датчиков разбития окон, дверей аварийного выхода и т.д.).

    0
    • Здравствуйте!
      В программе простой пошаговый автомат. Очень легко изменить переходы между режимами.
      После окончания сигнала тревоги автомат переходит на шаг 0 — отключено.
      //———————————- ТРЕВОГА —————————————

      // проверка времени звучания сирены
      if ( commonTimer >= TIME_ALARM ) {
      . . . . . . . . . . . . .
      mode= 0;
      }
      Если хотите, чтобы устройство осталось на охране надо перейти на шаг 2.
      mode= 2;
      }
      При срабатывании датчика в режиме ОХРАНА устройство переходит на режим БЛОКИРОВКА для ввода секретного кода (на шаг 3).
      else if ( mode == 2 ) {
      //———————————- ОХРАНА ——————————————

      // проверка состояния шлейфов (датчиков)
      mode= 3;
      }
      Если надо пробросить задержку, сразу переходите на режим ТРЕВОГА.
      mode= 4;

      0
  40. Спасибо за подсказку, работает. В дальнейшем хочу подключить датчик движения LC-100-PI. Будет ли дальнейшее развитие данной системы? В некоторых случаях было бы удобно снимать с охраны с помощью RFID карты и совместная работа с ESP 8266 (Nodemcu v3).

    0
    • Это простейшая охранная сигнализация, для разработки которой достаточно знаний из начальных уроков. О ее развитии говорить как-то не серьезно.

      0
  41. Добрый день. У меня просьба, если я вас сильно не озадачу. Как убрать задержку срабатывания с одного шлейфа? Я его подключил на датчики окон, а там задержка не нужна. Спасибо.

    0
  42. Здравствуйте Эдуард. Мне очень понравилась ваша схема. Хочу повторить ее. Но есть один вопрос. Почему задание тока на шлейфе подтянут к 12В. Можно же было оперировать и 5В. Тогда бы исключался перенапряжение портов.

    0
    • Здравствуйте!
      Перенапряжение исключается за счет ограничивающих резисторов и защитных диодов микроконтроллера.
      При 12 В выше помехозащищенность системы, что очень важно для длинных шлейфов. И к тому же некоторые датчики-контакты неустойчиво работают при низком напряжении.

      0
  43. Здравствуйте,

    Подскажите пожалуйста, как подкючить датчик движения Bravo 201 к шлейфу данной сигнализации. Фото внутреностей датчика: https://cache3.youla.io/files/images/720_720_out/5a/cb/5acb7469f56795551b3ebd04.jpg

    Благодарю за внимание!

    0
    • Здравствуйте!
      Я не знаю, там контакты на замыкание при срабатывании или на размыкание. В уроке есть схема подключения к устройству нормально замкнутых и нормально разомкнутых контактов.

      0
      • Контаксты NC и С — нормально закрытые получаются. Проверил мультиметром, когда движения нет — NC и С прозваниваются, когда датчик срабатывает — NC и С размыкаются.

        0
    • Здравствуйте!
      Это вес единицы измеренного и усредненного кода.
      5 В (диапазон АЦП) / 1024 (число градаций АЦП) / 50 (число усреднений)

      0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".