Object Detection Using Raspberry Pi, HC-SR04, LED, and Buzzer
, , , ,

Object Detection Using Raspberry Pi, HC-SR04, LED, and Buzzer | Master Implementation using python 2025

Object Detection Using Raspberry Pi : In this project, we’ll build a simple object detection system using a Raspberry Pi. When the ultrasonic sensor detects an object within a certain distance (e.g., less than 10 cm), it will turn on an LED and sound a buzzer.

Perfect for beginners, this project combines basic GPIO usage with real-world hardware.

Components Required for Object Detection Using Raspberry Pi

ComponentQuantity
Raspberry Pi (any model with GPIO)1
HC-SR04 Ultrasonic Sensor1
Breadboard1
Jumper Wires~10
LED1
Resistor (220Ω for LED)1
Active Buzzer1
Optional: Resistors for voltage divider (1kΩ + 2kΩ)2

Raspberry Pi GPIO Pin Mapping (BCM Mode)

PurposeGPIO PinPhysical PinComponent Pin
Trigger (Ultrasonic)GPIO 23Pin 16HC-SR04 TRIG
Echo (Ultrasonic)GPIO 24Pin 18HC-SR04 ECHO
LED ControlGPIO 18Pin 12LED (via resistor)
Buzzer ControlGPIO 25Pin 22Buzzer (+ve)
5V Power5VPin 2 or 4HC-SR04 VCC, Buzzer
GroundGNDPin 6 or 9All GND pins

Wiring Instructions

1. HC-SR04 Ultrasonic Sensor

HC-SR04 PinConnect To
VCC5V (Pin 2/4)
GNDGND (Pin 6)
TRIGGPIO 23 (Pin 16)
ECHOGPIO 24 via voltage divider

⚠️ Important: The ECHO pin outputs 5V, but Raspberry Pi GPIO only supports 3.3V. Use a voltage divider:

  • 1kΩ resistor between Echo and Pi GPIO24
  • 2kΩ resistor between Echo and GND
  • Tap from junction to GPIO24

2. LED

LED PinConnect To
Anode (+)GPIO 18 via 220Ω resistor
Cathode (-)GND

3. Buzzer (Active Type)

Buzzer PinConnect To
+veGPIO 25
-veGND

If you’re using a passive buzzer, use a transistor (NPN) to drive it safely.

Python Code

Here’s the complete Python script to read the ultrasonic sensor, and control the LED and buzzer based on object detection:

import RPi.GPIO as GPIO
import time

# Set GPIO mode
GPIO.setmode(GPIO.BCM)

# Define pin numbers
GPIO_TRIGGER = 23
GPIO_ECHO = 24
LED_PIN = 18
BUZZER_PIN = 25

# Set pin directions
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BUZZER_PIN, GPIO.OUT)

def distance():
    # Send 10us pulse to trigger
    GPIO.output(GPIO_TRIGGER, True)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)

    start_time = time.time()
    stop_time = time.time()

    while GPIO.input(GPIO_ECHO) == 0:
        start_time = time.time()

    while GPIO.input(GPIO_ECHO) == 1:
        stop_time = time.time()

    time_elapsed = stop_time - start_time
    distance_cm = (time_elapsed * 34300) / 2
    return distance_cm

try:
    while True:
        dist = distance()
        print(f"Measured Distance = {dist:.1f} cm")

        if dist < 10.0:
            GPIO.output(LED_PIN, GPIO.HIGH)
            GPIO.output(BUZZER_PIN, GPIO.HIGH)
        else:
            GPIO.output(LED_PIN, GPIO.LOW)
            GPIO.output(BUZZER_PIN, GPIO.LOW)

        time.sleep(1)

except KeyboardInterrupt:
    print("Measurement stopped by User")
    GPIO.cleanup()

How It Works

  • The HC-SR04 sends an ultrasonic pulse.
  • When it bounces back from an object, the sensor calculates the distance.
  • If the distance is less than 10 cm, it:
    • Turns ON the LED
    • Activates the buzzer
  • Otherwise, both remain OFF.

Tips

  • Ensure all ground connections are common.
  • Always power off Raspberry Pi while wiring.
  • Use GPIO.cleanup() to reset pins after the script ends.
  • You can tweak the threshold distance (if dist < 10.0:) based on your requirement.

Applications

  • Obstacle detection for robots
  • Proximity-based alerts
  • Contactless doorbell or switch
  • Smart trash bin lid opener

You can expand it further by adding a display (OLED/LCD), sending alerts via email, or connecting to a mobile app!

UltrasonicMailCam.py
import RPi.GPIO as GPIO
import time
import subprocess
import yagmail
import os

# === GPIO Pin Setup ===
GPIO.setmode(GPIO.BCM)

GPIO_TRIGGER = 23
GPIO_ECHO = 24
LED_PIN = 18
BUZZER_PIN = 25

GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BUZZER_PIN, GPIO.OUT)

# === Distance Measurement Function ===
def measure_distance():
    GPIO.output(GPIO_TRIGGER, True)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)

    start_time = time.time()
    stop_time = time.time()

    while GPIO.input(GPIO_ECHO) == 0:
        start_time = time.time()
    while GPIO.input(GPIO_ECHO) == 1:
        stop_time = time.time()

    time_elapsed = stop_time - start_time
    distance_cm = (time_elapsed * 34300) / 2
    return distance_cm

# === Image Capture Function ===
def capture_image_libcamera(filename="captured.jpg"):
    subprocess.run(["libcamera-still", "-o", filename, "--nopreview"], check=True)

# === Email Sending Function ===
def send_email_with_attachment(sender, app_password, receiver, subject, message, attachment_path):
    yag = yagmail.SMTP(user=sender, password=app_password)
    yag.send(
        to=receiver,
        subject=subject,
        contents=message,
        attachments=attachment_path
    )
    print("📧 Email sent successfully!")

# === Main Function ===
if __name__ == '__main__':
    try:
        image_sent = False  # To avoid sending multiple emails rapidly

        while True:
            dist = measure_distance()
            print(f"Measured Distance = {dist:.1f} cm")

            if dist < 10.0:
                GPIO.output(LED_PIN, GPIO.HIGH)
                GPIO.output(BUZZER_PIN, GPIO.HIGH)

                if not image_sent:
                    print("📸 Object detected! Capturing image and sending email...")

                    # Capture image
                    image_file = "captured.jpg"
                    capture_image_libcamera(image_file)

                    # Send email
                    sender_email = "nishantsingh2jan1998@gmail.com"
                    app_password = "rooh lcrd byqw wuab"
                    receiver_email = "nishantkumarsingh131@gmail.com"
                    subject = "Captured Image from Raspberry Pi"
                    message = "Hi, this is the captured image attached."
                    send_email_with_attachment(sender_email, app_password, receiver_email, subject, message, image_file)

                    # Remove image after sending
                    if os.path.exists(image_file):
                        os.remove(image_file)
                        print("🗑️ Temporary image file removed.")

                    image_sent = True  # Mark as sent

            else:
                GPIO.output(LED_PIN, GPIO.LOW)
                GPIO.output(BUZZER_PIN, GPIO.LOW)
                image_sent = False  # Reset flag when object is gone

            time.sleep(1)

    except KeyboardInterrupt:
        print("\n🛑 Program stopped by user.")
        GPIO.cleanup()

You can also Visit other tutorials of Embedded Prep 

Special thanks to @mr-raj for contributing to this article on

Leave a Reply

Your email address will not be published. Required fields are marked *