Die Entfernung und die Peilung sollen von Position 1 (Länge / Breite) zu Position 2 (Länge / Breite) berechnet werden. Dabei werden beide Positionen in Grad mit Kommastellen eingegeben. Die Software soll auf dem Arduino laufen.
Die Distanz wird in m und sm (Seemeilen) ausgegeben, die Peilung in Grad 0….359 Grad.
Zum Testen wird die Position 2 um 3 Grad nach Norden verlegt. Das sind 3 x 60 sm also 180 sm und die Peilung ist Nord also 0 Grad.
Das Programm
// Entfernung und Peilung zwischen zwei Positionen berechnen // beide Längen und Breiten werden in Grad eingegeben // Vorlage von http://forum.arduino.cc/index.php?topic=45760.0 // // Matthias Busse Version 1.0 vom 25.11.2014 double breite1=54.0; // Position 1 double laenge1=10.0; double breite2=57.0; // Position 2 double laenge2=10.0; // 3 Grad nördlich sind Distanz 180 sm, Peilung 0 Grad double distanz, peilung; void setup() { Serial.begin(4800); } void loop() { Serial.print("Distanz (M): "); distanz = CalcDistanz(breite1,laenge1,breite2,laenge2)/1852.216; // 1852 m = 1 Seemeile Serial.println(distanz,2); Serial.print("Peilung (Grad): "); peilung = CalcPeilung(breite1,laenge1,breite2,laenge2); Serial.println(peilung,2); delay(5000); } double CalcDistanz(double breite1, double laenge1, double breite2, double laenge2) { // Berechnet die Distance vom breite1/laenge1 zu breite2/laenge2 in Grad // Rückgabe Distance in m // Matthias Busse 25.11.2014 Version 1.0 double dlaenge, dbreite, a, c; double dist = 0.0; dlaenge = gtor(laenge2 - laenge1); dbreite = gtor(breite2 - breite1); a = pow(sin(dbreite/2),2) + cos(gtor(breite1)) * cos(gtor(breite2)) * pow(sin(dlaenge/2),2); c = 2.0 * atan2(sqrt(a), sqrt(1-a)); dist = 6371001 * c; //Radius der Erde (6378140 m am Äquator / 6371001 m im Mittel) return dist; } double CalcPeilung(double breite1, double laenge1, double breite2, double laenge2) { // Berechnet die Peilung von breite1/laenge1 zu breite2/laenge2 in Grad // Ausgabe Peilung in Grad // Matthias Busse 25.11.2014 Version 1.0 breite1 = gtor(breite1); laenge1 = gtor(laenge1); breite2 = gtor(breite2); laenge2 = gtor(laenge2); // Winkel berechnen double peil = atan2(sin(laenge2-laenge1)*cos(breite2), (cos(breite1)*sin(breite2))-(sin(breite1)*cos(breite2)*cos(laenge2-laenge1))); peil = rtog(peil); // in Grad umrechnen peil = fmod((peil + 360.0), 360); // mod macht -90 zu 270 return peil; } double gtor(double fgrad){ // Grad in Rad umwandeln return(fgrad * PI / 180); } double rtog(double frad){ // Rad in Grad umwandeln return(frad * 180.0 / PI); }
von Matthias Busse
Pingback: NMEA2000 Ankeralarm mit dem Arduino aufgebaut | Shelvin – Elektronik ausprobiert und erläutert