import RPi.GPIO as GPIO
import time
import requests
# Pin Definitions
TRIG_PIN = 12 # Ultrasonic Trigger pin (BCM GPIO)
ECHO_PIN = 18 # Ultrasonic Echo pin (BCM GPIO)
GREEN_LED_PIN = 16 # Green LED pin (BCM GPIO)
YELLOW_LED_PIN = 20 # Yellow LED pin (BCM GPIO)
RED_LED_PIN = 21 # Red LED pin (BCM GPIO)
# ESP32-CAM Web Server URL
ESP32_CAM_URL = "http://192.168.x.x/stream" # Replace with ESP32-CAM IP address
# Setup GPIO mode and pins
GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG_PIN, GPIO.OUT)
GPIO.setup(ECHO_PIN, GPIO.IN)
GPIO.setup(GREEN_LED_PIN, GPIO.OUT)
GPIO.setup(YELLOW_LED_PIN, GPIO.OUT)
GPIO.setup(RED_LED_PIN, GPIO.OUT)
def measure_distance():
"""Measure distance using HC-SR04 ultrasonic sensor."""
# Send trigger pulse
GPIO.output(TRIG_PIN, True)
time.sleep(0.00001) # Trigger pulse duration: ~10µs
GPIO.output(TRIG_PIN, False)
# Wait for echo response and calculate duration
while GPIO.input(ECHO_PIN) == False:
pulse_start_time = time.time()
while GPIO.input(ECHO_PIN) == True:
pulse_end_time = time.time()
pulse_duration = pulse_end_time - pulse_start_time
# Calculate distance in cm: speed of sound ~343m/s or ~34300cm/s
distance_cm = round(pulse_duration * (34300 / 2), 2)
return distance_cm
def update_leds(distance):
"""Update LEDs based on distance."""
GPIO.output(GREEN_LED_PIN, False)
GPIO.output(YELLOW_LED_PIN, False)
GPIO.output(RED_LED_PIN, False)
if distance < 100: # Short distance → Green LED
GPIO.output(GREEN_LED_PIN, True)
elif distance < 200: # Medium distance → Yellow LED
GPIO.output(YELLOW_LED_PIN, True)
else: # Long distance → Red LED
GPIO.output(RED_LED_PIN, True)
def fetch_traffic_data():
"""Fetch traffic data from ESP32-CAM."""
try:
response = requests.get(ESP32_CAM_URL) # Fetch video stream or image data
if response.status_code == 200:
print("Traffic data received from ESP32-CAM.")
return "Heavy Traffic" if len(response.content) > 30000 else "Light Traffic"
else:
print("Failed to fetch traffic data.")
return "Unknown"
except Exception as e:
print(f"Error fetching traffic data: {e}")
return "Unknown"
def main():
"""Main loop."""
try:
while True:
# Measure distance using ultrasonic sensor
distance = measure_distance()
print(f"Distance: {distance} cm")
# Update LEDs based on measured distance
update_leds(distance)
# Fetch traffic data from ESP32-CAM
traffic_status = fetch_traffic_data()
print(f"Traffic Status: {traffic_status}")
time.sleep(2) # Delay between measurements
except KeyboardInterrupt:
print("Measurement stopped by user.")
GPIO.cleanup()
if __name__ == "__main__":
main()