Skip to main content

Arduino Height Measurement System

Updated 9 min readMarkdown

1. Project Overview

The Arduino-based Height Measurement System uses an ultrasonic sensor to measure the distance between the sensor and a person's head.

The sensor is mounted at a fixed height, facing downward. When a person stands beneath it, the system measures the distance from the sensor to the person's head.

Python calculates the person's height using the following formula:

Person's Height = Sensor Mounting Height − Measured Distance

Technologies Used

  • Arduino UNO
  • HC-SR04 Ultrasonic Sensor
  • Arduino IDE
  • Python
  • Flask
  • PySerial
  • HTML, CSS and JavaScript

System Architecture

       HC-SR04 Sensor
              |
              v
          Arduino UNO
              |
              v
     USB Serial Communication
              |
              v
       Python Flask Server
              |
              v
       Height Calculation
              |
              v
        Web Dashboard
              |
              v
       Display Height (cm)

2. Hardware Requirements

Component Quantity
Arduino UNO 1
HC-SR04 Ultrasonic Sensor 1
Jumper Wires 4
USB Cable 1
Computer/Laptop 1
Fixed mounting frame 1

3. Hardware Connections

HC-SR04 to Arduino UNO

HC-SR04 Pin Arduino UNO
VCC 5V
GND GND
TRIG Digital Pin 9
ECHO Digital Pin 10

Sensor Installation:

  • Mount the ultrasonic sensor horizontally at a fixed height.
  • The sensor must face vertically downward.
  • Keep the sensor stable.
  • The person should stand directly below the sensor.
  • Measure the distance from the sensor's ultrasonic face to the floor.

For example:

       HC-SR04 SENSOR
       (Fixed Position)
       ┌─────────────┐
       │             │
       └─────────────┘
              |
              |
              |  Measured Distance
              |
           _______
          /       \
         |  HEAD   |
         |         |
         | PERSON  |
         |         |
         |         |
         |         |
         |_________|

       ----------------
             FLOOR

Example:

  • Sensor mounting height = 200 cm
  • Distance from sensor to head = 30 cm

Person's height:

[ H=200-30 ]

[ \boxed{H=170\text{ cm}} ]

Important: The sensor mounting height must be measured accurately from the sensor's measuring face to the floor.


4. Arduino IDE Setup

Step 1: Install Arduino IDE

Download Arduino IDE:

https://www.arduino.cc/en/software

Install and open Arduino IDE.

Step 2: Arduino Code

The following program measures the distance using the HC-SR04 sensor and sends the measurement to Python through serial communication.

No additional Arduino library is required.

// HC-SR04 Configuration

#define TRIG_PIN 9
#define ECHO_PIN 10

void setup() {

    // Start serial communication
    Serial.begin(9600);

    // Configure sensor pins
    pinMode(TRIG_PIN, OUTPUT);
    pinMode(ECHO_PIN, INPUT);
}

void loop() {

    // Send ultrasonic trigger pulse
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);

    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);

    digitalWrite(TRIG_PIN, LOW);

    // Read echo duration
    long duration = pulseIn(ECHO_PIN, HIGH, 30000);

    if (duration == 0) {

        Serial.println("ERROR");

    }
    else {

        // Calculate distance in centimeters
        float distance = duration * 0.0343 / 2;

        // Send distance to Python
        Serial.println(distance);
    }

    delay(500);
}

Step 3: Upload the Program

  1. Connect Arduino UNO to your computer.
  2. Select the correct board: Arduino UNO.
  3. Select the correct COM port.
  4. Upload the program.
  5. Check the Serial Monitor at 9600 baud.

Expected output:

30.20
30.10
30.25
30.15

These values represent the measured distance between the sensor and the person's head.


5. Python Environment Setup

Step 1: Install Python

Download Python:

https://www.python.org/downloads/

Verify installation:

python --version

Step 2: Create Project Folder

Open PowerShell or Command Prompt.

mkdir Height_Measurement
cd Height_Measurement

Step 3: Create Python Virtual Environment

python -m venv venv

Step 4: Activate Virtual Environment

Windows PowerShell:

.\venv\Scripts\Activate.ps1

If PowerShell blocks activation:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Then activate again:

.\venv\Scripts\Activate.ps1

Windows Command Prompt:

venv\Scripts\activate.bat

After activation, you should see:

(venv) C:\...\Height_Measurement>

Step 5: Install Required Libraries

pip install flask pyserial

Save dependencies:

pip freeze > requirements.txt

6. Project Structure

Height_Measurement/
│
├── venv/
│
├── app.py
│
└── requirements.txt

The complete website, including HTML, CSS and JavaScript, will be included inside app.py.


7. Create the Python Application

Create a file named app.py.

Important: Set SENSOR_HEIGHT_CM according to the actual height of your mounted sensor.

For this example, the sensor is mounted 200 cm above the floor.

from flask import Flask, jsonify, render_template_string
import serial
import threading
import time

app = Flask(__name__)

# ==================================
# CONFIGURATION
# ==================================

SERIAL_PORT = "COM3"
BAUD_RATE = 9600

# Sensor height from floor in centimeters
SENSOR_HEIGHT_CM = 200

# Measurement variables
distance = 0
person_height = 0

connection_status = "Disconnected"
last_updated = "--"


# ==================================
# ARDUINO SERIAL COMMUNICATION
# ==================================

def read_arduino():

    global distance, person_height
    global connection_status, last_updated

    while True:

        try:

            print("Connecting to Arduino...")

            arduino = serial.Serial(
                SERIAL_PORT,
                BAUD_RATE,
                timeout=2
            )

            time.sleep(2)

            connection_status = "Connected"

            print("Arduino Connected!")

            while True:

                line = arduino.readline().decode(
                    "utf-8",
                    errors="ignore"
                ).strip()

                if not line or line == "ERROR":
                    continue

                try:

                    measured_distance = float(line)

                    # Validate sensor measurement
                    if not 2 <= measured_distance < SENSOR_HEIGHT_CM:
                        continue

                    # Calculate person's height
                    calculated_height = (
                        SENSOR_HEIGHT_CM - measured_distance
                    )

                    distance = round(measured_distance, 2)

                    person_height = round(
                        calculated_height, 2
                    )

                    last_updated = time.strftime("%H:%M:%S")

                    print(
                        f"Distance: {distance} cm | "
                        f"Height: {person_height} cm"
                    )

                except ValueError:
                    continue

        except Exception as error:

            connection_status = "Disconnected"

            print("Arduino Error:", error)

            time.sleep(3)


# ==================================
# WEB DASHBOARD
# ==================================

HTML_PAGE = """

<!DOCTYPE html>
<html>

<head>

    <title>Height Measurement System</title>

    <meta name="viewport"
          content="width=device-width, initial-scale=1">

    <style>

        * {
            box-sizing: border-box;
        }

        body {
            margin: 0;
            font-family: Arial, sans-serif;
            background: #eef2f7;
            color: #172554;
        }

        header {
            background: #172554;
            color: white;
            text-align: center;
            padding: 30px 15px;
        }

        header h1 {
            margin: 0 0 10px;
        }

        .container {
            max-width: 900px;
            margin: 50px auto;
            padding: 15px;
        }

        .cards {
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
            gap: 25px;
        }

        .card {
            background: white;
            width: 300px;
            padding: 35px 20px;
            border-radius: 18px;
            text-align: center;
            box-shadow: 0 5px 20px #0001;
        }

        .icon {
            font-size: 45px;
        }

        .value {
            font-size: 45px;
            font-weight: bold;
            margin: 20px 0;
        }

        .height {
            color: #2563eb;
        }

        .distance {
            color: #ea580c;
        }

        .status-box {
            background: white;
            padding: 22px;
            border-radius: 15px;
            margin-top: 30px;
            text-align: center;
        }

        .connected {
            color: #16a34a;
        }

        .disconnected {
            color: #dc2626;
        }

        .info {
            background: white;
            padding: 20px;
            margin-top: 25px;
            border-radius: 15px;
            text-align: center;
        }

        footer {
            text-align: center;
            padding: 25px;
            color: #64748b;
        }

    </style>

</head>

<body>

    <header>

        <h1>📏 Height Measurement System</h1>

        <p>Arduino-Based Smart Height Monitoring</p>

    </header>


    <div class="container">

        <div class="cards">

            <div class="card">

                <div class="icon">🧍</div>

                <h2>Person's Height</h2>

                <div class="value height" id="height">

                    -- cm

                </div>

                <p>Calculated Height</p>

            </div>


            <div class="card">

                <div class="icon">📡</div>

                <h2>Sensor Distance</h2>

                <div class="value distance" id="distance">

                    -- cm

                </div>

                <p>Distance from Sensor to Head</p>

            </div>

        </div>


        <div class="info">

            <h3>Sensor Mounting Height</h3>

            <h2 id="mounting">-- cm</h2>

        </div>


        <div class="status-box">

            <h3>

                Arduino Status:

                <span id="status" class="disconnected">

                    Checking...

                </span>

            </h3>

            <p>

                Last Updated:

                <span id="updated">--</span>

            </p>

        </div>

    </div>


    <footer>

        Arduino UNO + HC-SR04 | Python Flask

    </footer>


    <script>

        async function updateData() {

            try {

                const response = await fetch("/data");

                const data = await response.json();


                document.getElementById("height").innerText =
                    data.height + " cm";


                document.getElementById("distance").innerText =
                    data.distance + " cm";


                document.getElementById("mounting").innerText =
                    data.mounting_height + " cm";


                const status =
                    document.getElementById("status");


                status.innerText = data.status;


                status.className =
                    data.status === "Connected"
                    ? "connected"
                    : "disconnected";


                document.getElementById("updated").innerText =
                    data.updated;

            }

            catch (error) {

                document.getElementById("status").innerText =
                    "Connection Error";

            }

        }


        updateData();

        // Refresh dashboard every second
        setInterval(updateData, 1000);

    </script>

</body>

</html>

"""


# ==================================
# FLASK ROUTES
# ==================================

@app.route("/")
def home():

    return render_template_string(HTML_PAGE)


@app.route("/data")
def get_data():

    return jsonify({

        "height": person_height,

        "distance": distance,

        "mounting_height": SENSOR_HEIGHT_CM,

        "status": connection_status,

        "updated": last_updated

    })


# ==================================
# START APPLICATION
# ==================================

if __name__ == "__main__":

    thread = threading.Thread(
        target=read_arduino,
        daemon=True
    )

    thread.start()

    app.run(
        host="127.0.0.1",
        port=5000,
        debug=False
    )

8. Configure Sensor Height and COM Port

Open app.py and change these values:

SERIAL_PORT = "COM3"

SENSOR_HEIGHT_CM = 200

For example, if the sensor is mounted 210 cm above the floor:

SENSOR_HEIGHT_CM = 210

If Arduino is connected to COM5:

SERIAL_PORT = "COM5"

Remember: The mounting height is measured from the ultrasonic sensor's front measuring surface, not from the Arduino board or mounting bracket.


9. Run the Application

  1. Connect Arduino UNO to your computer.
  2. Upload the Arduino program.
  3. Close Arduino IDE Serial Monitor.
  4. Activate the Python virtual environment.
  5. Run the application:
python app.py

Open the browser:

http://127.0.0.1:5000

Example Result

Suppose:

  • Sensor mounting height = 200 cm
  • Measured distance = 30 cm

Then:

[ H=200-30=170\text{ cm} ]

The dashboard will display:

Measurement Value
Person's Height 170 cm
Sensor Distance 30 cm
Sensor Mounting Height 200 cm
Arduino Status Connected

10. Troubleshooting

Problem Solution
COM port error Check Arduino COM port
Access denied Close Arduino Serial Monitor
Arduino disconnected Check USB connection
Height shows zero Check sensor wiring and mounting height
Unstable readings Keep the sensor fixed and person stationary
Incorrect height Re-measure the sensor-to-floor distance
No sensor reading Check TRIG and ECHO connections

11. Important Accuracy and Safety Notes

  • Mount the sensor securely and vertically.
  • Ensure the sensor has a clear view of the person's head.
  • Ask the person to stand straight and remain still.
  • Avoid measuring near walls or other objects that can reflect ultrasonic waves.
  • Take several measurements and use an average for better stability.
  • HC-SR04 readings can vary depending on the surface, angle and environment.
  • This is an educational prototype, not a medical-grade height measurement instrument.

12. Future Improvements

Students can extend this project with:

  1. Automatic averaging of multiple readings.
  2. Display height in both centimeters and feet/inches.
  3. Save measurements in an SQLite database.
  4. Add student name and measurement history.
  5. Generate height measurement reports.
  6. Add an LCD display.
  7. Develop a school-based student height monitoring system.

Project Conclusion: This project demonstrates how an ultrasonic sensor, Arduino, Python serial communication and Flask web development can be combined to create a practical height measurement system.

80 views

No comments yet. Be the first to comment.