sensor data question

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.

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]

hahaha! glad you didn't use the snark library. thanks a bunch man. cheers

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.

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

Something vaguely like this:

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
  }
}

i might be adding incorrect values, but heres what i implemented, without any results:

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.

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.

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.

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.

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.

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

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.

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.

  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
  }
  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.

   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;

i dont understand why this isn't working. you'll probably find my errors a lot quicker

/* 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;

}
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.