Using 2 Nanos instead of one? Help is needed!

I am trying to make a small GPS module that has an SD card for logging and an OLED display so I can view the GPS data. I made the code and tested the GPS data logger portion and it worked. However I had not yet added the display and the memory was already low. When I added the OLED and its libraries I ran out of memory. My idea was to connect two Arduino nano's to the GPS(from adafruit) instead of just 1. The first could be used for data logging and the other could control the display. The GPS uses tx and rx to communicate with the Arduino. Do you know if this is possible?

Try using a text-only library for the display - the memory requirements will usually be lower than for a graphics library.

Do you have any recommendations? I am using the adafruit GFX and the Adafruit SSD1306 libraries.

Here is my code:

#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
//    ------>
// 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)) {

  logfile =, FILE_WRITE);
  // connect to the GPS at the desired rate

  // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
  // uncomment this line to turn on only the "minimum recommended" data
  // 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

void loop() {
  char c =;
  // 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.println(GPS.hour, DEC); display.print(':'); display.print(GPS.minute, DEC); display.print(':'); display.print(GPS.seconds, DEC);

  display.println(, DEC); display.print('/'); display.print(GPS.month, DEC);  display.print("/20");display.print(GPS.year, DEC);

/* End code */

Running the GPS data out to two inputs should be fine. Remember - common Grounds. (OK?)

I have found that multiple Nanos are a great way to break up a coding effort and segregate functionality. One of my projects involves three intercommunicating Nanos. One handles user interface, one handles communication with a local radio net, and one handles internet communications. They're very cheap, so why try to stuff 12 pounds of code in a 10 pound processor, when the coding is so much easier, and cleaner, when separated functionally?

My fail proof method of communication between them is software serial, since this restricts pin choices the least. If I have two of them, they will communicate with no conflicts using just the 2-wire serial. If you use three or more, you come up against the fact that any Nano can only be listening for one SW serial input at a time. I cope with that by treating one as a master, which must give the others permission to send by asserting a line high. Now the interface is up to three wires, but with multiple Nanos available, that's usually not a problem.

Once you master tis multiple Nano thing, it becomes a way of life.

Cool. I tried that and it worked great! One handles the GPS and SD card while the other reads from the GPS and controls the display. Thanks!