import machine
import time
import urequests
import ujson
import network
# Define your Wi-Fi credentials
wifi_ssid = 'Wokwi-GUEST'
wifi_password = ''
# Connect to Wi-Fi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(wifi_ssid, wifi_password)
# Wait for Wi-Fi connection
while not wifi.isconnected():
pass
# Define GPIO pins for ultrasonic sensors
trig_pins = [2, 18, 22] # Example pins, use the appropriate pins for your setup
echo_pins = [4, 19, 23] # Example pins, use the appropriate pins for your setup
# Define GPIO pins for PIR sensors
pir_pins = [15, 5, 21] # Example pins, use the appropriate pins for your setup
pir_sensors = [machine.Pin(pin, machine.Pin.IN) for pin in pir_pins]
# Threshold for PIR sensors (adjust as needed)
pir_threshold = 1 # This may vary based on the PIR sensor module
# Define the maximum distance to consider a parking space available (adjust as needed)
max_distance = 50 # in centimeters
# Firebase Realtime Database URL and secret
firebase_url = 'https://smart-parking-iot-387a4-default-rtdb.firebaseio.com/'
firebase_secret = 'hHfO7ikfdYRbyV9DsFW6KQywqJq90oAZNELNrc8L'
# Function to measure distance using ultrasonic sensor
def measure_distance(trig_pin, echo_pin):
trig = machine.Pin(trig_pin, machine.Pin.OUT)
echo = machine.Pin(echo_pin, machine.Pin.IN)
# Ensure the trigger pin is low
trig.off()
time.sleep_us(2)
# Generate a 10us pulse on the trigger pin
trig.on()
time.sleep_us(10)
trig.off()
# Measure the duration of the pulse on the echo pin
while echo.value() == 0:
pulse_start = time.ticks_us()
while echo.value() == 1:
pulse_end = time.ticks_us()
# Calculate the duration of the pulse
pulse_duration = time.ticks_diff(pulse_end, pulse_start)
# Calculate the distance based on the speed of sound
distance = (pulse_duration / 2) / 29.1 # Speed of sound in air is approximately 343 m/s
return distance
def check_parking_availability():
parking_status = []
for i in range(len(trig_pins)):
ultrasonic_distances = measure_distance(trig_pins[i], echo_pins[i])
pir_value = pir_sensors[i].value()
print(pir_value)
# Check if a parking space is available
if ultrasonic_distances > max_distance and pir_value <= pir_threshold:
parking_status.append("Available")
else:
parking_status.append("Occupied")
return parking_status
# Function to send parking availability to Firebase
def send_parking_to_firebase(parking_status):
for i in range(len(parking_status)):
slot_status = parking_status[i]
data = {'ParkingSlot': i + 1, 'Status': slot_status}
url = f'{firebase_url}/parking_slot_{i + 1}.json?auth={firebase_secret}'
try:
response = urequests.patch(url, json=data) # Use 'patch' instead of 'put'
if response.status_code == 200:
print(f"Data for Parking Slot {i + 1} sent to Firebase")
else:
print(f"Failed to send data to Firebase. Status code: {response.status_code}")
except Exception as e:
print(f"Error sending data to Firebase: {str(e)}")
while True:
parking_status = check_parking_availability()
for i in range(len(parking_status)):
print(f"Parking Slot {i + 1}: {parking_status[i]}")
# Send data to Firebase
send_parking_to_firebase(parking_status)
time.sleep(1) # Adjust the sleep duration as needed