Помогите разобраться с PIR HC-SR501

Dima85
Offline
Зарегистрирован: 07.01.2013
Возможно кто-то работал с PIR HC-SR501, поделитесь пожалуйста опытом.
Он имеет 2 регулятора, почему два, что регулируется одним и вторым
http://www.jamesrobertson.eu/pages/2013/feb/10/pir-sensor-hc-sr501-on-eb...
Использую такой код, он нормально работает, но я так же не могу понять по какому принципу он посылает комманду ended.

Спасибо.





/*
 * PIR sensor tester
 */
 

int inputPin = 3;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status
 
void setup() {

  pinMode(inputPin, INPUT);     // declare sensor as input
 
  Serial.begin(9600);
}
 
void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val == HIGH) {            // check if the input is HIGH
    if (pirState == LOW) {
      // we have just turned on
      Serial.println("Motion detected!");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  } else {
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }
}

 

Dima85
Offline
Зарегистрирован: 07.01.2013

К сожалению не могу подкорректировать тему (нет кнопки изменить).

Snubist
Offline
Зарегистрирован: 18.02.2013

Ended пылается тогда когда (val == LOW), это описано в функции if (val == HIGH) в части Else (иначе)

Dima85
Offline
Зарегистрирован: 07.01.2013

Сам код я понимаю. я не понимаю по какому принципу он выключается. Тоесть из за чего val может стать HIGH, т.к. он не сразу становится HIGH после того как человек закончил двигатся, он выключается через секунд 40-60.

Появился еще 1 вопрос, может выше предложенный код поместить в что-то подобное, это обгелчит работу Arduin-е или ей безразницы?

if(millis()-lastPingTime>200){ // наша замена delay(200) 200 милесекунд.

lastPingTime=millis(); // запомнили когда мы последний раз датчик проверяли
}

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Dima85 пишет:

Сам код я понимаю. я не понимаю по какому принципу он выключается. Тоесть из за чего val может стать HIGH, т.к. он не сразу становится HIGH после того как человек закончил двигатся, он выключается через секунд 40-60.

Там есть резистор помоему правый, он регулирует задержку.

Dima85 пишет:
Появился еще 1 вопрос, может выше предложенный код поместить в что-то подобное, это обгелчит работу Arduin-е или ей безразницы?

if(millis()-lastPingTime>200){ // наша замена delay(200) 200 милесекунд.

lastPingTime=millis(); // запомнили когда мы последний раз датчик проверяли
}

 

Без разницы.

Dima85
Offline
Зарегистрирован: 07.01.2013

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

Но вот насчет второго предложенного кода. Но ведь если вставить такую задерку данные будут собираться чуть реже и это должно отразится на нагрузке Arduino. Почему я не прав?

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Dima85 пишет:

Но вот насчет второго предложенного кода. Но ведь если вставить такую задерку данные будут собираться чуть реже и это должно отразится на нагрузке Arduino. Почему я не прав?

Программа выполнятся не перестанет, не будут считываться и передоваться данные но цикл будет идти. Это как насколько уменьшится нагрузка на ходовую камаза, если возить один мешок картошки не постоянно, а только каждые 4 рейса? Если смысл? кроме затрат памяти?

Dima85
Offline
Зарегистрирован: 07.01.2013

А есть какие-то комманды которые позволяют посмотреть сколько используется Ram и Mhz?

step962
Offline
Зарегистрирован: 23.05.2011

Нет. Но объем свободной оперативной памяти можно получить окольными вычислениями типа этих, а частота сидит в макроопределении F_CPU.