Сигнализация

Тема в разделе "Arduino & Shields", создана пользователем JEKONYA, 22 ноя 2015.

  1. JEKONYA

    JEKONYA Нерд

    Захотелось реализовать простую систему сигнализации с помощью датчика движения, gsm и ардуино, но столкнулся с небольшими трудностями, а именно:
    Как избавится от "пачки смс за раз"
    хотелось бы реализовать так: уходя ставлю на сигнализацию кнопкой дается некоторое время покинуть квартиру. Приходя снимаю с охраны нажатием кнопки, датчик движения выключается. В принципе можно повесить кнопку на разрыв питания датчика движения, но как решить проблему , что если сработал датчик пришла 1 смс, а не пачка.
     
  2. Tomasina

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

    завести переменную-флаг boolean isSMSsend = false, после отправки первой СМС установить её в isSMSsend = true.
    Перед любой отправкой проверять её состояние - если равно true, то отправку сообщения не производить.
    По приходу домой, либо автоматом через час, возвращать её состояние в false.
     
  3. JEKONYA

    JEKONYA Нерд

    Пока пытаюсь на простом примере. но что-то не так датчик вообще не реагирует...

    Код (C++):
    int PIRPIN = 7;
    int PIRPINPIT = 6;
    int LDpin = 13;
    int calibrationTime = 15;
    boolean flag = false;
    void setup()
    {
      Serial.begin(9600);
      pinMode(PIRPIN, INPUT);
      pinMode(PIRPINPIT, OUTPUT);
      pinMode(LDpin,OUTPUT);
      digitalWrite(PIRPIN, LOW);
    digitalWrite(PIRPINPIT, HIGH);
      //дадим датчику время на калибровку
      Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
          Serial.print(".");
          delay(1000);
          }
        Serial.println(" done");
     
        delay(50);
     
    }

    void loop()
    {
      if (flag = false) {
      int pirVal = digitalRead(PIRPIN);

      //Если обнаружили движение
      if(pirVal == HIGH)
          {
           
           
        Serial.println("SENSOR ACTIVE");
        digitalWrite(LDpin, HIGH);
         delay(2000);
       
    }
      else
      {
          digitalWrite(LDpin,LOW);
      }flag = true;}
    }
     
  4. Tomasina

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

    а вот это зачем?
     
  5. JEKONYA

    JEKONYA Нерд

    Лишняя строчка, спасибо, но к сожалению она не играет никакой роли....
     
  6. Tomasina

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

    если отбросить все внутренние блоки, то получается:
    Код (C++):
    void loop()
    {
      if (flag = false)
      {
        ...
        flag = true;
      }
    }
    Поэтому и не работает.
     
  7. Airbus

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

    А почему приходит пачка СМС?Если бы была кнопка можно было бы грешить на дребезг контактов.Попробуйте так
    Код (C++):
    //Если обнаружили движение
      if(pirVal == HIGH)
          {
            delay(50); //немного потупим
            Serial.println("SENSOR ACTIVE");
        digitalWrite(LDpin, HIGH);
         delay(2000);
         }
     
  8. DrProg

    DrProg Вечный нерд

    Я вообще сделал задержку при сработке секунд на 10, за которые нужно успеть нажать кнопку в заданном месте. А при сработке на воришку приходит 1 смс сразу и потом раз в заданное кол-во минут. Правда у меня смс-модуль другой.
     
    ИгорьК нравится это.
  9. JEKONYA

    JEKONYA Нерд

    пачка приходит потому что: Если сработал датчик - отправить смс. и получается что если у нас воришка то датчик будет срабатывать несколько раз соответственно и смс несколько, хотелось бы: Постановка на сигнализацию секунд 20 на то, что бы уйти из дома, если воришка, то подождать немного (вдруг пришел хозяин и не успел нажать кнопку дезактивации) засечь движение отправить 1 смс и подождать несколько минут, что бы проверить снова. Я вот думаю, мб это лучше на чем то другом организовать, например на дальномере.... что-то сильно заморочено с датчиком движения.
     
  10. JEKONYA

    JEKONYA Нерд

    Доброго времени суток! Решил попробовать сделать на ультозвуковом дальномере, так даже лучше, но не могу сообразить как его снять с охраны:)) т.е ставлю на охрану кнопкой и он работает, снимать планирую рфид меткой, но как его программно остановить, что бы он не мерил расстояние, подскажите пожалуйста:)
     
  11. DrProg

    DrProg Вечный нерд

    Вопрос непонятен. Давайте кусок кода который отслеживает рфид и дальномер.
     
    ИгорьК нравится это.
  12. JEKONYA

    JEKONYA Нерд

    Да кода пока особо нет, все собрано на простом примере.
    Код (C++):
    #include "Ultrasonic.h"

    // sensor connected to:
    // Trig - 12, Echo - 13
    Ultrasonic ultrasonic(12, 13);
    int led = 11;
    void setup()
    {
      Serial.begin(9600);
    pinMode (led, OUTPUT);  // start the serial port
    }

    void loop()
    {
      int dist_cm = ultrasonic.Ranging(CM);       // get distance
      Serial.println(dist_cm);                      // print the distance
        delay(100);
    if (dist_cm < 100)
    {digitalWrite(led, HIGH);
    delay(2000);
    digitalWrite(led, LOW);// arbitary wait time.
    }}
    Задача в его отключение. Что бы я пришел домой приложил карточку и Дальномер выключился програмно, вот что мне нужно. Физически я проверял, если выключить на него питание то светодиод (он же имитирует смску) начинает постоянно моргать... если скинуть землю то он продолжает нормально мерить расстояние и срабатывает то же самое с ногами триг и эхо, по одной выдергиваю он мерит расстояние, сразу оба - светодиод моргает... Проблема именно не в выключение его карточкой, а именно отключение САМОГО модуля, надеюсь вы поняли меня:)
     
  13. JEKONYA

    JEKONYA Нерд

    Неужели никто не подскажет как это сделать?
     
  14. DrProg

    DrProg Вечный нерд

    Что мешает взять процедуру замера расстояния в if и выполнять ее либо игнорировать по условию? Сделайте флаг, который принимает true в рабочем положении и false если режим не рабочий.
     
    ИгорьК нравится это.
  15. AlexVS

    AlexVS Гик

    Объяви переменную, например boolean AlowAlarm=false.
    Далее ставишь на охрану: AlowAlarm=true.
    В коде пишешь нечто подобное:
    Код (C++):
    if (  AlowAlarm )
    {
    int dist_cm = ultrasonic.Ranging(CM);       // get distance
      Serial.println(dist_cm);                      // print the distance
        delay(100);
    if (dist_cm < 100)
    {digitalWrite(led, HIGH);
    delay(2000);
    digitalWrite(led, LOW);// arbitary wait time.
    }
    Когда снял с охраны, то AlowAlarm = false.
    Все.