User | Revision | Line number | New contents of line |
prf |
0:2f1a2ad434d7
|
1
|
// GPS synchronised data logger
|
prf |
0:2f1a2ad434d7
|
2
|
// Uses the $GPRMC string for time and date
|
prf |
0:2f1a2ad434d7
|
3
|
// synchronisation
|
prf |
0:2f1a2ad434d7
|
4
|
// Code derived from Arduino GPS examples
|
prf |
0:2f1a2ad434d7
|
5
|
// and the MBED GPS library
|
prf |
0:2f1a2ad434d7
|
6
|
// http://www.arduino.cc/
|
prf |
0:2f1a2ad434d7
|
7
|
// Thanks Lady Ada and others!
|
prf |
0:2f1a2ad434d7
|
8
|
|
prf |
0:2f1a2ad434d7
|
9
|
#include "mbed.h"
|
prf |
0:2f1a2ad434d7
|
10
|
// Commands for Globalsat EM-406A GPS
|
prf |
0:2f1a2ad434d7
|
11
|
// to turn on or off data strings
|
prf |
0:2f1a2ad434d7
|
12
|
#define RMC_ON "$PSRF103,4,0,1,1*21\r\n"
|
prf |
0:2f1a2ad434d7
|
13
|
#define RMC_OFF "$PSRF103,4,0,0,1*20\r\n"
|
prf |
0:2f1a2ad434d7
|
14
|
#define GGA_ON "$PSRF103,0,0,1,1*25\r\n"
|
prf |
0:2f1a2ad434d7
|
15
|
#define GGA_OFF "$PSRF103,0,0,0,1*24\r\n"
|
prf |
0:2f1a2ad434d7
|
16
|
#define GSA_ON "$PSRF103,2,0,1,1*27\r\n"
|
prf |
0:2f1a2ad434d7
|
17
|
#define GSA_OFF "$PSRF103,2,0,0,1*26\r\n"
|
prf |
0:2f1a2ad434d7
|
18
|
#define GSV_ON "$PSRF103,3,0,1,1*26\r\n"
|
prf |
0:2f1a2ad434d7
|
19
|
#define GSV_OFF "$PSRF103,3,0,0,1*27\r\n"
|
prf |
0:2f1a2ad434d7
|
20
|
#define WAAS_ON "$PSRF151,1*3F\r\n"
|
prf |
0:2f1a2ad434d7
|
21
|
#define WAAS_OFF "$PSRF151,0*3E\r\n"
|
prf |
0:2f1a2ad434d7
|
22
|
|
prf |
0:2f1a2ad434d7
|
23
|
// Set up serial ports and LEDs
|
prf |
0:2f1a2ad434d7
|
24
|
// MBED USB port used for console debug messages
|
prf |
0:2f1a2ad434d7
|
25
|
// EM-406A GPS on Pin9 and Pin10
|
prf |
0:2f1a2ad434d7
|
26
|
Serial pc(USBTX, USBRX); // tx, rx - Default 9600 baud
|
prf |
0:2f1a2ad434d7
|
27
|
Serial gps(p9, p10); // tx, rx - 4800 baud required
|
prf |
0:2f1a2ad434d7
|
28
|
DigitalOut led1(LED1); // Seconds LED
|
prf |
0:2f1a2ad434d7
|
29
|
DigitalOut led4(LED4); // Data sent LED
|
prf |
0:2f1a2ad434d7
|
30
|
|
prf |
0:2f1a2ad434d7
|
31
|
//char buffidx;
|
prf |
0:2f1a2ad434d7
|
32
|
char msg[256]; // GPS data buffer
|
prf |
0:2f1a2ad434d7
|
33
|
char status; // GPS status 'V' = Not locked; 'A' = Locked
|
prf |
0:2f1a2ad434d7
|
34
|
char *parseptr; // Pointer for parsing GPS message
|
prf |
0:2f1a2ad434d7
|
35
|
char time_buff[7] = "000000";
|
prf |
0:2f1a2ad434d7
|
36
|
char date_buff[7] = "000000";
|
prf |
0:2f1a2ad434d7
|
37
|
char sens_buff[7] = "123456";
|
prf |
0:2f1a2ad434d7
|
38
|
|
prf |
0:2f1a2ad434d7
|
39
|
// Switch off all but $GPRMC string
|
prf |
0:2f1a2ad434d7
|
40
|
void setgps() {
|
prf |
0:2f1a2ad434d7
|
41
|
gps.printf(RMC_ON);
|
prf |
0:2f1a2ad434d7
|
42
|
gps.printf(GGA_OFF);
|
prf |
0:2f1a2ad434d7
|
43
|
gps.printf(GSA_OFF);
|
prf |
0:2f1a2ad434d7
|
44
|
gps.printf(GSV_OFF);
|
prf |
0:2f1a2ad434d7
|
45
|
gps.printf(WAAS_OFF);
|
prf |
0:2f1a2ad434d7
|
46
|
return;
|
prf |
0:2f1a2ad434d7
|
47
|
}
|
prf |
0:2f1a2ad434d7
|
48
|
// Get line of data from GPS
|
prf |
0:2f1a2ad434d7
|
49
|
void getline() {
|
prf |
0:2f1a2ad434d7
|
50
|
while (gps.getc() != '$'); // Wait for start of line
|
prf |
0:2f1a2ad434d7
|
51
|
for (int i=0; i<256; i++) {
|
prf |
0:2f1a2ad434d7
|
52
|
msg[i] = gps.getc();
|
prf |
0:2f1a2ad434d7
|
53
|
// pc.putc(msg[i]);
|
prf |
0:2f1a2ad434d7
|
54
|
if (msg[i] == '\r') {
|
prf |
0:2f1a2ad434d7
|
55
|
msg[i] = 0;
|
prf |
0:2f1a2ad434d7
|
56
|
return;
|
prf |
0:2f1a2ad434d7
|
57
|
}
|
prf |
0:2f1a2ad434d7
|
58
|
}
|
prf |
0:2f1a2ad434d7
|
59
|
}
|
prf |
0:2f1a2ad434d7
|
60
|
// Flash LED 1
|
prf |
0:2f1a2ad434d7
|
61
|
void flashled1(void) {
|
prf |
0:2f1a2ad434d7
|
62
|
led1 = 1;
|
prf |
0:2f1a2ad434d7
|
63
|
wait(0.05);
|
prf |
0:2f1a2ad434d7
|
64
|
led1 = 0;
|
prf |
0:2f1a2ad434d7
|
65
|
wait(0.05);
|
prf |
0:2f1a2ad434d7
|
66
|
}
|
prf |
0:2f1a2ad434d7
|
67
|
// Flash LED4
|
prf |
0:2f1a2ad434d7
|
68
|
void flashled4(void) {
|
prf |
0:2f1a2ad434d7
|
69
|
led4 = 1;
|
prf |
0:2f1a2ad434d7
|
70
|
wait(0.1);
|
prf |
0:2f1a2ad434d7
|
71
|
led4 = 0;
|
prf |
0:2f1a2ad434d7
|
72
|
wait(0.1);
|
prf |
0:2f1a2ad434d7
|
73
|
}
|
prf |
0:2f1a2ad434d7
|
74
|
void read_sensor() {
|
prf |
0:2f1a2ad434d7
|
75
|
// Insert code here to read sensor
|
prf |
0:2f1a2ad434d7
|
76
|
// and store data in sens_buff[]
|
prf |
0:2f1a2ad434d7
|
77
|
}
|
prf |
0:2f1a2ad434d7
|
78
|
void send_data() {
|
prf |
0:2f1a2ad434d7
|
79
|
// Insert code to send data
|
prf |
0:2f1a2ad434d7
|
80
|
pc.printf(sens_buff);
|
prf |
0:2f1a2ad434d7
|
81
|
pc.printf("\r\n");
|
prf |
0:2f1a2ad434d7
|
82
|
}
|
prf |
0:2f1a2ad434d7
|
83
|
|
prf |
0:2f1a2ad434d7
|
84
|
int main(void) {
|
prf |
0:2f1a2ad434d7
|
85
|
gps.baud(4800); // NB GPS baud rate 4800
|
prf |
0:2f1a2ad434d7
|
86
|
pc.printf("\n\rGPS Logger Running!...\n\r");
|
prf |
0:2f1a2ad434d7
|
87
|
setgps();
|
prf |
0:2f1a2ad434d7
|
88
|
while (1) {
|
prf |
0:2f1a2ad434d7
|
89
|
getline();
|
prf |
0:2f1a2ad434d7
|
90
|
if (strncmp(msg, "GPRMC",5) == 0) {
|
prf |
0:2f1a2ad434d7
|
91
|
// Put the time into the time array
|
prf |
0:2f1a2ad434d7
|
92
|
parseptr = msg+6;
|
prf |
0:2f1a2ad434d7
|
93
|
for (int i = 0; i < 6; i++) {
|
prf |
0:2f1a2ad434d7
|
94
|
time_buff[i] = parseptr[i];
|
prf |
0:2f1a2ad434d7
|
95
|
}
|
prf |
0:2f1a2ad434d7
|
96
|
// Skip through commas in the data string
|
prf |
0:2f1a2ad434d7
|
97
|
// Firstly to get to the status flag and
|
prf |
0:2f1a2ad434d7
|
98
|
// then to pick up the date
|
prf |
0:2f1a2ad434d7
|
99
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
100
|
status = parseptr[0];
|
prf |
0:2f1a2ad434d7
|
101
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
102
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
103
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
104
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
105
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
106
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
107
|
parseptr = strchr(parseptr, ',')+1;
|
prf |
0:2f1a2ad434d7
|
108
|
// Put the date into the date array
|
prf |
0:2f1a2ad434d7
|
109
|
for (int i = 0; i < 6; i++) {
|
prf |
0:2f1a2ad434d7
|
110
|
date_buff[i] = parseptr[i];
|
prf |
0:2f1a2ad434d7
|
111
|
}
|
prf |
0:2f1a2ad434d7
|
112
|
// Every second output time, date and lock status
|
prf |
0:2f1a2ad434d7
|
113
|
// to the console and flash LED1
|
prf |
0:2f1a2ad434d7
|
114
|
pc.printf(time_buff);
|
prf |
0:2f1a2ad434d7
|
115
|
pc.printf(",");
|
prf |
0:2f1a2ad434d7
|
116
|
pc.printf(date_buff);
|
prf |
0:2f1a2ad434d7
|
117
|
pc.printf(",");
|
prf |
0:2f1a2ad434d7
|
118
|
pc.putc(status);
|
prf |
0:2f1a2ad434d7
|
119
|
pc.printf("\r\n");
|
prf |
0:2f1a2ad434d7
|
120
|
flashled1();
|
prf |
0:2f1a2ad434d7
|
121
|
// Take a sensor reading every minute
|
prf |
0:2f1a2ad434d7
|
122
|
// ie is the time hh:mm:00
|
prf |
0:2f1a2ad434d7
|
123
|
if (time_buff[4] == 0x30 && time_buff[5] == 0x30) {
|
prf |
0:2f1a2ad434d7
|
124
|
pc.printf("\r\nSensor Reading!\r\n");
|
prf |
0:2f1a2ad434d7
|
125
|
read_sensor();
|
prf |
0:2f1a2ad434d7
|
126
|
pc.printf("Sending: ");
|
prf |
0:2f1a2ad434d7
|
127
|
send_data();
|
prf |
0:2f1a2ad434d7
|
128
|
pc.printf("\r\n");
|
prf |
0:2f1a2ad434d7
|
129
|
flashled4();
|
prf |
0:2f1a2ad434d7
|
130
|
|
prf |
0:2f1a2ad434d7
|
131
|
}
|
prf |
0:2f1a2ad434d7
|
132
|
}
|
prf |
0:2f1a2ad434d7
|
133
|
}
|
prf |
0:2f1a2ad434d7
|
134
|
}
|
prf |
0:2f1a2ad434d7
|
135
|
|