Here is the program:
Code: Select all
#include <NewSoftSerial.h>
#include <Wire.h>
#include <SD.h>
#include <Adafruit_BMP085.h>
#include <avr/sleep.h>
#include "GPSconfig.h"
//#include <SoftwareSerial.h>
#define SLEEPDELAY 0
#define TURNOFFGPS 0
#define LOG_RMC_FIXONLY 0
#define GPSRATE 4800
#define powerPin 4
#define led1Pin 5
#define led2Pin 6
#define chipSelect 10
#define BUFFSIZE 90
NewSoftSerial gpsSerial(2, 3);
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
uint8_t fix = 0;
uint8_t i,j,k;
char *parseptr;
float Temperature;
int32_t Pressure;
float lat,lon,temp;
char date[7];
char utc_time[10];
char alt[10];
File logfile;
Adafruit_BMP085 bmp;
uint8_t parseHex(char c) {
if (c < '0')
return 0;
if (c <= '9')
return c - '0';
if (c < 'A')
return 0;
if (c <= 'F')
return (c - 'A')+10;
}
void error(uint8_t errno) {
while(1) {
for (i=0; i<errno; i++) {
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
delay(100);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
delay(100);
}
for (; i<10; i++) {
delay(200);
}
}
}
void readline(void) {
char c;
bufferidx = 0;
gpsSerial.read();
while (1) {
c=gpsSerial.read();
if (c == -1)
continue;
if (c == '\n')
continue;
if ((bufferidx == BUFFSIZE-1) || (c == '\r')) {
buffer[bufferidx] = 0;
return;
}
buffer[bufferidx++]= c;
}
}
void setup() {
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = 0;
Serial.begin(9600);
Serial.println("\r\nGPS and BMP085 logger");
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(powerPin, OUTPUT);
digitalWrite(powerPin, LOW);
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("Card init. failed!");
error(1);
}
strcpy(buffer, "AQDLS.TXT");
for (i = 0; i < 100; i++) {
buffer[6] = '0' + i/10;
buffer[7] = '0' + i%10;
if (! SD.exists(buffer)) {
break;
}
}
logfile = SD.open(buffer, FILE_WRITE);
if( ! logfile ) {
Serial.print("Couldnt create ");
Serial.println(buffer);
error(3);
}
Serial.print("Writing to ");
Serial.println(buffer);
logfile.println("# A GPS track data file");
logfile.println("# UTC time lat lon gps_alt pressure temperature");
logfile.println("# hhmmss.sss deg deg m hPa C");
logfile.println("#");
gpsSerial.begin(GPSRATE);
Serial.println("Ready!");
gpsSerial.print(SERIAL_SET);
delay(250);
gpsSerial.print(GGA_ON);
delay(250);
gpsSerial.print(RMC_OFF);
delay(250);
gpsSerial.print(WAAS_ON);
bmp.begin();
}
void loop() {
char c;
uint8_t sum;
char *p;
readline();
Serial.print("raw line: ");
Serial.println(buffer);
sum = parseHex(buffer[bufferidx-2]) * 16;
sum += parseHex(buffer[bufferidx-1]);
Serial.print("Checksum:");
Serial.println(sum);
for (i=1; i < (bufferidx-3); i++) {
sum ^= buffer[i];
}
if (sum != 0) {
Serial.print('~');
bufferidx = 0;
return;
}
p = buffer;
p = strchr(p, ',')+1;
for (k=0;k<9;k++)
utc_time[k]=p[k];
Serial.print(" UTC time:");
Serial.println(utc_time);
p = strchr(p, ',')+1;
lat = (p[0]-'0')*10.0 + (p[1]-'0') + ((p[2]-'0')*10.0 + (p[3]-'0') + (p[5]-'0')/10.0 + (p[6]-'0')/100.0 + (p[7]-'0')/1000.0 + (p[8]-'0')/10000.0)/60.0;
p = strchr(p, ',')+1;
if (p[0]=='S')
lat *= -1.0;
Serial.print(" latitude:");
Serial.println(lat,7);
p = strchr(p, ',')+1;
lon = (p[0]-'0')*100.0 + (p[1]-'0')*10.0 + (p[2]-'0') + ((p[3]-'0')*10.0 + (p[4]-'0') + (p[6]-'0')/10.0 + (p[7]-'0')/100.0 + (p[8]-'0')/1000.0 + (p[9]-'0')/10000.0)/60.0;
p = strchr(p, ',')+1;
if (p[0]=='W')
lon *= -1.0;
Serial.print(" longitude:");
Serial.println(lon,7);
p = strchr(p, ',')+1;
if (p[0]=='0') {
fix = 0;
digitalWrite(led1Pin, LOW);
}
else {
fix = 1;
digitalWrite(led1Pin, HIGH);
}
p = strchr(p, ',')+1;
p = strchr(p, ',')+1;
p = strchr(p, ',')+1;
j=0;
while (p[j] != ',') {
alt[j] = p[j];
j++;
}
Serial.print(" alt:");
Serial.println(alt);
bufferidx = 0;
digitalWrite(led2Pin, HIGH);
logfile.print(date);
logfile.print(" ");
logfile.print(utc_time);
logfile.print(" ");
logfile.print(lat,7);
logfile.print(" ");
logfile.print(lon,7);
logfile.print(" ");
logfile.print(alt);
logfile.print(" ");
Temperature = bmp.readTemperature();
Serial.print("Temperature = ");
Serial.print(Temperature);
Serial.println(" C");
Pressure = bmp.readPressure();
Serial.print("Pressure = ");
Serial.print(Pressure);
Serial.println(" Pa");
logfile.print(" ");
logfile.print(Pressure);
logfile.print(" ");
logfile.println(Temperature);
logfile.flush();
digitalWrite(led2Pin, LOW);
if (TURNOFFGPS) {
digitalWrite(powerPin, HIGH);
}
delay(SLEEPDELAY * 1000);
digitalWrite(powerPin, LOW);
return;
}