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

Arduino Nano 实现 DS3231 RTC 与 GPS 同步精准计时

元器件与材料

项目简介

我的 DS3231 有走时偏差,原用电脑编译上传时间校准,但编译上传过程常被打断导致不准。发现 GPS 输出精准 UTC 时间后,决定用 GPS 对 DS3231 校时。

电路连接

LCD 适配板 → Arduino

DS3231 → Arduino (共用 I2C 总线)

电平转换 → Arduino

NEO-6M GPS → 电平转换

按键

供电

通过 USB 线供电。

软件架构

99% 代码基于 Adafruit GPS 库的 parsing.ino 示例,仅添加将解析出的 GPS 日期时间写入 DS3231、并在 LCD 显示 DS3231 时间的代码。

使用库

操作流程

  1. 上电,LCD 显示 DS3231 当前时间
  2. 等待 GPS 定位 (红灯闪烁为佳,室内可能需 10+ 分钟)
  3. 按下按钮,通过 GPS 信号校时
  4. LCD 显示新时间

局限与注意事项

参考资料

[1] NEO-6 数据手册: u-blox.com

代码

// DS3231 + GPS 校时 + LCD 显示
#include 
#include "RTClib.h"
RTC_DS3231 RTC;
char daysOfTheWeek[7][12] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

#include 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 地址 0x3F

#define button 9

#include 
#include 
SoftwareSerial mySerial(3, 2); // RX, TX
Adafruit_GPS GPS(&mySerial);
#define GPSECHO false
boolean usingInterrupt = false;
void useInterrupt(boolean);

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  GPS.sendCommand(PGCMD_ANTENNA);
  useInterrupt(true);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);

  lcd.begin(16,2); lcd.backlight(); lcd.clear();
  pinMode(button, INPUT_PULLUP);
}

SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
  #ifdef UDR0
  if (GPSECHO && c) UDR0 = c;
  #endif
}

void useInterrupt(boolean v) {
  if (v) {
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

uint32_t timer = millis();
void loop() {
  if (!usingInterrupt) {
    char c = GPS.read();
    if (GPSECHO && c) Serial.print(c);
  }
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  if (timer > millis()) timer = millis();

  // 按钮按下校时
  if (!digitalRead(button)) {
    RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds));
    lcd.clear(); lcd.setCursor(2,0); lcd.print("Pressed set");
    delay(5000); lcd.clear();
  }

  DateTime now = RTC.now();
  lcd.setCursor(4,0);
  lcd.print(now.year(), DEC); lcd.print('/');
  lcd.print(now.month(), DEC); lcd.print('/');
  lcd.print(now.day(), DEC); lcd.print(' ');
  lcd.setCursor(4,1);
  lcd.print(now.hour(), DEC); lcd.print(':');
  lcd.print(now.minute(), DEC); lcd.print(':');
  lcd.print(now.second(), DEC); lcd.print(" ");
}

原理图

Arduino Nano 实现 DS3231 RTC 与 GPS 同步精准计时
Arduino Nano 实现 DS3231 RTC 与 GPS 同步精准计时

制造工艺

  1. 留下持久遗产:为更美好未来的真实领导力
  2. SMRP 发布维护与可靠性专业人员标准化 KPI 体系
  3. 平面磨削:精密加工的传统技艺
  4. 为何箱型导轨CNC车床是精密高性能的最优选择
  5. 冲头套装全解析:专业选购与应用指南
  6. 线轨 CNC 车床:轻量高速精密加工的首选
  7. 机械师工具套装选购全攻略:从入门到专业级配置
  8. 理解韦恩图:可视化集合关系
  9. 无头螺丝(定位螺丝)详解:设计差异与应用场景
  10. 三角板详解:技术制图中预设角度的绘图利器
  11. 精通 Java Set 接口:概念、方法与实战示例
  12. Java 10 开发环境搭建:构建、编译与运行完全指南