#include <Arduino.h>
// KONFIGURACJA WSPÓŁRZĘDNYCH
const float LATITUDE = 52.4064; // Poznań
const float LONGITUDE = 16.9252; // Poznań
const float ALTITUDE = 80.0; // Metry
const int SATELLITES = 12; // Liczba satelitów
// Funkcja pomocnicza do obliczania sumy kontrolnej NMEA XOR
byte calculateChecksum(const char* sentence) {
byte checksum = 0;
for (int i = 1; sentence[i] != '\0'; i++) {
checksum ^= sentence[i];
}
return checksum;
}
// Funkcja generująca i wysyłająca komunikaty NMEA
void generateAndSendNMEA() {
char buffer[200]; // Bufor wystarczajaco duzy na komunikat GPGGA
// Uproszczony Timestamp, bo nie mamy zegara czasu rzeczywistego w symulacji
const char* timestamp = "172914.049";
const char* datestamp = "060622"; // Data: 6 czerwca 2022
// Formatowanie szerokości i długości geograficznej do formatu NMEA (ddmm.mmmm)
long lat_deg = floor(LATITUDE);
float lat_min = (LATITUDE - lat_deg) * 60.0;
long lon_deg = floor(LONGITUDE);
float lon_min = (LONGITUDE - lon_deg) * 60.0;
// Dla uproszczenia ustawiamy separacje geoidy na zero, aby Altitude (pole 9) bylo rowne wysokosci elipsoidalnej w analizatorze
float geoid_separation = 0.0;
// Predkosc i kurs dla RMC (stala pozycja)
float speed_knots = 0.0;
float track_deg = 0.0;
// GENEROWANIE GPGGA
// %.1f,M dla separacji geoidy
snprintf(buffer, sizeof(buffer), "$GPGGA,%s,%02ld%07.4f,N,%03ld%07.4f,E,1,%02d,0.9,%.1f,M,%.1f,M,,", timestamp, lat_deg, (double)lat_min, lon_deg, (double)lon_min, SATELLITES, (double)ALTITUDE, (double)geoid_separation);
byte checksum_gga = calculateChecksum(buffer);
Serial.print(buffer);
Serial.print("*");
if (checksum_gga < 0x10) Serial.print("0");
Serial.println(checksum_gga, HEX);
// GENEROWANIE GPRMC
snprintf(buffer, sizeof(buffer), "$GPRMC,%s,A,%02ld%07.4f,N,%03ld%07.4f,E,%.1f,%.1f,%s,,,A", timestamp, lat_deg, (double)lat_min, lon_deg, (double)lon_min, (double)speed_knots, (double)track_deg, datestamp);
byte checksum_rmc = calculateChecksum(buffer);
Serial.print(buffer);
Serial.print("*");
if (checksum_rmc < 0x10) Serial.print("0");
Serial.println(checksum_rmc, HEX);
}
// Funkcja setup() wykonuje sie TYLKO RAZ
void setup() {
Serial.begin(9600);
Serial.println("--- Wynik NMEA (jednorazowy) ---");
generateAndSendNMEA();
Serial.println("--- Koniec generowania ---");
}
void loop() {
}