Go Down

### Topic: Using Ultrasonic Range Finder SRF02 as Motion Detector (Read 6046 times)previous topic - next topic

#### xaral

##### May 14, 2012, 11:47 pmLast Edit: May 14, 2012, 11:57 pm by xaral Reason: 1
Hey guys!!!!

I am doing a project concerning motion detection...
For that I am using 2 Pir sensors and one US sensor. Thus with the PIR sensor, after having some problems, now it's ok.

Although to reach the goal with US, i need to get a code that allow me to see when the difference of distances, mean that somebody crossed the sensor.

I was thinking that the right way should be create an oldvalue and a value, and if( oldvalue-value>20) reports that movement was detected.

I am receiving on Processing the data on the following format [PIR1,PIR2,US]

Probably i need to use something as an array, but I am not good at this point yet, so if somebody could help me I would appreciate  XD XD

Cheers Arduiner's
I don't know

#### TeslaIaint

#1
##### May 15, 2012, 10:51 pmLast Edit: May 17, 2012, 05:00 pm by TeslaIaint Reason: 1
You didn't say exactly why or how you are using two PIR sensors. That makes a lot of difference how you use your Boolean operators (among other things). Are they oriented the same direction?
The two if statements are nested in this case so that both must be true in order to execute your commands, but I'm only guessing at your set up.
If you're more specific with your questions, you'll get more specific and relevant help.

Code: [Select]
`void loop(){  distCalc();  //  call your distance calculation function for your distance sensor here  if ((digitalRead(PIR1) == HIGH) || (digitalRead(PIR2) == HIGH)) {   // if one PIR sensor OR the other detects movement    if (inches <=36 && inches>=12) {                                              // AND if your distance is between two given values      //do something here;    }  }}void calc();{}`

#### xaral

#2
##### May 15, 2012, 11:30 pmLast Edit: May 15, 2012, 11:38 pm by xaral Reason: 1
Hi Tesla!! Thanks again for your answer. You are right, but sometimes is difficult for me to explain everything... I'm using all this sensors to get a better result of motion inside a room... So each sensor will be oriented for a different direction.
If one of this sensors detects motion (PIR) or distance variation (US), it should report me 0. When it detects it should report the value 0 for some seconds.
In other hand when it not detect any movement it returns 1.

The better way is present my entire code (still have a lot of mistakes   )

Code: [Select]
`#include <Wire.h>const int PIR1 = 2;const int PIR2 = 3;const int LED1 = 4;const int LED2 = 5;//Definition of variables to useint val1 = 0;int val2 = 0;int count1 = 0;int count2 = 0;int calibrationTime = 20;  //calibration time of PIR sensorsvoid setup(){  Wire.begin();          // start the I2C bus  Serial.begin(9600);    // open the serial port:    //Definition of input/output values  pinMode(PIR1,INPUT);  pinMode(PIR2,INPUT);  pinMode(LED1,OUTPUT);  pinMode(LED2,OUTPUT);    //give the sensor some time to calibrate  Serial.println("Sensor Calibration in Progress");  Serial.println("------------------------------");    for(int i = 0; i < calibrationTime; i++){    Serial.print(".");    digitalWrite(LED1, HIGH);    delay(250);    digitalWrite(LED2, HIGH);    delay(250);    digitalWrite(LED1, LOW);    delay(250);    digitalWrite(LED2, LOW);    delay(250);  }  Serial.println("");  Serial.println("Sensor Calibration Completed");  Serial.println("Sensor Reading Active");  delay(100);}int reading = 0;int oldreading = 0;void loop(){passiveIR();ultrasonic();presence();}void passiveIR(){  int val1 = digitalRead(PIR1);  int val2 = digitalRead(PIR2);}void ultrasonic(){  // step 1: instruct sensor to read centimeters  Wire.beginTransmission(112); // transmit to device #112 (0x70)                               // the address specified in the datasheet is 224 (0xE0)                               // but i2c adressing uses the high 7 bits so it's 112  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)    Wire.write(byte(0x51));      // command sensor to measure in "inches" (0x50)                               // use 0x51 for centimeters                               // use 0x52 for ping microseconds  Wire.endTransmission();      // stop transmitting  // step 2: wait for readings to happen  delay(70);                   // datasheet suggests at least 65 milliseconds  // step 3: instruct sensor to return a particular echo reading  Wire.beginTransmission(112); // transmit to device #112  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)  Wire.endTransmission();      // stop transmitting  // step 4: request reading from sensor  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112  // step 5: receive reading from sensor  if(2 <= Wire.available())    // if two bytes were received  {    oldreading = reading;    //Serial.print(oldreading);       // Serial.print(',');    reading = Wire.read();    // receive high byte (overwrites previous reading)    reading = reading << 8;   // shift high byte to be high 8 bits    reading |= Wire.read();   // receive low byte as lower 8 bits    //Serial.println(reading);    // print the reading   // Serial.print(',');  }  delay(250);                 // wait before next reading:}void presence(){  int f = reading - oldreading;    if(val1 == HIGH || val2 == HIGH || f >15){    Serial.print('0');    Serial.print(',');  }      if(val1 == LOW || val2 == LOW || f < 15){    Serial.print('1');    Serial.print(',');     for(int i=0; i<50; i++){   }    }}    `

I hope you can reach my goal, if can try  to explain better.

Obrigado

#### AWOL

#3
##### May 15, 2012, 11:35 pm
The first line of that sketch starts a comment, but where does it end?
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

#### xaral

#4
##### May 15, 2012, 11:39 pm
stupid mistake from myself...
hope now it's fine

#### liudr

#5
##### May 16, 2012, 12:01 am
Code: [Select]
` delay(250);                 // wait before next reading:`

This line in your sonic ranger code could make fast object slip by without detection though. If your sonic ranger beam covers say 30 cm width at the point where objects pass, you just have to move at 30cm/0.25s or 1.2m/s at the right timing (Murphy said it will happen) to slip pass the sensor without detection. I can walk or skip faster than that. Is that very necessary or can you reduce it to 25ms?
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

#### xaral

#6
##### May 16, 2012, 12:11 am
I think you are right. I wrote 250 cause was the delay suggest in Arduino playgroung for this sensor. I will change it and see what happen...

I already updated the code but I'm still having problems

Code: [Select]
`#include <Wire.h>//definition of pin on Arduino boardconst int PIR1 = 2;const int PIR2 = 3;const int LED1 = 4;const int LED2 = 5;//Definition of variables to useint val1 = 0;int val2 = 0;int count1 = 0;int count2 = 0;int calibrationTime = 20;  //calibration time of PIR sensorsvoid setup(){  Wire.begin();          // start the I2C bus  Serial.begin(9600);    // open the serial port:    //Definition of input/output values  pinMode(PIR1,INPUT);  pinMode(PIR2,INPUT);  pinMode(LED1,OUTPUT);  pinMode(LED2,OUTPUT);    //give the sensor some time to calibrate  Serial.println("Sensor Calibration in Progress");  Serial.println("------------------------------");    for(int i = 0; i < calibrationTime; i++){    Serial.print(".");    digitalWrite(LED1, HIGH);    delay(250);    digitalWrite(LED2, HIGH);    delay(250);    digitalWrite(LED1, LOW);    delay(250);    digitalWrite(LED2, LOW);    delay(250);  }  Serial.println("");  Serial.println("Sensor Calibration Completed");  Serial.println("Sensor Reading Active");  delay(100);}int reading = 0;int oldreading = 0;void loop(){passiveIR();ultrasonic();presence();}void passiveIR(){  int val1 = digitalRead(PIR1);  int val2 = digitalRead(PIR2);  Serial.print(val1);  Serial.print(',');  Serial.print(val2);  Serial.print(',');  }void ultrasonic(){  // step 1: instruct sensor to read centimeters  Wire.beginTransmission(112); // transmit to device #112 (0x70)                               // the address specified in the datasheet is 224 (0xE0)                               // but i2c adressing uses the high 7 bits so it's 112  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)    Wire.write(byte(0x51));      // command sensor to measure in "inches" (0x50)                                // use 0x51 for centimeters                               // use 0x52 for ping microseconds  Wire.endTransmission();      // stop transmitting  // step 2: wait for readings to happen  delay(70);                   // datasheet suggests at least 65 milliseconds  // step 3: instruct sensor to return a particular echo reading  Wire.beginTransmission(112); // transmit to device #112  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)  Wire.endTransmission();      // stop transmitting  // step 4: request reading from sensor  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112  // step 5: receive reading from sensor  if(2 <= Wire.available())    // if two bytes were received  {    oldreading = reading;    //Serial.print(oldreading);       // Serial.print(',');    reading = Wire.read();    // receive high byte (overwrites previous reading)    reading = reading << 8;   // shift high byte to be high 8 bits    reading |= Wire.read();   // receive low byte as lower 8 bits      }  delay(25);                 // wait before next reading:}void presence(){  Serial.print(reading);    // print the reading  Serial.print(',');  Serial.print(oldreading);    // print the reading  Serial.print(',');  int f = reading - oldreading;  Serial.print(f);    // print the reading  Serial.print(',');     if(val1 == HIGH && val2 == HIGH && f < 15){    Serial.println('1');    //Serial.print(',');  }  if(val1 == LOW || val2 == LOW || f >15){    Serial.println('0');    //Serial.print(',');  }    for(int i=0; i<50; i++){  }   }`

I forgot to tell that initially I was thinking to do the treatment of each sensor on processing sketch, but concerning that I will use the final value in a graph and in an interface, I thought that it is better if the value is simplified...

#### liudr

#7
##### May 16, 2012, 12:19 am
And the problem your are having is ...
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

#### xaral

#8
##### May 16, 2012, 12:29 amLast Edit: May 16, 2012, 12:30 am by xaral Reason: 1
Sorry. Seems that I'm almost sleeping
Although I think the next code is right

Code: [Select]
` if(val1 == HIGH && val2 == HIGH && f < 15){    Serial.println('1');    //Serial.print(',');  }  if(val1 == LOW || val2 == LOW || f >15){    Serial.println('0');    //Serial.print(',');`

the first condition if(val1 == HIGH && val2 == HIGH && f < 15) isn't being detected. Arduino is just printing 0s

I will get crazy at the end of this... seems simple but there's always a little problem

#### liudr

#9
##### May 16, 2012, 01:28 am
What do you get from these when you have no obstacles and when you do?

Code: [Select]
`  Serial.print(reading);    // print the reading  Serial.print(',');  Serial.print(oldreading);    // print the reading  Serial.print(',');  int f = reading - oldreading;  Serial.print(f);    // print the reading  Serial.print(','); `

I assume if you don't have obstacles then you get zero? Or do you have a back drop that reflects the sound back so there is a fixed distance without obstacles?
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

#### xaral

#10
##### May 16, 2012, 02:05 am
No comments for all my mistakes on code...
The problem was just linked with a wrong position of variable declaration...
Now I hope I can use this on Processing
Great thanks for your support

Code: [Select]
`#include <Wire.h>//definition of pin on Arduino boardconst int PIR1 = 2;const int PIR2 = 3;const int LED1 = 4;const int LED2 = 5;const int pinPot=A0;//Definition of variables to useint val1 = 0;             //PIR1 valueint val2 = 0;             //PIR2 valueint reading = 0;          //US valueint oldreading = 0;       //oldUS valueint count = 0;            //counter to keep LED turned on int calibrationTime = 5;  //calibration time of PIR sensorsvoid setup(){  Wire.begin();          // start the I2C bus  Serial.begin(9600);    // open the serial port:    //Definition of input/output values  pinMode(PIR1,INPUT);  pinMode(PIR2,INPUT);  pinMode(LED1,OUTPUT);  pinMode(LED2,OUTPUT);    //give the sensor some time to calibrate  Serial.println("Sensor Calibration in Progress");  Serial.println("------------------------------");    for(int i = 0; i < calibrationTime; i++){    Serial.print(".");    digitalWrite(LED1, HIGH);    delay(250);    digitalWrite(LED2, HIGH);    delay(250);    digitalWrite(LED1, LOW);    delay(250);    digitalWrite(LED2, LOW);    delay(250);  }  Serial.println("");  Serial.println("Sensor Calibration Completed");  Serial.println("Sensor Reading Active");  delay(100);}void loop(){passiveIR();ultrasonic();presence();}void passiveIR(){  val1 = digitalRead(PIR1);  val2 = digitalRead(PIR2);  }void ultrasonic(){  // step 1: instruct sensor to read centimeters  Wire.beginTransmission(112); // transmit to device #112 (0x70)                               // the address specified in the datasheet is 224 (0xE0)                               // but i2c adressing uses the high 7 bits so it's 112  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)    Wire.write(byte(0x51));      // command sensor to measure in "inches" (0x50)                                // use 0x51 for centimeters                               // use 0x52 for ping microseconds  Wire.endTransmission();      // stop transmitting  // step 2: wait for readings to happen  delay(70);                   // datasheet suggests at least 65 milliseconds  // step 3: instruct sensor to return a particular echo reading  Wire.beginTransmission(112); // transmit to device #112  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)  Wire.endTransmission();      // stop transmitting  // step 4: request reading from sensor  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112  // step 5: receive reading from sensor  if(2 <= Wire.available())    // if two bytes were received  {    oldreading = reading;    reading = Wire.read();    // receive high byte (overwrites previous reading)    reading = reading << 8;   // shift high byte to be high 8 bits    reading |= Wire.read();   // receive low byte as lower 8 bits  }  delay(25);                 // wait before next reading:}void presence(){  int f = reading - oldreading;     if((val1 == HIGH) && (val2 == HIGH) && (f < 15)){    Serial.print('1');    Serial.print(';');  }  if((val1 == LOW) || (val2 == LOW) || f >15){    Serial.print('0');    Serial.print(';');    count = 1;        if(count > 0){    count=count+1;    digitalWrite(LED1, HIGH);    }        if(count == 50){      digitalWrite(LED1, LOW);    count = 0;     }  } }`

#### Mary_Jasmine

#11
##### Oct 11, 2012, 09:26 am
Hello! I want to ask about coding on how to combine piezo code with sensor SRF02 code to arduino UNO? I hope you will help me to solve my problems  =( thank you for any responds. I appreciate it so much :')

#### AWOL

#12
##### Oct 11, 2012, 10:04 am
Quote
I hope you will help me to solve my problems

Well, maybe, when you tell us what your problems are.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

#### delirii

#13
##### Oct 12, 2012, 01:37 pm
@xaral : I'm working on a rather similar solution (motion detection). I've tried both sensors: PIR and US. I've made different tests and finally dropped the US for this use case. It is not the right sensor for your job and let me explain at least one of the reason, which in my case was the main.

The US sensor and the PIR sensor have really distinct detection area. You will end up with having one sensor detecting a motion and the other not, and vice versa. In my particular case, I had to be in a really narrow area to be able to detect a motion with the US sensor whereas the PIR sensor was detecting the motion...

If you want an advice, forget your US sensor for any motion detection solution and focus only on PIR sensor(s). To avoid false positive, keep your two sensors, choose a position where their detection areas cross each other and only trigger an action if BOTH detects a motion.

Good luck.

Go Up

Please enter a valid email to subscribe

### Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy