Menu

 

 

A neten nem egy lokátor számoló programot és web oladalt találtam, de most, hogy elkezdtem foglalkozni az arduinoval, eszembe jutott, hogy egy GPS modulal bizonyára ezt real time is lehet számolni. Kis kutatás és kérdezősködés után egy amatőr ismerősömtől kaptam egy leírást N1SV tollából. Miután áttanulmányoztam az írást, ami jó formán csak matematikai alapműveleteket tartalmaz, megoldhatónak láttam a problémát. Maga a program nem nagy, egy Arduino Nanoban is könnyedén elfér. A programban egy szabvány Hitachi kijelzőt használtam, de bármilyen kijelző alkalmas amin legalább 8 karakter elfér. Leginkább kitelepülésnél hasznos, ezért a végleges verzió a kocsiba kerül. A programot nagyon magyarázni nem kell, a számolási rész könnyen átlátható. A fotó egyelőre csak a teszt példányról készült, a véglegesről később készítek fotót, vagy videót.

 

 

Íme a program:


#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


static const int RXPin = 10, TXPin = 11;
static const uint32_t GPSBaud = 9600;

// A TinyGPS++ object
TinyGPSPlus gps;

// A soros kapcsolat a GPS-vel

SoftwareSerial ss(RXPin, TXPin);
LiquidCrystal_I2C lcd(0x3f, 16, 2);

//Változók
float hossz1 = 0;
float hossz12 = 0;
float szeles1 = 0;
float szeles12 = 0;

float hossz2 = 0;
float hossz21 = 0;
float hossz22 = 0;

float szeles2 = 0;
float szeles21 = 0;
float szeles22 = 0;

float hossz3 = 0;
float hossz31 = 0;
float hossz32 = 0;

float szeles3 = 0;
float szeles31 = 0;
float szeles32 = 0;

float hossz4 = 0;
float hossz41 = 0;

float szeles4 = 0;
float szeles41 = 0;

int loc_temp1 = 0;
int loc_temp2 = 0;
int loc_temp3 = 0;
int loc_temp4 = 0;
int loc_temp5 = 0;
int loc_temp6 = 0;
int loc_temp7 = 0;
int loc_temp8 = 0;


char Ucase[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

String char1 = ""; //minta: J
String char2 = ""; //minta: N
int char3 = 0;     //minta: 9
int char4 = 0;     //minta: 7
String char5 = ""; //minta: N
String char6 = ""; //minta: N
int char7 = 0;     //minta: 2
int char8 = 0;     //minta: 4



void setup() {
 // put your setup code here, to run once:
 ss.begin(GPSBaud);
 Serial.begin(38400);
 lcd.init();
 lcd.backlight();
 Wire.begin();
 delay(1000);
 lcd.clear();

}

void loop() {
 printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
 Serial.println();
 Serial.print("LAT:");
 printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
 Serial.println();
 Serial.print("LNG:");
 printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
 Serial.println();


 // A Lokátor számítása


 // A lokátor első karaktere
 hossz1 = (gps.location.lng() + 180 ) / 20;
 loc_temp1 = hossz1;
 hossz12 = hossz1 - loc_temp1;
 char1 = Ucase[loc_temp1];
 hossz2 = hossz12 * 20;

 // A lokátor második karaktere
 szeles1 = (gps.location.lat() + 90) / 10;
 loc_temp2 = szeles1;
 szeles12 = szeles1 - loc_temp2;
 char2 = Ucase[loc_temp2];
 szeles2 = szeles12 * 10;

 // A lokátor harmadik karaktere
 hossz21 = hossz2 / 2;
 loc_temp3 = hossz21;
 hossz22 = hossz21 - loc_temp3;
 char3 = loc_temp3;
 hossz3 = hossz22 * 2;

 //A lokátor negyedik karaktere
 szeles21 = szeles2 / 1;
 loc_temp4 = szeles21;
 szeles22 = szeles21 - loc_temp4;
 char4 = loc_temp4;
 szeles3 = szeles22;

 //A lokátor ötödik karaktere
 hossz31 = hossz3 / 0.083333;
 loc_temp5 = hossz31;
 hossz32 = hossz31 - loc_temp5;
 char5 = Ucase[loc_temp5];
 hossz4 = hossz32 * 0.083333;

 //A lokátor hatodik karaktere
 szeles31 = szeles3 / 0.0416665;
 loc_temp6 = szeles31;
 szeles32 = szeles31 - loc_temp6;
 char6 = Ucase[loc_temp6];
 szeles4 = szeles32 * 0.0416665;

 //A lokátor hetedik karaktere
 hossz41 = hossz4 / 0.008333;
 loc_temp7 = hossz41;
 char7 = loc_temp7;


 //A lokátor nyolcadik karaktere
 szeles41 = szeles4 / 0.004166;
 loc_temp8 = szeles41;
 char8 = loc_temp8;



 lcd.setCursor(0, 0);
 lcd.print("LOCATOR  HA50CFJ");
 lcd.setCursor(0, 1);
 lcd.print("    " + char1 + char2 + String(char3) + String(char4) + char5 + char6 + String(char7) + String(char8));
 Serial.print("LOCATOR ");
 Serial.println(" " + char1 + char2 + String(char3) + String(char4) + char5 + char6 + String(char7) + String(char8));
delay(400);
}//Loop vége


// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
 unsigned long start = millis();
 do
 {
   while (ss.available())
     gps.encode(ss.read());
 } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
 if (!valid)
 {
   while (len-- > 1)
     Serial.print('*');
   Serial.print(' ');
 }
 else
 {
   Serial.print(val, prec);
   int vi = abs((int)val);
   int flen = prec + (val < 0.0 ? 2 : 1); // . and -
   flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
   for (int i = flen; i < len; ++i)
     Serial.print(' ');
 }
 smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
 char sz[32] = "*****************";
 if (valid)
   sprintf(sz, "%ld", val);
 sz[len] = 0;
 for (int i = strlen(sz); i < len; ++i)
   sz[i] = ' ';
 if (len > 0)
   sz[len - 1] = ' ';
 Serial.print(sz);
 smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
 if (!d.isValid())
 {
   Serial.print(F("********** "));
 }
 else
 {
   char sz[32];
   sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
   Serial.print(sz);
 }

 if (!t.isValid())
 {
   Serial.print(F("******** "));
 }
 else
 {
   char sz[32];
   sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
   Serial.print(sz);
 }

 printInt(d.age(), d.isValid(), 5);
 smartDelay(0);
}

static void printStr(const char *str, int len)
{
 int slen = strlen(str);
 for (int i = 0; i < len; ++i)
   Serial.print(i < slen ? str[i] : ' ');
 smartDelay(0);
}