NMEA2000 Position einlesen und auf USB Klartext ausgeben mit dem NMEA Shield

Der NMEA2000 PGN 129025 liefert schnelle Positionsdaten mit Breite und Länge typisch 10x in der Sekunde. Diese werden mit den NMEA Shield am N2K Eingang eingelesen und als Klartext per USB am PC ausgegeben.

Hier das Programm:

// Die Positionsdaten vom PGN 129025 werden mit dem 
// NMEA Shield in den Arduino eingelesen und dann 
// formatiert auf USB ausgegeben.
// 
// PGN 129025 : Position, Rapid Update, typisch 10x pro Sek.
//
// Matthias Busse 12.04.2017 Version 1.0

#include <SPI.h>
#include <Arduino.h>
#include <NMEA2000_CAN.h>
#include <N2kMessages.h>
#include <N2kMessagesEnumToStr.h>

#define N2k_CAN_INT_PIN 21
#define MCP_CAN_RX_BUFFER_SIZE 100

typedef struct {
  unsigned long PGN;
  void (*Handler)(const tN2kMsg &N2kMsg); 
} tNMEA2000Handler;

void PositionRapid(const tN2kMsg &N2kMsg);

tNMEA2000Handler NMEA2000Handlers[]={
  {129025L,&PositionRapid},
  {0,0}
};

template<typename T> void PrintLabelValWithConversionCheckUnDef(const char* label, T val, double (*ConvFunc)(double val)=0, bool AddLf=false ) {
  Serial.print(label);
  if (!N2kIsNA(val)) {
    if (ConvFunc) { Serial.print(ConvFunc(val)); } 
    else { Serial.print(val); }
  } 
  else Serial.print("not available");
  if (AddLf) Serial.println();
}

void setup() {
  Serial.begin(115200);
  Serial.println("NMEA2000 PGN 129025 PositionRapid als Klartext ausgeben");
  NMEA2000.EnableForward(false);
  NMEA2000.SetMsgHandler(HandleNMEA2000Msg);
  NMEA2000.Open();
}

void loop() {
  NMEA2000.ParseMessages();
}

void PositionRapid(const tN2kMsg &N2kMsg) {
// PGN 129025 LAT & LON, Rapid Update.
// kommt typisch 10x pro Sekunde
double Latitude;
double Longitude;
    
  if (ParseN2kPositionRapid(N2kMsg,Latitude,Longitude) ) {
    Serial.print("Breite: ");
    Serial.print(Latitude,5);
    Serial.print(" Laenge: ");
    Serial.println(Longitude,5);
  }
  else {
    Serial.print("Fehler PGN: ");
    Serial.println(N2kMsg.PGN);
  }
}

void HandleNMEA2000Msg(const tN2kMsg &N2kMsg) {
int iHandler;
  
  for (iHandler=0; NMEA2000Handlers[iHandler].PGN!=0 && !(N2kMsg.PGN==NMEA2000Handlers[iHandler].PGN); iHandler++);
  if (NMEA2000Handlers[iHandler].PGN!=0) {
    NMEA2000Handlers[iHandler].Handler(N2kMsg); 
  }
}

Verwendet wurden:
Arduino Software 1.8.0
NMEA Shield Version 1.7
Arduino Mega 2560
NMEA2000 GPS Antenne

von Matthias Busse

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.