import network
import time
import ujson
from machine import UART
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-gps-demo"
MQTT_BROKER = "io.adafruit.com"
MQTT_USER = "thembo-joles"
MQTT_PASSWORD = "aio_czTa95pdfDJrLlyJzhXLnuEsPrgy"
MQTT_TOPIC = "thembo-joles/feeds/gps"
# GPS UART pins
RX_PIN = 16
TX_PIN = 17
GPS_BAUD = 9600
# Initialize UART for GPS
uart = UART(1, baudrate=GPS_BAUD, tx=TX_PIN, rx=RX_PIN)
# Function to scan and list available WiFi networks
def scan_wifi():
print("Scanning for WiFi networks...")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
networks = wifi.scan()
for net in networks:
ssid = net[0].decode('utf-8')
bssid = ':'.join('%02x' % b for b in net[1])
channel = net[2]
RSSI = net[3]
authmode = net[4]
print(f"SSID: {ssid}, BSSID: {bssid}, Channel: {channel}, RSSI: {RSSI}, Authmode: {authmode}")
# Connect to WiFi
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('wWokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Scan for WiFi networks
scan_wifi()
# Connect to MQTT broker
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
prev_location = ""
while True:
if uart.any():
gps_data = uart.readline().decode().strip()
if gps_data.startswith("$GNGGA"):
data = gps_data.split(',')
latitude = data[2]
longitude = data[4]
altitude = data[9]
message = ujson.dumps({
"latitude": latitude,
"longitude": longitude,
"altitude": altitude
})
if message != prev_location:
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
prev_location = message
else:
print("No change")
time.sleep(1)