W tym artykule przedstawię po krótce możliwości wykorzystania RV 5V TinyGPS, pozwalającego na określenia swojego położenia geograficznego na mapie. W artykule będzie również zawarty opis obsługi wyświetlacza Oled 128×128 oraz spis bibliotek do korzystania z niego. Przykład który poniżej przedstawię ma za zadanie wyświetlić długość i szerokość geograficzną naszego położenia oraz wysokość nad poziomem morza.
Spis treści
- Krótki opis
- Specyfikacja
- Przykład
- Pliki do pobrania
Krótki opis
Ten moduł TinyGPS podaje nam z jakiej ilości satelitów korzystam, określa z jaką prędkością się poruszamy, do tego możemy ustalić w jakiej jednostce chcemy żeby nam podał tę informacje, ale również może określać czas z dokładnością do centy-sekundy.
Specyfikacja
- Nazwa: Tiny GPS Module
- Napięcie wejściowe: 5V
- Antena: Antena Ceramiczna
- Formaty odbioru: GPS,GLONASS,BDS
- Wskaźnik wsparcia: 9600dps
- Protokół wyjścia: UBLOX
- Temperatura Pracy: -40℃-+85℃
- Temperatura Przechowania: -40℃-+105℃
- Wymiary: 12mm x 16mm x 6mm
- Waga: 3g
Przykład
Elementy:
- Arduino Uno lub Mega
- Oled 128×64
- TinyGPS
- *Płytka Stykowa lub szybko złączki dla wygody korzystania
Połączenie:
- Arduino – GPS
- VCC(czerwony kabel) – 5V
- GND(czarny kabel) – GND
- TX(biały kabel) – pin 10(Arduino Mega) / pin 4 (Uno)
- RX(żółty kabel) – pin 11(Arduino Mega)/ pin 3(Uno)
- Oled-arduino
- VCC – 5V
- GND – GND
- SCL – SCL(Uno – pin 5)
- SDA – SDA(Uno – pin4)
Program
!!Uwaga GPS nie może pobrać danych o lokacji będąc w pomieszczeniu
Na początku musimy zdefiniować biblioteki AdafruitSSD_1306 odpowiadająco za działanie wyświetlacza oraz TinyGPS kontrolującą moduł GPS. Użyłem również w przykładzie biblioteki SoftwareSerial, odpowiadającej za port, oprócz szeregowego, którym będą przesyłane dane z modułu GPS. W jej obiekcie ustalam piny RX i TX (Jeśli korzystasz z Uno lub Nano zmień wartości na 4,3) Jeśli chcesz dowiedzieć się jakie biblioteki będą wykorzystane i należy pobrać dla wyświetlacza Oled zachęcam do zapoznania się z tym artykułem -> Reziorek.pl – Wyświetlacze OLED 0.91, 0.96 (ajmaker.pl)
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <TinyGPSPlus.h> #include <SoftwareSerial.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) // The pins for I2C are defined by the Wire-library. // On an arduino UNO: A4(SDA), A5(SCL) // On an arduino MEGA 2560: 20(SDA), 21(SCL) // On an arduino LEONARDO: 2(SDA), 3(SCL), ... #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); TinyGPSPlus gps; SoftwareSerial SoftSerial(10, 11); // RX, TX static const uint32_t GPSBaud = 9600;
Pierwszą z funkcji jaką teraz omówię bedzie void setup(). Aktywujemy w niej porty szeregowy i danych w których ustawiamy po kolei wartości 115200 oraz 9600(ponieważ na takim baundrate działa moduł GPS).
Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } // Show image buffer on the display hardware. // Since the buffer is intialized with an Adafruit splashscreen // internally, this will display the splashscreen. SoftSerial.begin(GPSBound);
Następną funkcją jest funkcja void loop(). Składa się ona z while i if. Funkcja while będzie wykonywała się do momentu gdy dane z portu będą odbierane. Natomiast warunkiem if jest poprawne działanie gps. Jeżeli tak się stanie rozpocznie się działanie funkcji DisplayInfo().
void loop() { while (SoftSerial.available() > 0) if (gps.encode(SoftSerial.read())) DisplayInfo(); }
Funkcja DisplayInfo() ma 3 zadania. Najpierw powinna podać nam dzisiejszą datę, jeżeli się to nie stanie wyświetli się komunikat o pojawieniu się błędu w jej miejscu. To samo stanie się jeżeli gps nie będzie w stanie odczytać wartości naszej długości i szerokości geograficznej. Ostatnim zadaniem modułu jest odczyt naszej wysokości nad poziomem morza.
void DisplayInfo() { display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); if(gps.date.isValid()) { display.setCursor(60,0); display.print(gps.date.day()); display.print("/"); display.print(gps.date.month()); display.print("/"); display.print(gps.date.year()); } else { display.setCursor(60, 0); display.print("Error"); } if(gps.location.isValid()){ display.setCursor(0,20); display.print("Dlugosc :"); display.println(gps.location.lat(), 4); display.setCursor(0, 30); display.print("Szerokosc :"); display.println(gps.location.lng(), 4); if(gps.altitude.isValid()) { display.setCursor(0, 40); display.println("Wysokosc:"); display.println(gps.altitude.meters()); }else { display.setCursor(0, 40); display.print("Error"); } } else { display.setCursor(0, 20); display.print("Error"); display.setCursor(0, 30); display.print("Error"); display.setCursor(0, 40); display.print("Error"); } display.display(); }