Jeff
Created May 19, 2019

Meshed automotive metrics

A device that collects vehicle metrics, uploads to the cloud via wifi, able to scale infinite devices, and provide data via web or mobile.

IntermediateShowcase (no instructions)16 hours22
Meshed automotive metrics

Things used in this project

Hardware components

Argon
Particle Argon
×1
adafruit ultimate gps featherwing
×1

Story

Read more

Schematics

argon with gps featherwing

Code

gps code

C/C++
#include "Particle.h"

// dependencies.AssetTrackerRK=0.1.7
// dependencies.oled-wing-adafruit=0.0.5


// Port of TinyGPS for the Particle AssetTracker
// https://github.com/mikalhart/TinyGPSPlus
#include "TinyGPS++.h"

#include "oled-wing-adafruit.h"

SYSTEM_THREAD(ENABLED);

/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object directly.
 */

void displayInfo(); // forward declaration

const unsigned long PUBLISH_PERIOD = 5000;
const unsigned long SERIAL_PERIOD = 5000;
const unsigned long MAX_GPS_AGE_MS = 10000; // GPS location must be newer than this to be considered valid

// The TinyGPS++ object
TinyGPSPlus gps;
unsigned long lastSerial = 0;
unsigned long lastPublish = 0;
unsigned long startFix = 0;
bool gettingFix = false;

OledWingAdafruit display;

void setup()
{
	Serial.begin(9600);

	// The GPS module on the AssetTracker is connected to Serial1 and D6
	Serial1.begin(9600);

	// Settings D6 LOW powers up the GPS module
	pinMode(D6, OUTPUT);
	digitalWrite(D6, LOW);
	startFix = millis();
	gettingFix = true;

	display.setup();
	display.clearDisplay();
	display.display();
}

void loop()
{
	display.loop();

	while (Serial1.available() > 0) {
		if (gps.encode(Serial1.read())) {
			displayInfo();
		}
	}

}

void displayInfo()
{
	if (millis() - lastSerial >= SERIAL_PERIOD) {
		lastSerial = millis();

		char buf[128];
		if (gps.location.isValid() && gps.location.age() < MAX_GPS_AGE_MS) {


			display.clearDisplay();
			display.setTextSize(2);
			display.setTextColor(WHITE);
			display.setCursor(0,0);
			snprintf(buf, sizeof(buf), "%f", gps.location.lat());
			display.println(buf);
			snprintf(buf, sizeof(buf), "%f", gps.location.lng());
			display.println(buf);
			display.display();

			snprintf(buf, sizeof(buf), "%f,%f,%f", gps.location.lat(), gps.location.lng(), gps.altitude.meters());
			if (gettingFix) {
				gettingFix = false;
				unsigned long elapsed = millis() - startFix;
				Serial.printlnf("%lu milliseconds to get GPS fix", elapsed);
			}
		}
		else {
			strcpy(buf, "no location");
			if (!gettingFix) {
				gettingFix = true;
				startFix = millis();
			}
			display.clearDisplay();
			display.setTextSize(1);
			display.setTextColor(WHITE);
			display.setCursor(0,0);
			display.println("no fix");
			display.display();
		}
		Serial.println(buf);

		if (Particle.connected()) {
			if (millis() - lastPublish >= PUBLISH_PERIOD) {
				lastPublish = millis();
				Particle.publish("gps", buf, PRIVATE);
			}
		}
	}

}

Credits

Jeff

Jeff

1 project • 1 follower

Comments