亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

GPS 授时时钟:低成本高精度的 Arduino 卫星校时方案

项目简介

摆脱 RTC 模块漂移与 NTP 依赖网络的局限,利用超低成本 GPS 接收模块 (GY-GPS6MV2, u-blox NEO-6M) 解析 NMEA 语句,直接获取 UTC 时间、日期、速度、海拔、卫星数等信息,驱动 I2C LCD 显示,构建一款“永不漂移”的台式/车载时钟。硬件成本极低,代码简洁,适合入门学习 GPS 解析与串口通信。

硬件清单

组件数量备注
Arduino UNO1
GY-GPS6MV2 (u-blox NEO-6M)13.3V/5V 兼容,自带天线
I2C LCD (2004 或 1602)1带 PCF8574 模块,地址 0x27/0x3F
面包板 + 杜邦线1套

接线表

GPS 模块ArduinoLCD (I2C)Arduino
VCC5VVCC5V
GNDGNDGNDGND
TXD8 (SoftwareSerial RX)SDAA4
RXD7 (SoftwareSerial TX)SCLA5

软件库

核心代码逻辑


#include 
#include 
#include 
#include 

LiquidCrystal_I2C lcd(0x3F, 20, 4); // 地址 0x3F 或 0x27
SoftwareSerial mySerial(8, 7);      // RX=8, TX=7
Adafruit_GPS GPS(&mySerial);

int timezone = +1; // 东一区 (北京/柏林),UTC+1,中国为 +8

void setup() {
  lcd.init(); lcd.backlight();
  Serial.begin(115200);
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // 开启 RMC+GGA 语句
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);    // 1Hz 更新率
  GPS.sendCommand(PGCMD_ANTENNA);               // 天线状态
  delay(1000);
}

uint32_t timer = millis();

void loop() {
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  if (millis() - timer > 2000) { // 2秒刷新一次显示
    timer = millis();
    // 串口调试输出
    Serial.print("Time: "); /* 打印 UTC 时间 */
    // LCD 显示本地时间
    lcd.setCursor(5,0);
    int hour = GPS.hour + timezone;
    if (hour >= 24) hour -= 24;
    if (hour < 10) lcd.print('0');
    lcd.print(hour); lcd.print(':');
    if (GPS.minute < 10) lcd.print('0');
    lcd.print(GPS.minute); lcd.print(':');
    if (GPS.seconds < 10) lcd.print('0');
    lcd.print(GPS.seconds);

    // 日期
    lcd.setCursor(5,1);
    if (GPS.day < 10) lcd.print('0');
    lcd.print(GPS.day); lcd.print('.');
    if (GPS.month < 10) lcd.print('0');
    lcd.print(GPS.month); lcd.print('.');
    lcd.print(GPS.year);

    if (GPS.fix) { // 定位成功才显示扩展信息
      // 速度转换:节 → km/h (1 knot = 1.852 km/h)
      float speed_kmh = GPS.speed * 1.852;
      lcd.setCursor(0,2);
      lcd.print(speed_kmh, 1); lcd.print(" km/h ");
      // 风力等级 (复用速度字段演示)
      if (speed_kmh <= 1) lcd.print("Wind calm");
      else if (speed_kmh <= 9) lcd.print("Light air");
      else if (speed_kmh <= 46) lcd.print("Breeze");
      else if (speed_kmh <= 56) lcd.print("Strong wind");
      else if (speed_kmh <= 74) lcd.print("Gale");
      else if (speed_kmh <= 83) lcd.print("Storm");
      else if (speed_kmh <= 102) lcd.print("Heavy storm");
      else lcd.print("Hurricane");

      // 海拔
      lcd.setCursor(0,3);
      lcd.print("Alt: "); lcd.print(GPS.altitude); lcd.print("m");
      // 卫星数
      lcd.print(" Sat:"); lcd.print((int)GPS.satellites);
    }
  }
}

关键技术点解析

NMEA 语句与解析

时区处理

GPS 输出均为 UTC。代码中 timezone 变量按整数小时偏移,中国标准时间 (CST) 为 +8。注意跨日边界处理 (hour ≥ 24 减 24,hour < 0 加 24)。夏令时需自行扩展逻辑。

定位状态判断

速度与海拔单位

实测效果与优化

对比:GPS vs DCF77 vs RTC vs NTP

方案精度成本联网需求室内可用备注
GPS (本项目)~微秒级 (UTC)极低 (~$5)无靠窗可用全球通用、自带日期/海拔/速度
DCF77 (欧波)~毫秒级中等无欧洲限定、易受干扰
DS3231 RTC±2ppm/年 (~1分钟/年)低无是需定期校准、无自动授时
NTP (WiFi/以太网)~毫秒级中 (需模块)是是依赖网络、服务器可达性

扩展项目创意

资源链接

制造工艺

  1. DIY低成本手套控制器与螺旋桨小车:自制Arduino手部控制器
  2. DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
  3. 构建 GPS 数据记录器:结合 Azure IoT Hub 实现空间分析
  4. Arduino + DHT11 + 以太网盾板温湿度数据记录仪
  5. Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
  6. 模拟指针风格 POV 时钟:Arduino Nano + 17 LED + 霍尔传感器
  7. 光影交响:Arduino DIY 生日祝福灯光音乐装置
  8. u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
  9. Arduino Nano 驱动 128x64 OLED 实时运行康威生命游戏 (元胞自动机)
  10. Arduino 高速转速计 - 单次检测算法实测 6.5MHz 级响应,红外 + 红激光方案
  11. eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控
  12. DIY 吉他高速拨片与踏板 - 3D 打印电机驱动拨片制作指南