import network
import time
from umqtt.simple import MQTTClient
from machine import Pin, time_pulse_us
print(" Starting ESP32 Smart Parking...")
# WiFi Details
SSID = "Wokwi-GUEST"
PASSWORD = ""
# MQTT Broker
MQTT_BROKER = "broker.hivemq.com"
MQTT_PORT = 1883
MQTT_TOPIC = b"smart_parking/status"
# Slot configuration
slots = [
{"name": "A1", "trig": 5, "echo": 18, "red": 15, "green": 14},
{"name": "A2", "trig": 19, "echo": 21, "red": 22, "green": 23},
{"name": "A3", "trig": 13, "echo": 12, "red": 27, "green": 26},
{"name": "A4", "trig": 25, "echo": 33, "red": 32, "green": 4},
{"name": "A5", "trig": 16, "echo": 17, "red": 2, "green": 1}
]
# GPIO setup
print("🔧 Setting up GPIO pins...")
for slot in slots:
slot["trig"] = Pin(slot["trig"], Pin.OUT)
slot["echo"] = Pin(slot["echo"], Pin.IN)
slot["red"] = Pin(slot["red"], Pin.OUT)
slot["green"] = Pin(slot["green"], Pin.OUT)
print("GPIO Setup Complete")
# Connect to WiFi
def connect_wifi():
print(" Attempting WiFi connection...")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print(" WLAN Active")
wlan.connect(SSID, PASSWORD)
print("Connecting to WiFi...")
while not wlan.isconnected():
time.sleep(1)
print("⏳ Waiting for connection...")
print("WiFi Connected:", wlan.ifconfig())
# Connect to MQTT
def connect_mqtt():
print("📡 Attempting MQTT connection...")
client = MQTTClient("esp32-client", MQTT_BROKER, port=MQTT_PORT)
client.connect()
print("MQTT Connected")
return client
# Distance logic
def get_distance(trig, echo):
print("📏 Measuring distance...")
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
duration = time_pulse_us(echo, 1, 30000)
print(f"Duration: {duration}")
return (duration * 0.0343) / 2
# Publish status
def publish(client, slot_name, status):
message = '{"slot": "' + slot_name + '", "status": "' + status + '"}'
client.publish(MQTT_TOPIC, message)
print("Published:", message)
# Main Logic
try:
connect_wifi()
mqtt_client = connect_mqtt()
while True:
for slot in slots:
dist = get_distance(slot["trig"], slot["echo"])
print(f"{slot['name']} Distance: {dist:.2f} cm")
if dist < 10:
slot["red"].on()
slot["green"].off()
publish(mqtt_client, slot["name"], "Occupied")
else:
slot["red"].off()
slot["green"].on()
publish(mqtt_client, slot["name"], "Available")
time.sleep(5)
except Exception as e:
print(" Error:", str(e))
while True:
time.sleep(1)