HI. I am making an Arduino GPS tracker with an adafruit GPS module, an OLED display, and an SD card module. However, I ran out of dynamic memory. Here is my code and does anyone know how i can decrease the size of my code or use flash memory to make it work. I am currently at 113% and i need less than 100
Any help is appreciated!
#include <Adafruit_GPS.h>
#include <SD.h>
#include <avr/sleep.h>
#include "GPSconfig.h"
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// Ladyada's logger modified by Bill Greiman to use the SdFat library
//
// This code shows how to listen to the GPS module in an interrupt
// which allows the program to have more 'freedom' - just parse
// when a new NMEA sentence is available! Then access data when
// desired.
//
// Tested and works great with the Adafruit Ultimate GPS Shield
// using MTK33x9 chipset
//Â Â ------> http://www.adafruit.com/products/
// Pick one up today at the Adafruit electronics shop
// and help support open source hardware & software! -ada
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
/* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
#define LOG_FIXONLY true
// Set the pins used
#define chipSelect 10
File logfile;
// read a Hex value and return the decimal equivalent
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 setup() {
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
 // make sure that the default chip select pin is set to
 // output, even if you don't use it:
 pinMode(10, OUTPUT);
Â
 // see if the card is present and can be initialized:
 //if (!SD.begin(chipSelect, 11, 12, 13)) {
 if (!SD.begin(chipSelect)) {   // if you're using an UNO, you can use this line instead
 }
 char filename[15];
 strcpy(filename, "GPSLOG00.TXT");
 for (uint8_t i = 0; i < 100; i++) {
  filename[6] = '0' + i/10;
  filename[7] = '0' + i%10;
  // create if does not exist, do not open existing, write, sync after write
  if (! SD.exists(filename)) {
   break;
  }
 }
 logfile = SD.open(filename, FILE_WRITE);
Â
 // connect to the GPS at the desired rate
 GPS.begin(9600);
 // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
 GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
 // uncomment this line to turn on only the "minimum recommended" data
 //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
 // For logging data, we don't suggest using anything but either RMC only or RMC+GGA
 // to keep the log files at a reasonable size
 // Set the update rate
 GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 or 5 Hz update rate
 // Turn off updates on antenna status, if the firmware permits it
 GPS.sendCommand(PGCMD_NOANTENNA);
}
void 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 trying 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
  // Rad. lets log it!
 Â
  char *stringptr = GPS.lastNMEA();
  uint8_t stringsize = strlen(stringptr);
  if (strstr(stringptr, "RMC")) logfile.flush();
 display.clearDisplay();
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0,0);
 display.println(GPS.hour, DEC); display.print(':'); display.print(GPS.minute, DEC); display.print(':'); display.print(GPS.seconds, DEC);
 display.setCursor(20,0);
 display.println(GPS.day, DEC); display.print('/'); display.print(GPS.month, DEC); display.print("/20");display.print(GPS.year, DEC);
Â
 }
}
/* End code */