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

通过 GPS 设置 DS3231

组件和用品

Arduino Nano R3
× 1
DS3231 时钟模块
× 1
NEO 6M GPS 模块
× 1
BI 方向电平转换
× 1
LCD 16*2 DISPLAY
× 1
I2C LCD 背包
× 1
15 路 0.1 英寸插座
× 2
6路0.1英寸插座
× 2
4路0.1英寸插座
× 1
5 路 0.1 英寸插座
× 1
4 路 0.1 英寸针脚带
× 1
条形板 24 条 * 37 列
× 1
4K7 电阻
× 2
按钮(单极瞬时 6m 平方)
× 1

关于这个项目

我的 DS3231 漂移,我正在通过使用系统时间编译一些代码来更新它,但事实证明这有点不准确,因为编译和上传不断被我计算机上发生的其他进程中断。

在我发现 GPS 给出准确的时间 (UTC) 和日期后,我决定用它来设置我的 DS3231。

电路:

Arduino 的 LCD 背包:

地-地

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

DS3231 时钟模块到 Arduino:

地-地

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

来自 Arduino 的电平转换器:

5V - 5V

地-地

D3 - 巴士

D4 - 巴士

来自电平转换器的 NEO 6M GPS:

3V - VCC

地-地

BUS - TXD(在 D3 结束)

BUS - RXD(在 D4 结束)

开关触点:

开关 - D9

开关 - 地

力量:

我通过 USB 电缆为我的电路供电。

软件:

该软件的 99% 是 Adafruit GPS 库中的 parsing.ino 示例。我添加了少量代码以将提取的 GPS 日期和时间传递给 DS3231,并添加了一些附加代码以在 LCD 显示屏上显示 DS3231 的时间。

图书馆的使用:

Adafruit GPSLibrary by Adafruit 1.0.3 版

RTCLib by Adafruit 1.2.0 版

用于I2C显示背包的新LiquidCrystal。

操作:

打开设备。

LCD 将显示 DS3231 寄存器中当前的日期和时间值。

等待 GPS 锁定。

按下按钮可通过 GPS 信号设置时间。

LCD将显示新的时间。

操作限制:

GPS单元确实需要时间锁定,并且没有锁定已完成的指示。在没有锁定的情况下按下设置按钮导致我的DS3231日期设置为2000:0:0,时间设置为0:0:0。

GPS 装置上的红色 LED 开始闪烁后似乎是按下设置按钮的最佳时间——这可能是 10 分钟(室内)。

最初我使用的 DS3231 单元有一块没电的电池,按下设置日期设置为 2000:0:0,时间设置为 0:164:164。电池需要很长时间才能获得足够的电量以接受 GPS 数据并继续自行正确滴答。

GPS 怪癖:

我买的那块板子简单的写着NEO 6M GPS,并且在连接插脚上标明了它们的功能。我查看了设备 [1] 的数据表,说明该设备的工作电压约为 3V,因此我使用了电平转换器。然而,经过仔细检查,我发现一个 4A2D 芯片焊接到板上,互联网搜索显示它是一个电压调节器,但这并不能保证通信线路是电平转换的(我的设备没有电路图)。

我还在网上看到,不同的 GPS 模块在室内接收良好信号的能力不同,因此我添加了一个 LCD 显示屏,以便我可以将其带到室外。

LCD 怪癖:

我正在使用其中一个 I2C 地址为 0x3F 的奇怪地址,大多数使用地址 0x27,因此如果您看不到任何内容,请先尝试更改它。

图书馆怪癖:

libraryRTCLib(Adafruit 1.2.0 版)设置时间和日期寄存器,但不设置 DS3231 的日期寄存器。该库有一个函数来返回使用日期寄存器中的值动态计算的星期几。

我觉得这很奇怪,但最终意识到这是有道理的,设置日期寄存器需要设置您的代码以在闰年更改它,而通过公式生成日期可以避免这种情况。

UTC 和当地时间:

我在 UTC 上进行了搜索,发现我的本地时间不需要更改,因此如果您需要它,则必须自己添加那段代码。

参考文献:

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(检索/Dec/2018)

代码

  • 设置 DS3231 代码文件
设置 DS3231 代码文件Arduino
// 日期和时间函数使用通过 I2C 和线连接的 DS3231 RTC lib#include #include "RTClib.h"//Aadafruit 1.2.0 版在我的机器上RTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};const int days_string_length =12;//时钟结束//用于液晶显示器display//#include //has already been included (above) // 在此处获取 LCD I2C 库:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include //注意 0x3F 的异常地址,大多数 lcd 的使用地址 0x27 所以如果你看不到任何东西,请尝试更改 firstLiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //设置LCD I2C地址//液晶显示器的结束//按钮#定义按钮9//使用MTK3329/MTK3339驱动程序的Adafruit GPS模块测试代码////此代码显示了如何监听GPS模块一个中断//它允许程序有更多的“自由”——只需解析//当一个新的NMEA语句可用时!然后在// 需要时访问数据。//// 使用 MTK33x9 芯片组测试并与 Adafruit Ultimate GPS 模块完美配合// ------> http://www.adafruit.com/products/746/ / 今天在 Adafruit 电子商店选购一款 // 并帮助支持开源硬件和软件! -ada#include #include // 如果您使用 GPS 模块:// 将 GPS 电源引脚连接到 5V // 将 GPS 接地引脚连接到地// 如果使用软件串行(默认草图示例):// 将 GPS TX(传输)引脚连接到数字 3// 将 GPS RX(接收)引脚连接到数字 2// 如果使用硬件串行(例如 Arduino Mega):// 连接 GPS TX(发送)引脚连接到 Arduino RX1、RX2 或 RX3// 将 GPS RX(接收)引脚连接到匹配的 TX1、TX2 或 TX3 // 如果您使用 Adafruit GPS 屏蔽,请更改 // SoftwareSerial mySerial(3, 2) ); -> SoftwareSerial mySerial(8, 7);// 并确保开关设置为 SoftSerial// 如果使用软件串行,请启用此线//(您可以更改引脚编号以匹配您的接线):SoftwareSerial mySerial( 3, 2);//如果使用硬件串行(例如Arduino Mega),注释掉//上面的SoftwareSerial行,并启用该行//(您可以更改序列号以匹配您的接线)://HardwareSerial mySerial =Serial1;Adafruit_GPS GPS(&mySerial);// 将 GPSECHO 设置为“false”以关闭将 GPS 数据回显到串行控制台// 如果您想调试和收听原始 GPS 语句,请设置为“true”。 #define GPSECHO false //--------->关闭//这会跟踪我们是否使用中断//默认情况下关闭!boolean usingInterrupt =false;void useInterrupt(boolean); // Func 原型保持 Arduino 0023 happyvoid setup() { // 在 115200 连接,因此我们可以足够快地读取 GPS 并回显而不丢失字符 // 也将其吐出 Serial.begin(115200); Serial.println("Adafruit GPS 库基础测试!"); // 9600 NMEA 是 Adafruit MTK GPS 的默认波特率 - 有些使用 4800 GPS.begin(9600); // 取消注释此行以打开 RMC(推荐最小值)和 GGA(固定数据),包括高度 GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // 取消注释此行以仅打开“最小推荐”数据 //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // 对于解析数据,我们不建议只使用 RMC 或 RMC+GGA 因为 // 解析器此时不关心其他句子 // 设置更新速率 GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz 更新率 // 为了使解析代码正常工作并有时间对数据进行排序,并且 // 将其打印出来,我们不建议使用高于 1 Hz 的任何内容 // 请求更新天线状态,注释保持安静 GPS.sendCommand(PGCMD_ANTENNA); // 这段代码的好处是你可以每 1 毫秒触发一次 timer0 中断,并为你从 GPS 读取数据。这使 // 循环代码变得容易多了!使用中断(真);延迟(1000); // 询问固件版本 mySerial.println(PMTK_Q_RELEASE); //启动液晶液晶显示器.begin(16,2);液晶背光();液晶显示器(); //设置按钮 pinMode(button,INPUT_PULLUP); }// 中断每毫秒调用一次,查找任何新的 GPS 数据并存储它SIGNAL(TIMER0_COMPA_vect) { char c =GPS.read(); // 如果你想调试,这是一个很好的时机!#ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // 直接写入 UDR0 比 Serial.print 快得多 // 但一次只能写入一个字符。 #endif}void useInterrupt(boolean v) { if (v) { // Timer0 已经用于millis() - 我们只是在中间的某个地方中断 // 并调用 OCR0A =0xAF 上方的“比较 A”函数; TIMSK0 |=_BV(OCIE0A); usingInterrupt =true; } else { // 不再调用中断函数COMPA TIMSK0 &=~_BV(OCIE0A); usingInterrupt =false; }}uint32_t timer =millis();void loop() // 一遍又一遍{ // 如果您没有使用上面的中断,您将 // 需要“手动查询” GPS,不建议: ( if (!usingInterrupt) { // 在“主循环”中从 GPS 读取数据 char c =GPS.read(); // 如果你想调试,这是一个很好的时机! if (GPSECHO) if (c) Serial.print(c); } // 如果收到一个句子,我们可以检查校验和,解析它... if (GPS.newNMEAreceived()) { // 这里有一个棘手的事情是如果我们打印NMEA 句子或数据 // 我们最终不会听和捕捉其他句子! // 所以如果使用 OUTPUT_ALLDATA 和 trytng 打印出数据要非常小心 //Serial.println(GPS.lastNMEA()); // 这也是将 newNMEAreceived() 标志设置为 false if (!GPS.parse(GPS.lastNMEA())) // 这也将 newNMEAreceived() 标志设置为 false return; // 我们可能无法解析句子,在这种情况下我们应该等待另一个 } // 如果 millis() 或 timer 环绕,我们将重置它 if (timer> millis())计时器 =毫秒();静态布尔值 second_time_round=false; // 大约每 2 秒左右,打印出当前的统计信息 //if (millis() - timer> 2000) { // timer =millis(); // 重置定时器 //如果按下按钮,则将数据写入时钟 - 按钮通常由内部上拉保持高电平 if(!digitalRead(button)){//注意:RTClib 没有明确设置 DS3231 上的星期几寄存器。//相反,当您使用 dayOfTheWeek() 时,天是通过基于日期的公式计算的。 //星期日被取为零。//(基于我对库头文件和ccp文件的阅读)//set rtc RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds)); //lcd lcd.clear(); lcd.setCursor(2,0); lcd.print("按下设置");延迟(5000);液晶显示器();现在日期时间 =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.setCursor(4,1); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print(" ");}

示意图


制造工艺

  1. 什么是紧定螺钉?
  2. 维恩图和集
  3. Java 集接口
  4. 留下永恒的遗产
  5. SMRP 发布一组 M&R 指标定义
  6. Java 10 - 环境设置
  7. 什么是三边形?
  8. 表面研磨老式方法
  9. 最佳选择:Box Way CNC 车床
  10. 什么是打孔套装?
  11. 什么是直线导轨数控车床?
  12. 了解机械工具集