N00b with a project!

I hope I'm doing this right. I don't have any code currently but I have a project I'd like to do and am not sure how feasible or what the best approach would be.

I am fairly new to arduinos and coding. I played with the example sketches, have some cheap component and have very little to no coding experience. I currently started reading free C++ tutorials online to try and help me code my project.

Project:
I want to use an arduino to display speed, date and direction onto a 0.96'' OLED from GPS data. I do not want to have everything in the same unit due to size.

So my idea is to use bluetooth connection to receive the GPS data either from my Android cell phone or another arduino with a GPS and bluetooth receiver in it. From the parts I have this is what I planned to use:

So unit 1:

  • Uno
  • HC05 bluetooth
  • 0.96 OLED I2C

and then I am uncertain:

idea 1:

  • Uno or Mega
  • NEO6M GPS
  • HC05 bluetooth or HM10

OR

idea 2:
Use the GPS from my Android phone to supply data

So at this point I am wondering, is this too much for a newbie?
Is using a smartphone or another arduino to get the data I need better and/or easier? How reliable will it be?

to learn arduino programming click on the learn tab instead of forum there are many good tutorials and code examples whereas learning C++ is good to know it can be overwhelming compared to the easier arduino coding what are you measuring the speed and direction of and why not a gps shield and one arduino uno and lcd

Head over to Adafruit and check out their 0.96" Oled and Ultimate GPS breakout. You can use an Arduino Nano (atmega328, same as uno) to keep it small, the whole thing would take up barely any space. Adafruit have libraries and plenty of examples for their products so you can get started pretty easily. Integration with a phone will needlessly complicate it as the GPS receiver will give you all the info you need.

I made one last year with products from adafruit. Slash devin was able to build his into a mini altoids tin.
I built my original into a small flyfish box. with LOTS of coding help from slash devin. I dropped it and it cracked. So now it's in a clear 1010 pelican case. I bit big but completely sturdy and waterproof. Devin even helped me with the DST issues. Came out pretty nice!

Maybe suggest building the GPS unit and then bluetooth the data to your display. I don't know anything about sending/receiving BT data. Can't help you out there.

Any difference if I go for a mega or uno in terms of speed?

As for the GPS, I'll give it a shot. I found someone's project that is similar to what I want:

http://karman.cc/blog/archives/746

with his code here:

I would just need to add bluetooth between a unit like that and one with a display. However, he's not using the regular display commands and even though my display is similar to his it's not booting when I try the code. The GPS works fine according to the serial monitor but that's it.
Most of the tutorials I've read don't really teach you how to fix or change code. I've seen a lot of examples but it's not getting me closer to knowing how to use them outside the context of the example.

How did you go about learning your code? Also, whom is this Slash devin?
I googled it and it seems like the guy responsible for the NeoGPS:

Try this....

#include <TinyWireM.h>
#include <USI_TWI_Master.h>
#include <Wire.h>
#include <NeoGPS_cfg.h>
#include <NMEAGPS_cfg.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <NeoSWSerial.h>

NeoSWSerial gps_port(4, 3);

#include "NMEAGPS.h"


static NMEAGPS  gps; // This parses the GPS characters

// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


uint32_t timer;


void setup() {

  // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
  Serial.begin(115200);

  Serial.println( F("Acquiring a GPS signal") );
  gps_port.begin(9600);

  // request RMC and GGA only
  gps_port.println( F("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28") );

  display.begin(SSD1306_SWITCHCAPVCC);

  display.clearDisplay();
  display.setTextSize(2.5);
  display.setTextColor(WHITE);
  display.setCursor(15, 10);
  display.println( F("Mini-GPS"));

 display.setTextSize(1.8);
  display.setCursor(60, 35);
  display.print( F("By"));


  display.setTextSize(1.8);
  display.setCursor(31, 50);
  display.print( F("Nick Sebring"));
  display.display(); // SEND SPLASH SCREEN
  delay(5000);       // WAIT 5 SECONDS


  timer = millis();
}


void loop()    // run over and over again
{


  while (gps_port.available()) {

    timer = millis(); // reset the timer

    if (gps.decode( gps_port.read() ) == NMEAGPS::DECODE_COMPLETED) {

      if (gps.nmeaMessage == NMEAGPS::NMEA_RMC) {
        //  If your device emits a GGA then an RMC each second,
        //    change the above GGA to RMC.  Or if you don't get all
        //    the attributes (e.g., alt, heading, speed and satellites)
        //    try changing the above test.  NMEAorder.ino can be
        //    used to determine which one is last (should be used above).

        //  BTW, this is the safest place to do any time-consuming work,
        //    like updating the display.  Doing it elsewhere will cause GPS
        //    characters to be lost, and some fix data won't be available/valid.
        //    And if you take too long here, you could still lose characters.

        uint32_t displayTime = micros(); // use this later, to figure out how long the display process takes.



        display.clearDisplay(); //CLEAR THE OLED BUFFER, THUS CLEARING THE SCREEN:  GOT IT!

        const gps_fix & fix = gps.fix();

        //  construct data to be sent to the OLED *****************************

        display.setTextSize(1);
        display.setTextColor(WHITE);

        display.setCursor(0, 0);
        display.print( F("Satellites: "));

        if (fix.valid.satellites) {
          display.setCursor(70, 0);
          display.println( fix.satellites );
        }

        if (fix.valid.date && fix.valid.time) {
          display.setCursor(95, 0);
          NeoGPS::clock_t seconds = (NeoGPS::clock_t) fix.dateTime;     // convert pieces to seconds
          seconds -= 4 * 60 * 60;                               // offset seconds
          NeoGPS::time_t localTime( seconds );                    // convert seconds back to pieces

          if (localTime.hours < 10) {
            display.print( '0' );
          }

          display.print( localTime.hours ); display.print( ':' ); // use pieces
          if (localTime.minutes < 10) {
            display.print( '0' );
          }

          display.print( localTime.minutes);

        }



        if (fix.valid.speed) {
          display.setCursor(0, 10);
          display.print( F("Speed: ")); display.print(fix.speed_mph(), 0);
          display.print( F(" MPH"));
        }


        if (fix.valid.altitude) {
          display.setCursor(0, 20);
          display.print( F("Altitude: ")); display.print(fix.altitude(), 0 );
          display.print( F(" FT"));

        }

        if (fix.valid.heading) {
          display.setCursor(0, 30);
          display.print( F("Heading:")); display.print(fix.heading(), 0);
        }



        if (fix.valid.location) {
          display.setCursor(10, 40);
          display.println( F("Lat/Lon (Degrees)"));
          display.setCursor(10, 50);
          display.print(fix.latitude(), 4);
          display.print( F(", ") );
          display.print(fix.longitude(), 4);
        }

        display.display();

        Serial.print( F("dt = ") );
        Serial.print( micros() - displayTime ); // How long did all that take?
        Serial.println( F(" us") );
      }
    }
  }

  display.setCursor(10, 57);
  display.println( F("Acquiring a GPS signal...") );


  // Until we get sentences, print a dot every 2 seconds or so
  if (millis() - timer > 2000) {
    timer = millis(); // reset the timer
    // **************************************************
    Serial.print( '.' );
  }
}