Сигнализация для загородного дома.

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

  1. Samopalkin

    Samopalkin Нуб

    Здравствуйте. Такое дело: хочу собрать сигнализацию на базе arduino pro mini, и датчиках движения HC-SR501. Датчики будут стоять на карнизе, под крышей. При обнаружении движения, реле будет включать сирену на определенный промежуток времени. Для уменьшения вероятности ложных срабатываний, хочу установить задержку в несколько секунд. Например, если в течении 10 секунд, датчик перестанет фиксировать движение, сирена не включится. Но тут возникает проблема. Датчиков будет шесть штук, и хотелось бы сделать индивидуальную задержку для каждого, поэтому команда "delay" (как я понимаю) не подойдет. А с "milis" я не разобрался, и можно ли ее использовать в данной ситуации, не знаю. Подскажите, возможно ли это реализовать, и в каком направлении копать.
     
  2. ANV

    ANV Гуру

    Копать в направлении разбирательства с mills :)
     
  3. Arduiner001

    Arduiner001 Гик

    Разрешите придраться: не milis, а millis :).
    Вообще,
    Код (C++):
    millis()
    получает количество миллисекунд (1/1000 секунды) от запуска Arduino, а
    Код (C++):
    micros()
    - микросекунды. Всё предельно просто :).
    Вот вам альтернативная функция delay:
    Код (C++):
    void delayN(long ms){
      long sM = millis();
      while(millis() - sM < ms);
    }
    Всё предельно просто ;).
    А вообще датчику HC-SR501 нужен 5-секундный отдых :eek:.
     
    Последнее редактирование: 22 апр 2016
  4. ostrov

    ostrov Гуру

    Чем, по вашему, это:
    Код (C++):
    void delayN(long ms){
      long sM = millis();
      while(millis() - sM < ms);
    }
    отличается от обычного delay()?
     
  5. Arduiner001

    Arduiner001 Гик

    Тем, что millis() - это таймер. Если мы используем delay(), то он заморозит Arduino. Прямо вот заморозит. Даже всякие библиотеки мультитаскинга не будут работать. А здесь используется таймер - он НЕ тормозит работу Arduino.
     
  6. ostrov

    ostrov Гуру

    Сдается мне, вы не понимаете ни в millis() ни в delay().
     
  7. Samopalkin

    Samopalkin Нуб

    Нет проблем:) У меня девушка - филолог, так что мне не привыкать:)
    Ну я пытался понять это по примерам, но как-то не уловил причинно-следственной связи. Ну не программист я:)
    Вроде начинает доходить:)
    Ну насколько я заметил опытным путем, ему и трех хватает.
     
  8. ИгорьК

    ИгорьК Гуру

    Пример, который приведён здесь, ошибочен, как справедливо указал тов. ostrov .
    Логика работы с Millis заключается в том, что Вы запоминаете начальное значение времени, периодически проверяете его и если необходимое время наступило - выполняете необходимое действие. Инструкция while превратила этот кусок кода в тот же delay. Для Вашего вопроса эта инструкция запрещена.
     
  9. yden

    yden Гик

    Забудьте идею с датчиками движения на карнизе. Задолбает ложными срабатываниями. В итоге выключите все.
     
  10. Samopalkin

    Samopalkin Нуб

    Жаль, в этом примере я хоть более-менее понял, как работает millis. В других, что я просматривал, как-то не уловил сути.
    Ну как я понимаю, ложные срабатывания кратковременны. Для этого и хочу сделать задержку в 10 секунд. Да и устанавливать датчики буду так, чтобы линзы были утоплены и смотрели вниз, вдоль стен. Солнечный свет на них попадать не будет, и зона обзора довольно узкая, метра три от дома.
     
  11. ИгорьК

    ИгорьК Гуру

    Millis работает чрезвычайно просто: на вопрос сколько времени он выдаёт ответ в миллисекундах. Если спросить его ещё раз - ответ будет на некоторое количество мс больше.
    Если прошло необходимое время - что-то делаем. В промежутках между вопросами занимаемся своими делами.
    Не надо смотреть пример - поймите логику. Представьте что Вы пилите дрова и поглядываете на часы.
    Ложные срабатывания от нормальных ничем не отличаются. И те и те выдают импульс единицу в течение одного времени .
    Вот в чем ваша идея нехорошая, так тем, что датчики будут на длинных проводах и кроме ложных срабатываний там будут наводки. Железно будут. И отличить эти наводки от сигналов датчиков практически не возможно.
     
  12. Samopalkin

    Samopalkin Нуб

    Ну так, вроде более понятно :)

    Ну если превести датчик в режим high, он при срабатывании выдаст импульс продолжительностью примерно пять секунд (если не будет движения). Поэтому я и хочу сделать, чтобы сигнализация срабатывала только при продолжительности импульса около 10 секунд, то есть, при наличии движения все это время.
    Ну этот нюанс я продумал, и вроде нашел решение. Сигнальный провод притягиваем к минусу через резистор, а на датчик устанавливаем дополнительный транзистор, для усиления сигнала (сам датчик не осиливает резистор, проверил). По идее , это должно нивелировать наводки.
     
  13. ИгорьК

    ИгорьК Гуру

    Обычно все делается наоборот. Сигнальный провод притянут к плюсу, и лишь правильная информация стягивает его в ноль.
    Кстати, почему этот датчик действует по-иному - до сих пор ума не приложу.
     
  14. Samopalkin

    Samopalkin Нуб

    Ну можно и так сделать, транзистору в принципе все равно:)
     
  15. ИгорьК

    ИгорьК Гуру

    Нужно.
     
  16. Vladis_a

    Vladis_a Гик

    А какова максимальная длина провода для датчиков для их стабильной работы?
     
  17. ИгорьК

    ИгорьК Гуру

    Это завист от ситуации. На моей практике уже от 3 м. начинаются помехи. Но это всегда индивидуально.
     
  18. Samopalkin

    Samopalkin Нуб

    Блин, ну никак не могу понять, как использовать "millis" , в моем случае. Просмотрел кучу примеров, но так и не понял:) С "delay" все прекрасно работает, хоть и примитивно:
    Код (C++):
    int PirSensor = 12;
    int Relay = 10;
    void setup() {
      pinMode (PirSensor, INPUT);
      pinMode (Relay, OUTPUT);
      pinMode (13, OUTPUT);
      digitalWrite(13, LOW);
    }

    void loop() {
      if (digitalRead(PirSensor) == HIGH)
      { digitalWrite(13, HIGH); //для индикации срабатывания датчика
        delay(10000);
        digitalWrite(Relay, LOW);
      } else {
        digitalWrite(Relay, HIGH);
        digitalWrite(13, LOW);
      }
    }
    А вот как там использовать "millis", хоть убейте не понимаю :)
     
  19. ostrov

    ostrov Гуру

    В вашем случае оставьте как есть. Если программа больше ничего не делает, то можно пользоваться delay() и не париться. Использовать millis() требуется в том случае, если активных процессов несколько.
     
  20. Samopalkin

    Samopalkin Нуб

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