Go Down

### Topic: sensor data question (Read 3197 times)previous topic - next topic

#### danieljay

##### Mar 30, 2012, 01:00 am
so i'll explain what I'm doing first. using a ping sensor to change LED's. simple. but what i was wondering if their is a way to detect when a  sensor stays at a particular number for "x" amount of time, to do something else. i know i can use another sensor, but thats a last resort.

#### PaulS

#1
##### Mar 30, 2012, 01:04 am
Quote
but what i was wondering if their is a way to detect when a  sensor stays at a particular number for "x" amount of time, to do something else.

[snarky comment free]
Use millis() to get the time every time the sensor output is different from what it was last time. Then, on each pass through loop, look at now vs. then, and decide what to do.
[/snarky comment free]
The art of getting good answers lies in asking good questions.

#### danieljay

#2
##### Mar 30, 2012, 01:24 am
hahaha! glad you didn't use the snark library. thanks a bunch man. cheers

#### danieljay

#3
##### Mar 30, 2012, 01:30 am
Quote
Then, on each pass through loop, look at now vs. then, and decide what to do.

how do i look at now vs then? a bit of clarification please.

#### PaulS

#4
##### Mar 30, 2012, 01:37 am
Quote
how do i look at now vs then? a bit of clarification please.

Something vaguely like this:
Code: [Select]
`unsigned long now;unsigned long then = 0;int prevSensorValue = 0;const int somePin = ?;int bigChange = ?;unsigned long longTime = ?;void loop(){   int currSensorValue = analogRead(somePin);   if((abs(currSensorValue - prevSensorValue) > bigChange)   {      // a change occurred      then = millis();      // Do something with the sensor data   }  now = millis();  if(now - then > longTime)  {     // It's been a while since a change occurred  }}`
The art of getting good answers lies in asking good questions.

#### danieljay

#5
##### Mar 30, 2012, 01:56 am
i might be adding incorrect values, but heres what  i implemented, without any results:

Code: [Select]
`unsigned long now;unsigned long then = 0;int prevSensorValue = 5;const int pingPin = 7;int bigChange = 5;unsigned long longTime = 5;int currSensorValue = analogRead(pingPin);   if((abs(currSensorValue - prevSensorValue)) > bigChange)   {      // a change occurred      then = millis();     digitalWrite(led13, HIGH); // Do something with the sensor data   }  now = millis();  if(now - then > longTime)  {    digitalWrite(led13, LOW); // It's been a while since a change occurred  }  int values = cm;  //forwrd fade  outputValue1 = map(values, 25, 40, 0, 255);  outputValue2 = map(values, 40, 25, 0, 255);  outputValue3 = map(values, 3, 24, 0, 255);  outputValue4= map(values, 24, 3, 0, 255);  // change the analog out value:  //analogWrite(led1, outputValue1);  //  analogWrite(ledsignal, outputValue2);  if(values >= 25 ){    analogWrite(led1, outputValue1);    analogWrite(ledsignal, outputValue2);    digitalWrite(led2, LOW);  }  if(values >= 3 && values <= 24)  {    analogWrite(led2, outputValue4);    analogWrite(ledsignal, outputValue3);digitalWrite(led1, LOW);  }}`

thanks so much for your help.

#### PaulS

#6
##### Mar 30, 2012, 06:59 am
Quote
i might be adding incorrect values, but heres what  i implemented, without any results:

Some Serial.print()s would be useful.

Time is in milliseconds, so all you are looking for is a 5 millisecond stable reading from the ping sensor. Is that what you expected?

If it really is a ping sensor, I don't think that's the proper way to read one.
The art of getting good answers lies in asking good questions.

#### danieljay

#7
##### Mar 30, 2012, 03:15 pm
well i have other conversions later in the code. I've been basically triggering my code with the values in "cm". should i replace the analog read up top with an int for cm? ask if full code needed. still a bit unclear if the way I'm using your example is conceptually correct.

#### PaulS

#8
##### Mar 30, 2012, 04:22 pm
Quote
still a bit unclear if the way I'm using your example is conceptually correct.

It is. The issues may be in how you are reading the sensor - the ping example does not use analogRead - or with the delta in readings that is the filter for sameness or with the length of time that is considered stable (5 milliseconds is very short).

As I mentioned, some Serial.print() statements would be needed to determine whether the way you are reading the sensor results in values that have a good correlation to distance, and to see how far apart , in time and value, the different readings are.
The art of getting good answers lies in asking good questions.

#### danieljay

#9
##### Mar 30, 2012, 04:57 pm
OH thats right. stupid mistake forgetting the input was digital. regardless I'm still thrown off by what i should grab from the ping sensor for your script to compare to.

Quote
unsigned long now;
unsigned long then = 0;
int prevSensorValue = 5;
const int pingPin = 7;
int bigChange = 5;
unsigned long longTime = 5;

also what is prevSensorValue doing? is it comparing if the difference is in time?

it looks like its being used here to compare the data from the analog sensor instead of time? i may be incorrect

#### PaulS

#10
##### Mar 30, 2012, 09:23 pm
What you want to compare is the reading you get on this pass through loop with that you got on the last pass, however you actually get data from the sensor.

The initial value for "the last time" should be something that is clearly distinct from any valid value, so that the reading on the first pass through loop IS known to be different.
The art of getting good answers lies in asking good questions.

#### danieljay

#11
##### Mar 30, 2012, 11:59 pm
no luck. I'm sorry, i am a very slow learner. I've set prevSensorValue to read analog values which i understand in your code isn that if prevSensorValue is different from currsensorValue (both are equal to analog ping pin), and the difference is greater then 5, (> bigChange which i set to 5), then, then= millis(). and below that statement, digitalWrite(led13, HIGH); and inverse for below. nothing aside from declaring then to equal millis and send a led high signal are my understand of what goes on there. hope I'm on the right track at least. I'm not having good results.

Code: [Select]
`   prevSensorValue = analogRead(pingPin);int currSensorValue = analogRead(pingPin);   if((abs(currSensorValue - prevSensorValue)) > bigChange)   {      // a change occurred      then = millis();     digitalWrite(led13, HIGH);     // Do something with the sensor data   }  now = millis();  if(now - then > longTime)  {    digitalWrite(led13, LOW); // It's been a while since a change occurred  }`

#### PaulS

#12
##### Mar 31, 2012, 12:56 am
Code: [Select]
`  prevSensorValue = analogRead(pingPin);int currSensorValue = analogRead(pingPin);   if((abs(currSensorValue - prevSensorValue)) > bigChange)`
No! currSensorValue is for this pass through loop. prevSensorValue is from last time, NOT this time.

Code: [Select]
`   int currSensorValue = analogRead(pingPin);   if((abs(currSensorValue - prevSensorValue)) > bigChange)   {      // a change occurred      then = millis();     digitalWrite(led13, HIGH);     // Do something with the sensor data   }   prevSensorValue = currSensorValue;`
The art of getting good answers lies in asking good questions.

#### danieljay

#13
##### Mar 31, 2012, 01:17 am
i dont understand why this isn't working. you'll probably find my errors a lot quicker

Code: [Select]
`/* Ping))) Sensor This sketch reads a PING))) ultrasonic rangefinder and returns the distance to the closest object in range. To do this, it sends a pulse to the sensor to initiate a reading, then listens for a pulse to return.  The length of the returning pulse is proportional to the distance of the object from the sensor. The circuit: * +V connection of the PING))) attached to +5V * GND connection of the PING))) attached to ground * SIG connection of the PING))) attached to digital pin 7 http://www.arduino.cc/en/Tutorial/Ping created 3 Nov 2008 by David A. Mellis modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. */// this constant won't change.  It's the pin number// of the sensor's output:int redPin = 9;int bluePin = 10;int greenPin = 11;int led13 = 13;int redVal;int greenVal;int blueVal;///////unsigned long now;unsigned long then = 0;int prevSensorValue = 0;const int pingPin = 7;int bigChange = 10;unsigned long longTime = 10;///////////int val1;int val2;void setup() {  // initialize serial communication:  Serial.begin(9600); pinMode(led13, OUTPUT);}void loop(){  // establish variables for duration of the ping,   // and the distance result in inches and centimeters:  long duration, inches, cm;  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:  pinMode(pingPin, OUTPUT);  digitalWrite(pingPin, LOW);  delayMicroseconds(2);  digitalWrite(pingPin, HIGH);  delayMicroseconds(5);  digitalWrite(pingPin, LOW);  // The same pin is used to read the signal from the PING))): a HIGH  // pulse whose duration is the time (in microseconds) from the sending  // of the ping to the reception of its echo off of an object.  pinMode(pingPin, INPUT);  duration = pulseIn(pingPin, HIGH);  // convert the time into a distance  inches = microsecondsToInches(duration);  cm = microsecondsToCentimeters(duration);  Serial.print(inches);  Serial.print("in, ");  Serial.print(cm);  Serial.print("cm");  Serial.println();  delay(100);   int values = cm;  //forwrd fade  int currSensorValue = analogRead(pingPin);   if((abs(currSensorValue - prevSensorValue)) > bigChange)   {      // a change occurred      then = millis();     digitalWrite(led13, HIGH);     // Do something with the sensor data  }     prevSensorValue = currSensorValue;  now = millis();  if(now - then > longTime)  {         digitalWrite(led13, LOW);     // It's been a while since a change occurred     }  // change the analog out value:  redVal = digitalRead(pingPin);  greenVal = digitalRead(pingPin); //makes all the mapped functions equal to sensor readings !!!!!!!!!!   val1 = digitalRead(pingPin);  val2 = digitalRead(pingPin);  //     redVal = map(values, 25, 40, 0, 255);  greenVal = map(values, 40, 25, 0, 255);     val1 = map(values, 3, 24, 0, 255); val2= map(values, 24, 3, 0, 255);//  blueVal= map(values, 40, 25, 0, 255);    //analogWrite(led1, outputValue1);  //  analogWrite(ledsignal, outputValue2);int pwmMax = 255;  if(values >= 25 ){   analogWrite(redPin, HIGH);    analogWrite(greenPin,redVal);    analogWrite(bluePin, redVal);      } if(values >= 3 && values <= 24)  {    analogWrite(redPin, val2);    analogWrite(greenPin, val2);analogWrite(bluePin, HIGH);   } }long microsecondsToInches(long microseconds){  // According to Parallax's datasheet for the PING))), there are  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per  // second).  This gives the distance travelled by the ping, outbound  // and return, so we divide by 2 to get the distance of the obstacle.  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf  return microseconds / 74 / 2;}long microsecondsToCentimeters(long microseconds){  // The speed of sound is 340 m/s or 29 microseconds per centimeter.  // The ping travels out and back, so to find the distance of the  // object we take half of the distance travelled.  return microseconds / 29 / 2;}`

#### PaulS

#14
##### Mar 31, 2012, 01:47 am
Code: [Select]
`const int pingPin = 7;  int currSensorValue = analogRead(pingPin);`
If you are using a UNO or Duemilanove, you don't have 7 analog pins. You probably don't have the sensor attached to an analog pin, anyway.
The art of getting good answers lies in asking good questions.

Go Up