So, a nice little code dump here. This is the final code dump of Project Freja. This logged the moisture, altitude, accuracy (in m), position and date to the SD card. Hope you can make something of it!
//Newest as of 02/11/2013
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 5, 4, 3, 2);
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include <math.h>
SoftwareSerial mySerial(8, 7);
const int sensorPin = A0;
const float baselineMoisture = 0.0;
Adafruit_GPS GPS(&mySerial);
boolean usingInterrupt = false;
void useInterrupt(boolean);
#define chipSelect 10 //SD card define
File logfile;
int switchState = 0;
//Function
// convert NMEA coordinate to decimal degrees
float decimalDegrees(float nmeaCoord) {
uint16_t wholeDegrees = 0.01*nmeaCoord;
return wholeDegrees + (nmeaCoord - 100.0*wholeDegrees)/60.0;
}
//EndFunction
//Function
//To convert HDOP into metre range
float Accu(float x1) {
float result;
result = sqrt(sq(x1) * 44.89 + 1);
return result;
}
//EndFunction
//Function Read Hex Value Return decimal
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;
}
//Function end
void setup()
{
pinMode(9, INPUT); //The Switch input
lcd.begin(16,2);
//Serial.begin(115200);
// connect to the GPS at the desired rate
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 or 5 Hz update rate
GPS.sendCommand(PGCMD_NOANTENNA);
useInterrupt(true);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
}
SIGNAL(TIMER0_COMPA_vect) {
char c = GPS.read();
}
void useInterrupt(boolean v) {
if (v) {
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
// do not call the interrupt function COMPA anymore
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
pinMode(10, OUTPUT); //SD card select
if (!SD.begin(10)) {
// Serial.println("initialization failed!");
return;
}
}
uint32_t timer = millis();
void loop() // run over and over again
{
int sensorVal = analogRead(sensorPin);
switchState = digitalRead(9);
# // in case you are not using the interrupt above, you'll
// need to 'hand query' the GPS, not suggested :(
if (! usingInterrupt) {
// read data from the GPS in the 'main loop'
char c = GPS.read();
}
// if a sentence is received, we can check the checksum, parse it...
if (GPS.newNMEAreceived()) {
// a tricky thing here is if we print the NMEA sentence, or data
// we end up not listening and catching other sentences!
// so be very wary if using OUTPUT_ALLDATA and trytng to print out data
//Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
// if millis() or timer wraps around, we'll just reset it
if (timer > millis()) timer = millis();
if ((GPS.fix)&& (switchState == HIGH)) {
logfile = SD.open("GPSlog.txt", FILE_WRITE);
//Serial.print("Fix & High");
logfile.print(decimalDegrees(GPS.latitude), 5); logfile.print(",-");
logfile.print(decimalDegrees(GPS.longitude), 5); logfile.print(",");
logfile.print(sensorVal);
logfile.print(",");
logfile.print(Accu(GPS.HDOP));
logfile.print(",");
logfile.println(GPS.altitude);
logfile.close();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Logged to Card");
delay(1000);
}
// approximately every 2 seconds or so, print out the current stats
if (millis() - timer > 2000) {
timer = millis(); // reset the timer
// Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
if (GPS.fix) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(decimalDegrees(GPS.latitude), 5);
lcd.print(",+-");
lcd.print(Accu(GPS.HDOP), 1);
lcd.print("m");
lcd.setCursor(0,1);
lcd.print(decimalDegrees(GPS.longitude), 5);
lcd.print(",");
lcd.print(sensorVal); lcd.print("%");
lcd.print(GPS.speed, 1);
}
if (!GPS.fix) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("No Fix");
}
}
}