Skip to main content

[exemplo] GPS

(wip)

distância ao DEEC - FCTUC

gpsexemplo.jpgexgps.jpg

#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>

// OLED display TWI address
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

SoftwareSerial gpsSerial(2, 3);  // RX, TX
TinyGPSPlus gps;

void setup() {
  // inicializa ecrã
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();

  // imprime linha de texto
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(27, 30);
  display.print("init ...");

  // actualiza ecrã
  display.display();

  gpsSerial.begin(9600);
  Serial.begin(115200);
}

void loop() {
  while (gpsSerial.available() > 0){
    if (gps.encode(gpsSerial.read()))
      displayInfo();
  }
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}

void displayInfo() {
  bool chalk_a = true;
  bool chalk_b = true;
  Serial.print(F("Location: "));

  if (gps.location.isValid()) {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    if (chalk_a) {
      chalk_a = false;
    } 
  } else {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  
  if (gps.date.isValid()) {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  } else {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  
  if (gps.time.isValid()) {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
    if (chalk_b) {
      chalk_b = false;
    }
  } else {
    Serial.print(F("INVALID"));
  }

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

  if (!chalk_a) {
    static const double DEECFCTUC_LAT = 40.186386, DEECFCTUC_LON = -8.427405;
    unsigned long distanceKmToDEEC =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      DEECFCTUC_LAT, 
      DEECFCTUC_LON);// / 1000;

    Serial.println(distanceKmToDEEC);
    display.setCursor(40, 20);
    display.print(distanceKmToDEEC);
    display.setCursor(80, 20);
    display.print("m");
    display.display();
  }

  if (!chalk_b) {
    display.setCursor(40, 40);
    display.print(gps.time.hour());
    display.setCursor(53, 40);
    display.print(":");
    display.setCursor(60, 40);
    display.print(gps.time.minute());
    display.setCursor(73, 40);
    display.display();
  }
  display.display();
  Serial.println();
}