code to use ultrasonic sensors without pulseIn() function or newping library

Hi memes,
Can anyone explain me how to implement multiple ultrasonic sensors(HC-SR04) without pulseIn() function or newping.h.

in essence you need to bring functional identical code from the libraries to your own sketch.

The principle is simple,

  1. make a pin HIGH (or LOW), and note the time
  2. make it input and wait until change
  3. note the time
  4. calculate the distance from the time used.

for multiple pins you can use the same principle

  1. make all pins HIGH (or LOW), and note the time
  2. make all pins input and wait until one changes
  3. note the time if one changes
  4. repeat 3 until all pins are done (or timeout)
  5. calculate the distance from the time used for all pins

instead of (4) you can start doing (5) but might that cause difficulties in (3)

HC-SR04 has four pins, is there any chance of getting one sensor trigger pulse to another echo pin?

Hi all,

I kinda have a similar problem with the HC-RS04

When i use the Newping library the readings from the sensor are not accurate and jump so much

the sketch i’m using is:

#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 500
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
void setup() {
void loop() {
   unsigned int uS = sonar.ping_cm();

But when i don’t use the library and just the pulseIn(); the data are pretty accurate and don’t jump around.

The sketch is:

int trigPin = 12;    //Trig - green Jumper
int echoPin = 11;    //Echo - yellow Jumper
long duration, cm, inches;
void setup() {
  //Serial Port begin
  Serial.begin (9600);
  //Define inputs and outputs
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
void loop()
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  digitalWrite(trigPin, LOW);
  digitalWrite(trigPin, HIGH);
  digitalWrite(trigPin, LOW);
  // Read the signal from the sensor: 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(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
  // convert the time into a distance
  cm = (duration/2) / 29.1;
  inches = (duration/2) / 74; 
  Serial.print("in, ");

I’m i doing something wrong or this behaviour is normal?
If so, how to overcome the issue?

pulseIn() function is not okay with more number of ultrasonic sensors

Yes, that’s why i’m using this

// ---------------------------------------------------------------------------
// This example shows how to use NewPing's ping_timer method which uses the Timer2 interrupt to get the
// ping time. The advantage of using this method over the standard ping method is that it permits a more
// event-driven sketch which allows you to appear to do two things at once. An example would be to ping
// an ultrasonic sensor for a possible collision while at the same time navigating. This allows a
// properly developed sketch to multitask. Be aware that because the ping_timer method uses Timer2,
// other features or libraries that also use Timer2 would be effected. For example, the PWM function on
// pins 3 & 11 on Arduino Uno (pins 9 and 11 on Arduino Mega) and the Tone library. Note, only the PWM
// functionality of the pins is lost (as they use Timer2 to do PWM), the pins are still available to use.
// NOTE: For Teensy/Leonardo (ATmega32U4) the library uses Timer4 instead of Timer2.
// ---------------------------------------------------------------------------
#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on ping sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

unsigned int pingSpeed = 50; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
unsigned long pingTimer;     // Holds the next ping time.

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  pingTimer = millis(); // Start now.

void loop() {
  // Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.
  if (millis() >= pingTimer) {   // pingSpeed milliseconds since last ping, do another ping.
    pingTimer += pingSpeed;      // Set the next ping time.
    sonar.ping_timer(echoCheck); // Send out the ping, calls "echoCheck" function every 24uS where you can check the ping status.
  // Do other stuff here, really. Think of it as multi-tasking.

void echoCheck() { // Timer2 interrupt calls this function every 24uS where you can check the ping status.
  // Don't do anything here!
  if (sonar.check_timer()) { // This is how you check to see if the ping was received.
    // Here's where you can add code.
    Serial.print("Ping: ");
    Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // Ping returned, uS result in ping_result, convert to cm with US_ROUNDTRIP_CM.
  // Don't do anything here!

pulseIn() function is not okay with more number of ultrasonic sensors

So do not use it but implement the behavior with your own code that does ...

(Warning that is not trivial)

Maybe this blog can help you eventhogh korean.