Summary of Arduino Sketch Read Sonar
This Arduino sketch measures distance using an HC-SR04 ultrasonic sensor by sending a trigger pulse and timing the echo pulse's duration. It calculates distance based on the speed of sound and prints the result via serial communication at 9600 baud. The sensor connects to digital pins 8 (TRIG) and 7 (ECHO). The code includes timeout handling for maximum measurable distance and runs continuously with brief delays for sensor recovery.
Parts used in the Read Ultrasonic Ranger project:
- Arduino UNO
- HC-SR04 Ultrasonic Sensor
- Connecting wires
- Computer with Arduino IDE
This sketch is used by Exercise: Read Ultrasonic Ranger.

Full Source Code
The full code is all in one file ReadSonar.ino.
// ReadSonar - measure distance using a HC-SR04 or compatible ultrasonic ranger // // Copyright (c) 2016, Garth Zeglin. All rights reserved. Licensed under the // terms of the BSD 3-clause license as included in LICENSE. // // This program assumes that: // // 1. A SR04 sonar is connected: as follows: pin 8 is TRIG, pin 7 is ECHO. // Note: this sensor has +5V digital outputs can connect directly to the // digital input pins on the Arduino UNO. // // 2. The serial console on the Arduino IDE is set to 9600 baud communications speed. // // Note: this works, but could still use refinement. The actual module echo // waveform doesn't quite match the description, there appears to be an initial // HIGH pulse prior to the LOW during propagation time. A better solution may // be to use the NewPing library. // ================================================================================ // Define constant values. // The wiring assignment. const int TRIG_PIN = 8; const int ECHO_PIN = 7; // The rated distance limit of the sensor, in cm. const int MAX_DISTANCE = 450; // A typical speed of sound, specified in cm/sec. const long SOUND_SPEED = 34000; // Determine the maximum time to wait for an echo. The maximum rated distance is // 4.5 meters; if no echo is received within the duration representing this // round-trip distance, stop measuring. The timeout is specified in // microseconds. const long TIMEOUT = (2 * MAX_DISTANCE * 1000000)/SOUND_SPEED; // ================================================================================ // Configure the hardware once after booting up. This runs once after pressing // reset or powering up the board. void setup() { // Initialize the serial UART at 9600 bits per second. Serial.begin(9600); // Initialize the trigger pin for output. pinMode(TRIG_PIN, OUTPUT); digitalWrite(TRIG_PIN, LOW); // Initialize the echo pin for input. pinMode(ECHO_PIN, INPUT); } // ================================================================================ // Run one iteration of the main event loop. The Arduino system will call this // function over and over forever. void loop() { // Read the distance as an uncalibrated timing value in microseconds. long duration = ping_sonar(); // function is defined below // If valid, scale into real-world units. if (duration > 0) { // Convert to a distance. Note that the speed of sound is specified in // cm/sec, so the duration is scaled from microsecondst o seconds. The // factor of 2 accounts for the round-trip doubling the time. float distance = (duration * 1e-6 * SOUND_SPEED) / 2; Serial.print("Ping: "); Serial.print(duration); Serial.print(" usec Distance: "); Serial.print(distance); Serial.println(" cm"); } else { // if no pulse detected Serial.println("No ping."); } // Allow a little extra time for the sonar to recover. delay(30); } // ================================================================================ // Ping function to run one measurement cycle using the sonar. Returns a ping // travel duration in microseconds, or 0 if no echo was observed. long ping_sonar(void) { // Generate a short trigger pulse. digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure the pulse length return pulseIn(ECHO_PIN, HIGH, TIMEOUT); } // ================================================================================
Source: Arduino Sketch ReadSonar