This repository has been archived by the owner on Jun 14, 2024. It is now read-only.
forked from meltingrabbit/CanSatForHighSchoolStudents
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GPS.cpp
170 lines (139 loc) · 4.28 KB
/
GPS.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "./GPS.h"
Gps_t gps;
SoftwareSerial GpsSerial(PIN_GPS_TX, PIN_GPS_RX);
// 非公開関数
// String GPS_NMEA2DMS_(float val);
// String GPS_NMEA2DM_(float val);
// String GPS_NMEA2DD_(float val);
float GPS_NMEA2DDf_(float val);
// String GPS_UTC2GMT900_(String str);
void GPS_Init() {
GpsSerial.begin(9600);
gps.lat = 0.0;
gps.lng = 0.0;
gps.height = 0.0;
gps.last_received_time = 0;
Serial.println(F("GPS init done"));
}
void GPS_Update() {
// 1つのセンテンスを読み込む
String line = GpsSerial.readStringUntil('\n');
Serial.println(line);
if(line != ""){
uint16_t i;
uint8_t index = 0;
uint16_t len = line.length();
String str = "";
// StringListの生成(簡易)
// const uint8_t MAX_LIST = 30; // メモリ節約のために,極限まで小さくしたい!
const uint8_t MAX_LIST = 12; // メモリ節約のために,極限まで小さくしたい! [9]までしか使わないから小さくしても良いはず.
String list[MAX_LIST];
for (i = 0; i < MAX_LIST; i++) {
list[i] = "";
}
// 「,」を区切り文字として文字列を配列にする
for (i = 0; i < len; i++) {
if (index >= MAX_LIST) {
break;
}
if (line[i] == ',') {
list[index++] = str;
str = "";
continue;
}
str += line[i];
}
// $GPGGAセンテンスのみ読み込む
if (list[0] == "$GPGGA") {
// ステータス
if(list[6] != "0") {
// // 現在時刻
// Serial.print(GPS_UTC2GMT900_(list[1]));
// 緯度
// Serial.print(F(" 緯度:"));
// // Serial.print(GPS_NMEA2DMS_(list[2].toFloat()));
// Serial.print(F("("));
// Serial.print(GPS_NMEA2DD_(list[2].toFloat()));
// Serial.print(F(")"));
gps.lat = GPS_NMEA2DDf_(list[2].toFloat());
// 経度
// Serial.print(F(" 経度:"));
// // Serial.print(GPS_NMEA2DMS_(list[4].toFloat()));
// Serial.print(F("("));
// Serial.print(GPS_NMEA2DD_(list[4].toFloat()));
// Serial.print(F(")"));
gps.lng = GPS_NMEA2DDf_(list[4].toFloat());
// 海抜
// Serial.print(F(" 海抜:"));
// Serial.print(list[9]);
// // list[10].toLowerCase();
// // Serial.print(list[10]);
// Serial.print(F(" m"));
gps.height = list[9].toFloat();
gps.last_received_time = millis() / 1000;
Serial.print(F("測位成功"));
// Serial.print(F("GPS OK"));
} else {
Serial.print(F("測位失敗"));
// Serial.print(F("GPS NG"));
}
Serial.println(F(""));
}
}
}
void GPS_Print() {
Serial.print(F("測位結果:"));
Serial.print(F("GPS: Lat="));
Serial.print(GPS_GetLat(),6);
Serial.print(F(", Lng="));
Serial.print(GPS_GetLng(),6);
Serial.print(F(", Height="));
Serial.print(GPS_GetHeight(),2);
Serial.print(F(", RecTime="));
Serial.print(gps.last_received_time);
Serial.println(F(""));
}
float GPS_GetLat() {
return gps.lat;
}
float GPS_GetLng() {
return gps.lng;
}
float GPS_GetHeight() {
return gps.height;
}
// // NMEAの緯度経度を「度分秒」(DMS)の文字列に変換する
// String GPS_NMEA2DMS_(float val) {
// int d = val / 100;
// int m = ((val / 100.0) - d) * 100.0;
// float s = ((((val / 100.0) - d) * 100.0) - m) * 60;
// return String(d) + "度" + String(m) + "分" + String(s, 1) + "秒";
// }
// // (未使用)NMEAの緯度経度を「度分」(DM)の文字列に変換する
// String GPS_NMEA2DM_(float val) {
// int d = val / 100;
// float m = ((val / 100.0) - d) * 100.0;
// return String(d) + "度" + String(m, 4) + "分";
// }
// // NMEAの緯度経度を「度」(DD)の文字列に変換する
// String GPS_NMEA2DD_(float val) {
// int d = val / 100;
// int m = (((val / 100.0) - d) * 100.0) / 60;
// float s = (((((val / 100.0) - d) * 100.0) - m) * 60) / (60 * 60);
// return String(d + m + s, 6);
// }
// NMEAの緯度経度を「度」(DD)のfloatに変換する
// dddmm.mmmmmm
float GPS_NMEA2DDf_(float val) {
int d = (int)(val / 100);
float m = (((val / 100.0) - d) * 100.0) / 60;
// float s = (((((val / 100.0) - d) * 100.0) - m) * 60) / (60 * 60);
// return d + m + s;
return d + m;
}
// // UTC時刻から日本の標準時刻に変換する(GMT+9:00)
// String GPS_UTC2GMT900_(String str) {
// int hh = (str.substring(0,2).toInt()) + 9;
// if(hh > 24) hh = hh - 24;
// return String(hh,DEC) + ":" + str.substring(2,4) + ":" + str.substring(4,6);
// }