from machine import Pin, UART, I2C from ssd1306 import SSD1306_I2C #Import utime library to implement delay import utime, time #Oled I2C connection i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000) oled = SSD1306_I2C(128, 64, i2c) #GPS Module UART Connection gps_module = UART(0, baudrate=9600, tx=Pin(12), rx=Pin(13)) #print gps module connection details print(gps_module) #Used to Store NMEA Sentences buff = bytearray(255) TIMEOUT = False #store the status of satellite is fixed or not FIX_STATUS = False #Store GPS Coordinates latitude = "" longitude = "" satellites = "" gpsTime = "" #function to get gps Coordinates def getPositionData(gps_module): global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, gpsTime #run while loop to get gps data #or terminate while loop after 5 seconds timeout timeout = time.time() + 30 # 8 seconds from now while True: gps_module.readline() buff = str(gps_module.readline()) #parse $GPGGA term #b'$GPGGA,094840.000,2941.8543,N,07232.5745,E,1,09,0.9,102.1,M,0.0,M,,*6C\r\n' #print(buff) parts = buff.split(',') #if no gps displayed remove "and len(parts) == 15" from below if condition if (parts[0] == "b'$GNGGA" and len(parts) == 15): if(parts[1] and parts[2] and parts[3] and parts[4] and parts[5] and parts[6] and parts[7]): print(buff) print("Message ID : " + parts[0]) print("UTC time : " + parts[1]) print("Latitude : " + parts[2]) print("N/S : " + parts[3]) print("Longitude : " + parts[4]) print("E/W : " + parts[5]) print("Position Fix: " + parts[6]) print("n sat : " + parts[7]) latitude = convertToDigree(parts[2]) # parts[3] contain 'N' or 'S' if (parts[3] == 'S'): latitude = -latitude longitude = convertToDigree(parts[4]) # parts[5] contain 'E' or 'W' if (parts[5] == 'W'): longitude = -longitude satellites = parts[7] gpsTime = parts[1][0:2] + ":" + parts[1][2:4] + ":" + parts[1][4:6] FIX_STATUS = True break if (time.time() > timeout): TIMEOUT = True break utime.sleep_ms(500) #function to convert raw Latitude and Longitude #to actual Latitude and Longitude def convertToDigree(RawDegrees): RawAsFloat = float(RawDegrees) firstdigits = int(RawAsFloat/100) #degrees nexttwodigits = RawAsFloat - float(firstdigits*100) #minutes Converted = float(firstdigits + nexttwodigits/60.0) Converted = '{0:.6f}'.format(Converted) # to 6 decimal places return str(Converted) while True: getPositionData(gps_module) #if gps data is found then print it on lcd if(FIX_STATUS == True): print("fix......") oled.fill(0) oled.text("Lat: "+latitude, 0, 0) oled.text("Lng: "+longitude, 0, 10) oled.text("No of Sat: "+satellites, 0, 20) oled.text("Time: "+gpsTime, 0, 30) oled.show() print(latitude) print(longitude) print(satellites) print(gpsTime) FIX_STATUS = False if(TIMEOUT == True): print("Request Timeout: No GPS data is found.") #-------------------------------------------------- #updated on 5-May-2022 oled.fill(0) oled.text("No GPS data is found", 0, 0) oled.show() #-------------------------------------------------- TIMEOUT = False