# esp32_custom_coords.py
# MicroPython: follow user-provided coords, publish GPS + fixed distance (40) to HiveMQ every 8s
from machine import Pin
import network
import time
import ujson
from umqtt.simple import MQTTClient
import ussl
# ---------- CONFIG ----------
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
MQTT_HOST = "0b270ee4185f47c3a7cc53583d65d2a7.s1.eu.hivemq.cloud"
MQTT_PORT = 8883
MQTT_USER = "admin"
MQTT_KEY = "Admin1234"
MQTT_GPS_TOPIC = "T001/gps"
MQTT_DISTANCE_TOPIC = "T001/distance"
UPDATE_INTERVAL_MS = 10000 # 10 seconds between updates
# ---------- USER PROVIDED PATH POINTS ----------
path_points = [
(18.769229, 73.404845),
(18.768629, 73.406981),
(18.767787, 73.409060),
(18.766759, 73.410879),
(18.765867, 73.412488),
(18.764430, 73.415117),
(18.763414, 73.417432),
(18.762119, 73.420402),
(18.761311, 73.422805),
(18.760739, 73.425208),
(18.760665, 73.426114),
(18.760391, 73.427584),
(18.760319, 73.428006),
(18.760055, 73.428489),
(18.759709, 73.428875),
(18.759059, 73.429218),
(18.757484, 73.429208)
]
# ---------- PATH GENERATOR (looping) ----------
def path_loop_generator(points):
i = 0
n = len(points)
while True:
yield points[i]
i = (i + 1) % n
# ---------- WIFI CONNECT ----------
sta = network.WLAN(network.STA_IF)
sta.active(True)
print("Connecting to Wi-Fi:", WIFI_SSID)
sta.connect(WIFI_SSID, WIFI_PASS)
while not sta.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nWi-Fi connected:", sta.ifconfig())
# ---------- MQTT CONNECT (TLS) ----------
client = MQTTClient(
client_id="esp32_custom_coords",
server=MQTT_HOST,
port=MQTT_PORT,
user=MQTT_USER,
password=MQTT_KEY,
ssl=True,
ssl_params={"server_hostname": MQTT_HOST}
)
print("Connecting to MQTT broker...")
client.connect()
print("Connected to MQTT.")
# ---------- MAIN LOOP ----------
gen = path_loop_generator(path_points)
last = time.ticks_ms()
print("Starting simulation: {} points, {} ms interval".format(len(path_points), UPDATE_INTERVAL_MS))
while True:
now = time.ticks_ms()
if time.ticks_diff(now, last) >= UPDATE_INTERVAL_MS:
lat, lon = next(gen)
# Fixed distance value
distance = 40
# publish GPS data as JSON
gps_payload = {"lat": round(lat, 6), "lon": round(lon, 6), "ts_ms": time.ticks_ms()}
try:
client.publish(MQTT_GPS_TOPIC, ujson.dumps(gps_payload))
print("GPS →", gps_payload)
except Exception as e:
print("Failed to publish GPS:", e)
# publish fixed distance as plain number
try:
client.publish(MQTT_DISTANCE_TOPIC, str(distance))
print(f"Distance → Topic: {MQTT_DISTANCE_TOPIC}, Payload: {distance}")
except Exception as e:
print("Failed to publish distance:", e)
last = now
time.sleep_ms(50)