Can someone help me with the ping sensor

Im trying to make the ping sensor trigger the pin 13 led at a certain distance. Should I add on to the code that they have or start from scratch. The site shows this one for monitoring the distance

 /* 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 Jun 2009
    by Tom Igoe

  */

 // this constant won't change.  It's the pin number
 // of the sensor's output:
 const int pingPin = 7;

 void setup() {
   // initialize serial communication:
   Serial.begin(9600);
 }

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

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

Im just not sure what the right approach would be should I add a analog or serial read and than if command to this or should I start from scratch?

What you need to do is to check the current distance, compare it to a threshold, and take actions.

[UNTESTED CODE]

const int THRESHOLD = 20; //change this to suit your needs
const byte pingPin = 7;

void setup(){
  pinMode(13,OUTPUT);
}

void loop(){
  //FROM EXAMPLE
  long duration=0;
  int cm=0;
  // 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);

  cm = microsecondsToCentimeters(duration);
  //END EXAMPLE

  //is the number of centimeters above or equal to the threshold?
  if (cm >= THRESHOLD){
    digitalWrite(13,HIGH);
  }else{
    digitalWrite(13,LOW);
  }  
}

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

BTW, see this: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1247846222/5 :slight_smile:

done and done thanks and sorry

worked great thanks, it seems that the led will blink every pulse of the ping sensor. Is there anyway to ignore that?

would I be able to use a pot to change the threshold value?

Yes. The basic concept is to connect the potentiometer to one of the analog pins. Read the drop in voltage and use the ratio of Vd/5V to calculate the threshold.

Btw, I bought myself one of these sensors today and wrote a small C library for it. The code will compile fine as c99.

/*
 * PING.h
 *
 *  Created on: Jul 22, 2009
 *      Author: Orlando Arias
 *     License: GPLv3
 *
 *  Simple library to control a Parallax PING))) sensor.
 */

#ifndef PING_H_
#define PING_H_

typedef int PING;
typedef unsigned long ulong;

ulong getDistance(PING *p);
ulong getDistanceT(PING *p, ulong timeout);

#endif /* PING_H_ */
/*
 * PING.c
 *
 *  Created on: Jul 22, 2009
 *      Author: Orlando Arias
 *     License: GPLv3
 *
 *  Simple library to control a Parallax PING))) sensor.
 */

#include "PING.h"
#include "WProgram.h"

void doWave(PING *p);

/*
 * Returns the distance in centimeters (cm).
 */
ulong getDistance(PING *p){
      return getDistanceT(p, 1000000);
}

/* 
 * It is sad that C does not do function overloading.
 * Using GNU extensions it is possible, but then it is no longer
 * standard C.
 */
ulong getDistanceT(PING *p, ulong timeout){
      doWave(p);
      pinMode(*p, INPUT);
      return pulseIn(*p, HIGH, timeout) / 58;
}

void doWave(PING *p){
      /*
       * According to the datasheet for the sensor, a pulse is
       * triggered when receiving a HIGH signal for over 5us
       *
       * |     _________
       * |____/         \______
       * |    0         5us
       * |
       *
       * this function triggers the sensor.
       *
       */
      pinMode(*p, OUTPUT);
      // ensure clean low before starting pulse
      digitalWrite(*p, LOW);
      delayMicroseconds(2);
      // start pulse and hold it for 5us
      digitalWrite(*p, HIGH);
      delayMicroseconds(5);
      digitalWrite(*p, LOW);
}

This essentially puts the abstraction of the ping and its distance calculations away from your main code, making it simpler to read/debug.

so I was wondering could I make the threshold value based on a arithmetic operator? For example when I reset the arduino I want it to take a reading from the ping sensor and than add 20 cm to the current ping reading and make the total the threshold value. I was thinking something like this

const int threshold = cm + 20;