在 Arduino 中解析 Adafruit Ultimate GPS
Parsing Adafruit Ultimate GPS in Arduino
我是 Arduino 编程的新手,我有一个很大的问题,那就是保存我的新 Adafruit Ultimate GPS Breakout 的经度和纬度值。我正在使用网站上提供的教程然后我尝试在库中应用解析代码
打开文件→示例→Adafruit_GPS→解析草图并将其上传到Arduino。然后打开串行监视器。
我在我的串行监视器中得到了附件中显示的结果(我在下面的快照中突出显示了我的问题)
我正在尝试将我的位置值保存在串行监视器中显示的度数中
位置(以度为单位,适用于 Google 地图):32.5011、44.4499
显示结果的部分标准代码为:
Serial.print("\nTime: ");
Serial.print(GPS.hour, DEC); Serial.print(':');
Serial.print(GPS.minute, DEC); Serial.print(':');
Serial.print(GPS.seconds, DEC); Serial.print('.');
Serial.println(GPS.milliseconds);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
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("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
结果如下图
接下来,我尝试定义 2 个变量,以便通过在 Serial.println(GPS.longitudeDegrees, 4) 之后添加简单代码来复制经度和纬度值;如下图
Serial.print("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
lat1= (GPS.latitudeDegrees, 4);
lon1=(GPS.longitudeDegrees, 4);
Serial.println (lat1);
Serial.println (lon1);
delay (500);
然后我在串行监视器中的 lat1 和 lon1 值中只有数字 4
然后我通过从代码中删除数字 4 来编辑代码,如下所示
Serial.print("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
lat1= GPS.latitudeDegrees;
lon1=GPS.longitudeDegrees;
Serial.println (lat1);
Serial.println (lon1);
delay (500);
然后我只得到点后的2个数字
32.5011 → 32.50
44.4499 → 44.45
如下附件所示
所以我问我如何将完整的数字保存在我的 lon1 和 lat1 中,因为我需要这些数字进行进一步分析
顺便说一句,我试图将 lon1、lat1 定义为 float、double 并且仍然是同样的问题,我得到的数字后只有 2 个数字
谢谢大家
浮点数有无限多的小数位。当您打印它们时,除非您使用第二个参数指定要打印的数量,否则它只会打印 2。
例如:
float x = 67.1234
Serial.print(x); // will print 67.12
Serial.print(x,3); // will print 67.123
Serial.print(x, 4); // will print 67.1234
Serial.print(x,6); // will print 67.123400
所以你看到的就是你告诉它打印多少地方。但是变量总是有无限小数位的整数。
现在 Arduino 上的浮点数只有前 6 或 7 位小数是准确的。但是如果你想打印它们,数字本身在小数点后有无限多位数字。
另请注意,第二个参数仅在打印语句中执行某些操作。很多人会尝试这样做:
float x = 67.1234 , 2;
认为这会以某种方式保存一个只有 2 位精度的数字,但事实并非如此。在这种情况下,它只会保存数字 2。正如您在实验中看到的那样。这就是逗号运算符的工作原理。您只能在打印功能中指定。同样,实际数字本身有无限多的小数位,您可以打印。
我是 Arduino 编程的新手,我有一个很大的问题,那就是保存我的新 Adafruit Ultimate GPS Breakout 的经度和纬度值。我正在使用网站上提供的教程然后我尝试在库中应用解析代码 打开文件→示例→Adafruit_GPS→解析草图并将其上传到Arduino。然后打开串行监视器。 我在我的串行监视器中得到了附件中显示的结果(我在下面的快照中突出显示了我的问题)
我正在尝试将我的位置值保存在串行监视器中显示的度数中 位置(以度为单位,适用于 Google 地图):32.5011、44.4499
显示结果的部分标准代码为:
Serial.print("\nTime: ");
Serial.print(GPS.hour, DEC); Serial.print(':');
Serial.print(GPS.minute, DEC); Serial.print(':');
Serial.print(GPS.seconds, DEC); Serial.print('.');
Serial.println(GPS.milliseconds);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
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("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
结果如下图
Serial.print("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
lat1= (GPS.latitudeDegrees, 4);
lon1=(GPS.longitudeDegrees, 4);
Serial.println (lat1);
Serial.println (lon1);
delay (500);
然后我在串行监视器中的 lat1 和 lon1 值中只有数字 4
然后我通过从代码中删除数字 4 来编辑代码,如下所示
Serial.print("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
lat1= GPS.latitudeDegrees;
lon1=GPS.longitudeDegrees;
Serial.println (lat1);
Serial.println (lon1);
delay (500);
然后我只得到点后的2个数字
32.5011 → 32.50
44.4499 → 44.45
如下附件所示
浮点数有无限多的小数位。当您打印它们时,除非您使用第二个参数指定要打印的数量,否则它只会打印 2。
例如:
float x = 67.1234
Serial.print(x); // will print 67.12
Serial.print(x,3); // will print 67.123
Serial.print(x, 4); // will print 67.1234
Serial.print(x,6); // will print 67.123400
所以你看到的就是你告诉它打印多少地方。但是变量总是有无限小数位的整数。
现在 Arduino 上的浮点数只有前 6 或 7 位小数是准确的。但是如果你想打印它们,数字本身在小数点后有无限多位数字。
另请注意,第二个参数仅在打印语句中执行某些操作。很多人会尝试这样做:
float x = 67.1234 , 2;
认为这会以某种方式保存一个只有 2 位精度的数字,但事实并非如此。在这种情况下,它只会保存数字 2。正如您在实验中看到的那样。这就是逗号运算符的工作原理。您只能在打印功能中指定。同样,实际数字本身有无限多的小数位,您可以打印。