[exemplo] rumo ao DEEC
(wip)
distância ao DEEC - FCTUC
#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include <Wire.h>
#include <Adafruit_GFX.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(F("..."));
// 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(), 12);
Serial.print(F(","));
Serial.print(gps.location.lng(), 12);
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.18639388156963, DEECFCTUC_LON = -8.416520235329802;
unsigned long distanceKmToDEEC =
(unsigned long)TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
DEECFCTUC_LAT,
DEECFCTUC_LON) / 1000;
Serial.println(distanceKmToDEEC);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30, 35);
display.print(distanceKmToDEEC);
display.setCursor(90, 35);
display.print(F("km"));
display.display();
display.setTextSize(1);
display.setTextColor(WHITE);
} else {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(40, 35);
display.print(F("..."));
display.setCursor(90, 35);
display.print(F("km"));
display.display();
display.setTextSize(1);
display.setTextColor(WHITE);
}
display.setCursor(5, 5);
display.print(F("agora"));
display.setCursor(5, 20);
display.print(F("faltam"));
display.setCursor(5, 55);
display.print(F("para chegar ao DEEC"));
if (!chalk_b) {
display.setCursor(50, 5);
display.print(gps.time.hour());
display.setCursor(63, 5);
display.print(":");
display.setCursor(70, 5);
display.print(gps.time.minute());
display.setCursor(83, 5);
display.display();
}
else {
display.setCursor(50, 5);
display.print(F("00"));
display.setCursor(63, 5);
display.print(":");
display.setCursor(70, 5);
display.print(F("00"));
display.setCursor(83, 5);
display.display();
}
display.display();
Serial.println();
}