# main.py — Smart Parking Monitor
# MicroPython ESP32 | Wokwi Free (tanpa library eksternal)
import uasyncio as asyncio
import network
import time
from config import WIFI_SSID, WIFI_PASS
from parking import ParkingMonitor
from firebase import FirebaseClient
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if wlan.isconnected():
return True
print("Connecting WiFi...")
wlan.connect(WIFI_SSID, WIFI_PASS)
for _ in range(20):
if wlan.isconnected():
print("WiFi OK:", wlan.ifconfig()[0])
return True
time.sleep(1)
print("WiFi gagal — mode offline")
return False
async def task_sensor(monitor):
while True:
monitor.read_all_sensors()
monitor.update_led()
monitor.update_lcd()
await asyncio.sleep_ms(300)
async def task_buttons(monitor):
while True:
monitor.read_buttons()
await asyncio.sleep_ms(50)
async def task_firebase(monitor, fb):
while True:
await asyncio.sleep(5)
data = monitor.get_state_dict()
ok = fb.patch("parking", data)
print("Firebase:", "OK" if ok else "GAGAL")
if ok:
fb.post("history", {
"occupied" : data["occupied"],
"freeSlots": data["freeSlots"],
"ts" : data["uptime_s"],
})
async def main():
wifi_ok = connect_wifi()
monitor = ParkingMonitor()
monitor.lcd_clear()
monitor.lcd_print("Smart Parking", row=0)
monitor.lcd_print("MicroPython IoT", row=1)
time.sleep(2)
fb = FirebaseClient() if wifi_ok else None
tasks = [
asyncio.create_task(task_sensor(monitor)),
asyncio.create_task(task_buttons(monitor)),
]
if fb:
tasks.append(asyncio.create_task(task_firebase(monitor, fb)))
await asyncio.gather(*tasks)
asyncio.run(main())