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

基于 GPS 的廉价而准确的时钟

组件和用品

Arduino UNO
× 1
Adafruit RGB 背光 LCD - 16x2
在我的例子中是一个 nobrand LCD 20x4 Display mit I2C 适配器,便于连接
× 1
面包板(通用)
× 1
跳线(通用)
× 1
GPS 接收器(通用)
GY-GPS6Mv2 与 ublox NEO-6M
× 1

应用和在线服务

Arduino IDE

关于这个项目


到目前为止,我已经将各种 RTC 时钟用于时钟项目或从 NTP 服务器获取时间。在这个项目中,我向您展示了另一个来源:从全球 GPS 卫星的 NMEA 字符串中解析。

我很惊讶今天 GPS 接收器的便宜:买一个(在我的例子中使用的是 GY-GPS6Mv2)。

a.) 在 Windows PC 上进行第一个(可选)测试:从 U-Blox 下载安装“u-center”。

在 FTDI 适配器的帮助下,GPS 分线会找到通往您 PC 的 COM 端口的路径,并在大约 1 分钟后显示到轨道的固定(连接)。为此,突破口上的红色控制灯闪烁。

自动生成的图形让您想尝试更多的 GPS。使用 F8 - 视图菜单中的文本控制台,您可以获得各种 NMEA 字符串。

b.) 您可以对免费在线服务进行解码测试:https://rl.se/gprmc

现在已确保您有一个正常运行的 GPS 接收器 - 确保可以看到天空 - 我们可以根据您的意愿从字符串中提取所需的信息。

我们使用了一个 Adafruit 库“Adafruit GPS 库”——如果您已经将它安装在 Arduino IDE 中,您可以通过示例进行一些尝试。

c.) 电路

Arduino A4> 显示 SDA Arduino A5> 显示 SCL

#include #include LiquidCrystal_I2C lcd(0x3F, 20, 4); //设置LCD地址>通常为0x27或0x3F

> 使用放置在周围的显示器,也许是 16x2?

#include #include

将 GPS 电源引脚连接到 5V 将 GPS 接地引脚连接到地将 GPS TX(发送)引脚连接到数字 8将 GPS RX(接收)引脚连接到数字 7//您可以更改引脚编号以匹配您的接线:SoftwareSerial mySerial(8) , 7);Adafruit_GPS GPS(&mySerial);

> GPS 接收器可承受 3.3 / 5V 电压。

d.) 我们的手表应该给出时间、日期、风速指示以及海拔高度。我们不需要位置,因为我的手表会停在窗口。

NMEA 字符串提供 UTC 标准中的时间。转换为本地时区取决于我们。只要没有人提出更好的建议,我就会为我的时区(欧洲柏林)加 +1。

int timezone =+1; // 欧洲/柏林 (UTC +0100)> NMEA 是面向 UTC 的 

根据您的喜好调整时区。然后在 LCD 显示器上的输出代码中使用变量小时,而不是 GPS.hour - UTC 值。

//输出到液晶显示器
lcd.setCursor(5,0); // ,0 =第一行
int hour =(GPS.hour) + timezone; // 将 GPS.hour UTC 格式化为您的个人时区
if (hour <10) { lcd.print('0'); }
lcd.print(hour, DEC); lcd.print(':');

在欧洲,我们使用“km/h”而不是节来表示风速。因此,我首先使用常数将值从节转换为公里/小时,然后将其分组。> 1 节 =1.852 公里每小时

float speed =(GPS.speed) * 1.852; // 从速度/节> 速度/公里/小时切换 

根据维基百科评价:

if (speed <=1) {lcd.print(" Windstille");}
else if ((speed> 1) &&(speed <=9)) {lcd.print(" leiser Zug");}
else if ((speed> 9) &&(speed <=46)) {lcd.print(" Brise");}
else if ((speed> 46) &&(speed <=56)) {lcd.print("starker Wind");}
else if ((speed> 56) &&(speed <=74)) {lcd.print(" stuerm. Wind");}
else if ((speed> 74) &&(speed <=83)) {lcd.print(" Sturm");}
else if ((speed> 83) &&(speed <=102)) {lcd.print(" schwerer Sturm");}
else if (speed> 102) {lcd.print(" Orkan");}
else {lcd.print(" ohne Bewertung ");}

结果如下显示在显示屏上,当然可以根据您自己的意愿进行调整:

我在循环中将更新频率保持在 2 秒。我什至倾向于放弃秒和高度,转而支持 16x2 显示。

尽情探索各种 GPS 选项!

在欧洲,我们还评估了可用的 DCF77 无线电信号。然而,这明显要贵得多,而且据说它的处理非常敏感。

代码

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_iloC/C++
Adafruits Example 稍作调整
// Adafruit GPS 模块使用MTK3329/MTK3339 驱动的测试代码//// 这段代码展示了如何在中断中监听GPS 模块// 让程序有更多的“自由” - 当新的 NMEA 句子可用时,只需解析//!然后在// 需要时访问数据。//// 使用 MTK33x9 芯片组测试并与 Adafruit Ultimate GPS 模块完美配合// ------> http://www.adafruit.com/products/746/ / 今天在 Adafruit 电子商店选购一款 // 并帮助支持开源硬件和软件! -ada// 修改 01.02.2020 - Ingo Lohs// GPRMC &GPGGA 解码器:https://rl.se/gprmc#include  #include LiquidCrystal_I2C lcd(0x3F,20,4); // 将 LCD 地址设置为 0x27,用于 16 个字符和 2 行显示> 0x3F 在我的情况下用于 2004 液晶显示器#include #include // 将 GPS 电源引脚连接到 5V/ / 将 GPS 接地引脚接地// 将 GPS TX(发射)引脚连接到数字 8 // 将 GPS RX(接收)引脚连接到数字 7 // 您可以更改引脚编号以匹配您的接线:SoftwareSerial mySerial( 8, 7);Adafruit_GPS GPS(&mySerial);// 将 GPSECHO 设置为“false”以关闭将 GPS 数据回显到串行控制台// 如果您想调试和收听原始 GPS 语句,请设置为“true”#定义 GPSECHO trueint timezone =+1; // 欧洲/柏林 (UTC +0100)> NMEA 是面向 UTC 的 void setup(){ lcd.init();液晶背光(); // 在 115200 连接,这样我们就可以足够快地读取 GPS 并回显而不丢失字符 // 也将其吐出 Serial.begin(115200);延迟(5000); Serial.println("Adafruit GPS 库基础测试!"); // 9600 NMEA 是 Adafruit MTK GPS 的默认波特率 - 有些使用 4800 GPS.begin(9600); //> 在我的情况下,我使用 UBLOX 6M:GY-GPS6Mv2 // 取消注释此行以打开 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);延迟(1000); // 询问固件版本 mySerial.println(PMTK_Q_RELEASE);}uint32_t timer =millis();void loop() // 一遍又一遍地运行{ char c =GPS.read(); // 如果你想调试,这是一个很好的时机! if ((c) &&(GPSECHO)) Serial.write(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()) timer =millis(); // 大约每 2 秒左右,打印出当前的统计信息 if (millis() - timer> 2000) { timer =millis(); // 重置定时器 Serial.print("\nTime:"); if (GPS.hour <10) { Serial.print('0'); Serial.print(GPS.hour, DEC); Serial.print(':'); if (GPS.minute <10) { Serial.print('0'); Serial.print(GPS.minute, DEC); Serial.print(':'); if (GPS.seconds <10) { Serial.print('0'); Serial.print(GPS.seconds, DEC); Serial.print('.'); if (GPS.milliseconds <10) { Serial.print("00"); } else if (GPS.milliseconds> 9 &&GPS.milliseconds <100) { Serial.print("0"); Serial.println(GPS.milliseconds); Serial.print("日期:"); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.month, DEC); Serial.print("/20"); Serial.println(GPS.year, DEC); Serial.print("修复:"); Serial.print((int)GPS.fix); Serial.print(" 质量:"); Serial.println((int)GPS.fixquality); // 输出到 LCD 显示器 lcd.setCursor(5,0); // ,0 =第一行 int hour =(GPS.hour) + timezone; // 将 GPS.hour UTC 格式化为您的个人时区 if (hour <10) { lcd.print('0'); } lcd.print(hour, DEC); lcd.print(':'); if (GPS.minute <10) { lcd.print('0'); } lcd.print(GPS.minute, DEC); lcd.print(':');如果 (GPS.seconds <10) { lcd.print('0'); } lcd.print(GPS.seconds, DEC); // 输出到液晶显示器 lcd.setCursor(5,1); // ,0 =第二行 if (GPS.day <10) { lcd.print('0'); } lcd.print(GPS.day, DEC); lcd.print('.');如果 (GPS.month <10) { lcd.print('0'); } lcd.print(GPS.month, DEC); lcd.print('.'); lcd.print(GPS.year, DEC); if (GPS.fix) { // 我们有卫星连接吗?如果是,我们有更多的值: Serial.print("Location:"); Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); Serial.print(", "); Serial.print(GPS.longitude, 4); Serial.println(GPS.lon); Serial.print("速度(节):"); Serial.println(GPS.speed); Serial.print("角度:"); Serial.println(GPS.angle); Serial.print("海拔高度:"); Serial.println(GPS.altitude); Serial.print("卫星:"); Serial.println((int)GPS.satellites); lcd.setCursor(0,2); // ,2 =第三行 // 1 Knoten =1,852 公里每小时浮点速度 =(GPS.speed) * 1.852; // 从 Speed/Knoten> Speed/km/h 切换 //lcd.print("Speed km/h:");液晶打印(速度); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit /* Beschreibung - Geschwindigkeit in km/h * Windstille - 0-1 * leiser Zug - 2-9 * leichte Brise - 10-19 * schwache Brise - 20-28 * mäßige Brise - 29-37 * frische Brise - 38-46 * starker Wind - 47-56 * stürmischer Wind - 57-74 * Sturm - 75-83 * schwerer Sturm - 84-102 * Orkan -> 103 */ if (speed <=1) {lcd.print(" Windstille");} else if ((speed> 1) &&(speed <=9)) {lcd.print(" leiser Zug");} else if ((speed> 9) &&(speed <=46)) {lcd.print(" Brise");} else if ((speed> 46) &&(speed <=56)) {lcd.print(" starker Wind ");} else if ((speed> 56) &&(speed <=74)) {lcd.print(" stuerm. Wind");} else if ((speed> 74) &&(speed <=83)) { lcd.print(" Sturm");} else if ((speed> 83) &&(speed <=102)) {lcd.print(" schwerer Sturm");} else if (speed> 102) {lcd.print( " Orkan");} else {lcd.print("ohne Bewertung");} lcd.setCursor(0,3); // ,3 =第四行 lcd.print("Hoehe:"); lcd.print(GPS.altitude); } }}

制造工艺

  1. DIY 廉价手套控制器和螺旋桨车
  2. 带 LED 和压电扬声器的 DHT11 传感器
  3. GPS 数据记录器、空间分析和 Azure IoT 中心。
  4. 温湿度数据记录仪
  5. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  6. 模拟式 LED POV 时钟
  7. 生日快乐:灯光和声音
  8. u-blox LEA-6H 02 GPS 模块,带有 Arduino 和 Python
  9. 基于 Arduino 和 OLED 的元胞自动机
  10. 基于 Arduino 的 RPM 计数器,采用更快的新算法
  11. eDOT - 基于 Arduino 的精密时钟和气象站
  12. 吉他快速拨片和踩踏踏板!