13. 卫星定位导航模块

GPS/北斗双模定位导航模块,可用于导航,定位,授时等。

通信接口UART,默认波特率:9600,数据位8,停止位1。数据格式为 NEMA0183 标准,输出频率为1Hz。板载指示灯在定位成功时闪烁。

定位精度10m,首次定位时间大于32秒。

13.1. 应用编程接口说明

'''
 导入 bds 模块
'''
from openaie import bds

'''
 类:gps
 参数:
    port: 端口号 -- 1或7
'''
class bds(port)

'''
 方法:更新数据
'''
bds.update()

'''
 变量:可见卫星数
'''
bds.satellites_in_view

'''
 变量:使用卫星数
'''
bds.satellites_in_use

'''
 变量:经度(字符串)
'''
bds.longitude_string

'''
 变量:纬度(字符串)
'''
bds.latitude_string

'''
 变量:经度(浮点数)
'''
bds.longitude[0]

'''
 变量:纬度(浮点数)
'''
bds.latitude[0]

'''
 变量:海拔(m)
'''
bds.altitude

'''
 变量:速度(km/h)
'''
bds.speed[2]

'''
 变量:日期(UTC时间,北京时间+8)
    日,月,年
'''
day, month, year = bds.date[:]

'''
 变量:时间戳(UTC时间,北京时间+8)
    时,分,秒
'''
hour, minute, second = bds.timestamp[:]

13.2. 案例

1. 信息读取显示

import lcd, time, math
from openaie import bds


'''
 时区转换
 @dt: 日期时间 格式[year, month, day, hour, minute, second]
 @timezone: 时区 默认为东8区,即北京时间
'''
def datetime(dt, timezone=8):
    year, month, day, hour, minute, second = dt[:]
    month_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if year%4 == 0: # 闰年判断
        month_day[1] = 29
    hour += timezone
    if hour >= 24:
        hour -= 24
        day += 1
        if day > month_day[month-1]:
            day -=  month_day[month-1]
            month += 1
            if month > 12:
                month = 1
                year += 1
    date_string = "%04d/%02d/%02d"%(year, month, day)
    time_string = "%02d:%02d:%02d "%(hour, minute, second)
    #print(date_string, ' ', time_string)
    return [year, month, day, hour, minute, second]



# 显示屏设置
lcd.set_backlight(50)
lcd.rotation(0)

my_gps = bds(1)

deadline = 0
while True:
    my_gps.update()
    if time.ticks_diff(deadline, time.ticks_ms()) < 0:
        deadline = time.ticks_add(time.ticks_ms(), 500)  # 显示刷新间隔 500ms

        lcd.clear(color=(0,0,0))
        lcd.draw_string(72, 5, '卫星定位授时', fc=(0,0,255), bc=(0,0,0))
        # 显示日期时间
        day, month, year = my_gps.date[:] # 获取日期(UTC)
        hour, minute, second = my_gps.timestamp[:] # 获取时间(UTC)
        year, month, day, hour, minute, second = datetime([year+2000, month, day, hour, minute, second])[:] # 时区转换
        date_string = "%04d/%02d/%02d"%(year, month, day)
        lcd.draw_string(10, 40, date_string, fc=(0,0,255), bc=(0,0,0))
        time_string = "%02d:%02d:%02d "%(hour, minute, second)
        lcd.draw_string(110, 40, time_string, fc=(0,0,255), bc=(0,0,0))
        # 卫星信息
        lcd.draw_string(10, 75, '可见卫星: %s 颗'%my_gps.satellites_in_view, fc=(0,0,255), bc=(0,0,0))
        lcd.draw_string(10, 95, '使用卫星: %s 颗'%my_gps.satellites_in_use, fc=(0,0,255), bc=(0,0,0))
        # 位置
        longitude = my_gps.longitude[0]
        latitude = my_gps.latitude[0]
        lcd.draw_string(10, 115, '经度: %s'%longitude, fc=(0,0,255), bc=(0,0,0))
        lcd.draw_string(10, 135, '纬度: %s'%latitude, fc=(0,0,255), bc=(0,0,0))
        lcd.draw_string(10, 155, '海拔: %d m'%my_gps.altitude, fc=(0,0,255), bc=(0,0,0))
        lcd.draw_string(10, 175  , '速度: %.2f km/h'%my_gps.speed[2], fc=(0,0,255), bc=(0,0,0))

        lcd.display()