【得捷电子Follow me第1期】任务4:GPS获取具体位置
[复制链接]
这次PICO使用的GPS模块是Air530,通过串口与pico w进行通信,上电后就能开始定位,但是必须要放在户外或者窗边才可以接收到卫星的信号,才能进行定位。
在PICO上通过串口读取GPS的数据,但是GPS数据很多,而且有一定的数据格式,需要进行解码。这就需要使用一个micropyGPS的库文件进行解码。
解码出来的数据就是你的坐标。再打印或者显示出来就可以了。
代码如下:
from machine import Pin
import time
from micropyGPS import MicropyGPS
from machine import UART
com = UART(0,baudrate=9600, tx=Pin(0), rx=Pin(1))
my_gps = MicropyGPS(8)
my_gps.local_offset
def get_GPS_values():
global gps_values,rtc
time.sleep_ms(800)
cc = com.readline()
for x in cc:
my_gps.update(chr(x))
gps_values = str(my_gps.latitude[0] + (my_gps.latitude[1] / 60)) + ',' + str(my_gps.longitude[0] + (my_gps.longitude[1] / 60))
date = my_gps.date
timestamp = my_gps.timestamp
hour = timestamp[0]
rtc = str(int(timestamp[0]))+":"+str(int(timestamp[1]))+":"+str(int(timestamp[2]))
return gps_values,rtc
while True:
get_GPS_values()
time.sleep(1)
print("sta:" + str(my_gps.satellites_in_use))
print(gps_values)
print("rtc:" + str(rtc))
运行后根据打印的数据
可以在网页上查找到你的具体定位位置,
最后上一个带OLED显示的视频和带速度的程序
from machine import UART, Pin
import time
import hashlib
from MicropyGPS import MicropyGPS
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import framebuf
WIDTH = 128
HEIGHT = 64
i2c = I2C(1)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
time.sleep(0.1)
rxData = bytes()
my_gps = MicropyGPS(8)
while True:
if uart0.any():
stat = my_gps.update(uart0.read(1).decode('ascii')) # Note the conversion to to chr, UART outputs ints normally
if stat:
oled.fill(0)
lat_disp = my_gps.latitude_string()
oled.text(lat_disp,5,10)
lon_disp = my_gps.longitude_string()
oled.text(lon_disp,5,30)
time_disp = my_gps.date_string('s_dmy')
oled.text(time_disp,5,50)
oled.show()
print('Latitude:', my_gps.latitude_string())
print('Longitude:', my_gps.longitude_string())
print('Speed:', my_gps.speed_string('kph'), 'or', my_gps.speed_string('mph'), 'or', my_gps.speed_string('knot'))
print('Date (Long Format):', my_gps.date_string('long'))
print('Date (Short D/M/Y Format):', my_gps.date_string('s_dmy'))
print('timestamp (Short [H,M,S] Format):', my_gps.timestamp)
stat = None
实验四
后记:
OLED显示°,属于特殊字符,在OLED实现显示上如果要正确显示必须要加载一个显示的文字库,由于这次没做文字库,所以无法显示中文和°的字符。显示出来乱码。后续有机会再做一个字库一起尝试显示汉字和字符。
|