Идея создания сигнализации

Тема в разделе "Arduino & Shields", создана пользователем CYITEP_BAC9I, 30 окт 2016.

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

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

    Ну и собственно вопросы.

    Планируются 7 датчиков вибрации, выполняющих роль датчиков разбития стекла. Каждый подключен к отдельному входу и обрабатывается отдельной частью кода. ( это необходимо из за нехорошей особенности датчиков находится в изначальном состоянии непредсказуемо ,в LOW или HIGH, из за особенности конструкции.)

    И есть мысль в виде фильтра ложных срабатываний. Если сработали все датчики одновременно или определенная группа датчиков в течении 0,5 сек. То это ложное срабатывание и сигнализация не срабатывает. Это нужно на случай грома взрыва, старого трамвая проходящего рядом.

    И у меня трудность как это реализовать. Есть идея что надо сравнивать время сработки датчиков с каким ни будь, контрольным временем. И вот вопрос где его взять? Или приобрести отдельный модуль реального времени и на него все завязать?

    Или можно, как ни будь проще, решить эту задачу? Не прошу написать мне скетч или дословно разжевать ( мне самому интересно решать такие задачки, хотя если кто детально все разложит по полочкам, большое тому спасибо)).

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


    Вопрос. Вообще вся схема мне видится так.

    1. 4 группы герконов. 1 рубеж, сигнализация срабатывает при любом изменении состояния любой из групп
    2. 7 датчиков вибрации по 3 группы. Сигналы фильтруются на ложные срабатывания
    3. Датчики движения. (планируется по 2 на каждую комнаты, для минимизации ложных срабатываний
    4. Несколько тензодатчиков настроенных на срабатывание при давлении на них более 30 кг.
    5. Контрольный кошелек) с акселерометром. При его движении срабатывает сигнализация
    6. Замок с RFID ключами
    7. Отправка SMS о всех срабатываниях датчиков. Постановка и снятие с охраны смс и кнопкой.
    8. Функция предварительного контроля состояния датчиков, соответственно лед индикация состояния каждой из групп датчков

    Вот как то так. И вытекающий вопрос Ардуино Мега потянет всю эту очумелую мысль. Или урезать карасей?)

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

    И еще вопрос косвенно касающийся этой темы. Имеет чисто теоретический характер. Как сделать что бы значение определенной переменной не изменялось после наступления события?

    if(voltmetr_in >= 900)
    {
    releState = 1;
    digitalWrite(RELE_PIN, releState);
    }

    Это упрощенный пример ситуации. Мне нужно чтобы переменная releState и дальше находилась во включенном состоянии, независимо как будет понижаться показания переменной voltmeter. Пока что у меня хватает тяму сделать задержку это состояния millis. Но это некрасиво. И помимо этого ардуино еще обрабатывает несколько датчиков. Какие еще варианты решения этой задачки существуют?) (delay не предлагать!!! Циклы оставливающие рабуту дуси тоже не желательно) С уважением Вася
     
  2. Airbus

    Airbus Радиохулиган Модератор

    А форум не читали?Была интересная тема про работу с ГСМ модулем и про сигнализацию уже было Контроль датчиков лучше сделать на прерываниях.Затем 5 сек задержки и АТ команда модулю на дозвон/отправку смс.А что в delay не нравиться?Вообщем выкладывайте Ваш скетч обсудим поправим поможем.
     
    CYITEP_BAC9I нравится это.
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if(releState == 0 && voltmetr_in >= 900)
      {
      releState = 1;
      digitalWrite(RELE_PIN, releState);
      }
     
    CYITEP_BAC9I нравится это.
  4. qwone

    qwone Гик

    Я бы записал так.
    Код (C++):
    if(! releState  && voltmetr_in >= 900)
      digitalWrite(RELE_PIN, releState=1);
     
    Потому что короче, хотя и не понятно многим.
     
    CYITEP_BAC9I нравится это.
  5. rkit

    rkit Гуру

    millis(), но надо не забыть обработать переполнение счетчика

    Запоминаете все срабатывания. Проверяете, сколько их случилось за последнюю пару минут.

    С расширителями ввода-вывода потянет, но я советую урезать, и делать поэтапно.

    Не вижу в коде возврата переменной в выключенное состояние.
     
    CYITEP_BAC9I нравится это.
  6. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо всем огромное! вы ответили на все мои вопросы!!! дальше постараюсь сам развиваться. когда получится, обязательно поделюсь результатом, Но будет это нескоро) Но каждый день понемногу продвигаюсь к результату. Спасибо за предложения с реализацией датчиков вибрации. Сейчас буде целенаправленно прерывания изучать. Кстати очень интересная вещь аппаратное прерывание CHANGE, как раз для обработки датчиков, у которых состояние покоя может быть в непредсказуемым.

    Еще больше убедился в решении заказывать Ардуино Мега. Вроде должно хватить.

    Начну с малого, с герконов потом датчики вибрации и тензодатчки, датчики движения, RFID замок. И как вершина программирования подключение GSMмодуля. Мне это на данном этапе, кажется величайшим таинством).

    Так на практике и выясню на каком этапе Мега начнет глючить. Значит все, надо будет думать о создании сети Ардуин. (но до этого далеко). А может и хватит ее на все хотелки.

    Так же большое спасибо за помощь в решении ребуса. Все оказалось так просто, что не ожидал). Мне его и не надо выключать, после сработки реле я сам должен решить что делать. Это нужно для регулировки нагрузки подключаемой к солнечной панели. Приоритетом идет зарядка аккумулятора, если появляется избыток энергии, подключаются другие нагрузки. А это функция отключает контроллер заряда при достижении определенного значения.

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

    Вечером доберусь до игрушек, попробую на практике.

    Еще раз всем большое спасибо за помощь и консультации. Самый адекватный ресурс для новичков!!!
     
  7. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Еще раз спасибо всем за помощь Tomasina, qwone, rkit,
    За решение этого ребуса. И такое простое решение) гениально!) которое не смогли решить на другом форуме)/ Написал простенький скетч, загнал его в ардуину и работает!!! То что мне было нужно. На основе этого кода переложу на Дусю контроль за солнечными батареями.

    #define RELE 13
    #define VOLT_IN A2
    byte releState = 0;
    int voltmetr = 0;
    void setup()
    {
    pinMode(RELE, OUTPUT);
    pinMode(VOLT_IN, INPUT);
    }
    void loop()
    {
    voltmetr = analogRead(VOLT_IN);
    if(releState == 0 && voltmetr >= 900)
    {
    releState = 1;
    digitalWrite(RELE, releState);
    }
    }
    пошел учить прерывания)