Данное устройство задумывалось как часы точного времени со спутников GPS, но потом было расширено показывать координаты LAT/LNG, высоту, скорость и направление движения. Схема подключения модулей, листинг скетча для Arduino IDE внутри статьи далее.
Для работы скетча устанавливаем библиотеки: TinyGPSPlus (для работы модуля GPS) и Adafruit SSD1306 (для OLED дисплея).
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define WIRE Wire #include <TinyGPSPlus.h> #include <SoftwareSerial.h> static const int RXPin = 4, TXPin = 3; static const uint32_t GPSBaud = 9600; TinyGPSPlus gps; SoftwareSerial ss(RXPin, TXPin); Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &WIRE); void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); ss.begin(GPSBaud); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32 display.setTextColor(SSD1306_WHITE); } void loop() { display.clearDisplay(); display.setCursor(0,0); display.print(gps.date.day()); display.print("/"); display.print(gps.date.month()); display.print("/"); display.print(gps.date.year()); display.print(" "); display.print(gps.time.hour()); display.print(":"); display.print(gps.time.minute()); display.print(":"); display.println(gps.time.second()); // координаты LAT/LNG if(gps.location.isValid()){ display.print("LAT: "); display.println(gps.location.lat()); display.print("LNG: "); display.println(gps.location.lng()); } // высота if(gps.altitude.isValid()){ display.print("ALT: "); display.print(gps.altitude.meters()); } // направление движения if(gps.course.isValid()){ display.setCursor(65,8); display.print("CRS: "); display.print(gps.course.deg()); } // скорость движения if(gps.speed.isValid()){ display.setCursor(65,16); display.print("SPD: "); display.print(gps.speed.kmph()); } // количество спутников if(gps.satellites.isValid()){ display.setCursor(105,24); display.print("["); display.print(gps.satellites.value()); display.print("]"); } digitalWrite(LED_BUILTIN, HIGH); delay(50); digitalWrite(LED_BUILTIN, LOW); delay(25); yield(); display.display(); smartDelay(1000); } static void smartDelay(unsigned long ms){ unsigned long start = millis(); do { while (ss.available()) gps.encode(ss.read()); } while (millis() - start < ms); }