Arduino 通过OLED显示GPS接收信息(补充)

  • 内容
  • 广告
  • 相关

在上篇文章 Arduino 通过OLED显示GPS接收信息 中,我们基于Arduino平台使用U8x8库实现了对SSD1306 12684液晶屏的驱动,并实时显示GPS信息。在代码中细心地 Akul 发现时间大于24点时,显示为24:XX分,甚至25:XX分,所以本文首先对原代码作一些修补。

GPS接收UTC时间的补充

Arduino 通过OLED显示GPS接收信息 文中代码部分有下面的代码:

int hour = fix.dateTime.hours + 8;//根据时区设置

其目的是将GPS接收到的定位点的UTC时间进行解码, 代码解析出小时后根据定位点的时区对时间进行修正,使之显示为定位点的实际时间,因为中国在国际时区中位于东8区,因此小时数+8.

国际时区
国际时区

实际测试中发现,当实际时间大于等于24时,显示为24:XX、25:XX到31:XX,直到UTC时间回零才能显示正常时间。分析代码后发现,该问题是由于简单的用UTC时间+8导致,由于出现该问题都是在定位点0点~凌晨07点,所以前期居然没能发现,再次感谢细心地 Akul 。

解决思路:在代码中加入一段判断,当定位点时间大于等于24时,小时减掉24,这样就能得到真实的定位点时间了。加入代码如下:

    ...................  
    int hour = fix.dateTime.hours + 8;//根据时区设置
    int minute = fix.dateTime.minutes;

    if ( hour >= 24) {
      hour = hour -24;
      }
    ...................

经过调整,时间能正常显示了,待运行一段时间看是否还有其它问题。

GNRMC格式解析

GPS模块接收标准信号协议中GNRMC格式如下:

$GNRMC,084852.000,A,2236.9453,N,11408.4790,E,0.53,292.44,200310,,,A*7
 5 

其中:
084852.000,代表UTC时间,格式为hhmmss.sss(时分秒.毫秒)
A,代表定位状态,A指有效定位,V指无效定位
2236.9453,N, 代表定位点的纬度
11408.4790,E, 代表定位点的经度
0.53, 代表地面速率
292.44, 代表地面航向
200310, 代表UTC日期
, ,磁偏角,范围:000-180
, ,磁偏角方向,E东,W西
A*75 代表模式指示