Arduino tabanlı GPS mesafe ölçer için kod içerir. GPS modülü için gerekli kütüphaneyi de kurduğunuzdan emin olun. Aşağıdan indirin. Kütüphaneyi kurun, derleyin ve kodu Arduino'ya yükleyin.
Zip dosyasını indirin veya aşağıdan kopyalayıp yapıştırın. Koddaki tüm yorumları okuyun!
sch_1.jpg
Zip dosyasını indirin veya aşağıdan kopyalayıp yapıştırın. Koddaki tüm yorumları okuyun!
sch_1.jpg
Code:
#include <SoftwareSerial.h> #include <TinyGPS.h> /* This sample code demonstrates the normal use of a TinyGPS object. It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). Code: http://www.electronoobs.com/eng_arduino_tut87_code1.php Schematic: http://www.electronoobs.com/eng_arduino_tut87_sch1.php SUBSCRIBE: http://youtube.com/c/ELECTRONOOBS */ TinyGPS gps; SoftwareSerial ss(4, 3); int battery = A0; static void smartdelay(unsigned long ms); static void print_float(float val, float invalid, int len, int prec); static void print_int(unsigned long val, unsigned long invalid, int len); static void print_date(TinyGPS &gps); static void print_str(const char *str, int len); float start_lat, start_lon, flat, flon; unsigned long age, date, time, chars = 0; unsigned short sentences = 0, failed = 0; int Altitude_S = 0; int Altitude_F = 0; int Altitude = 0; void setup() { analogReference(INTERNAL); //Internal 1.1V reference pinMode(battery, INPUT); Serial.begin(115200);//or 9600 ss.begin(9600); gps.f_get_position(&start_lat, &start_lon, &age); } void loop() { if(Serial.available()>0) { String Received = Serial.readString(); //Save the received String in the Received variable if(int(Received[0]) == 0) //If the first character of "Received" is "0" //Distance start mode { gps.f_get_position(&start_lat, &start_lon, &age); int latitude = start_lat; int longitude = start_lon; float lat_dec = (start_lat - latitude); lat_dec = lat_dec * 1000000; long lat_dec_int = long(lat_dec); //lat_dec_int = abs(lat_dec_int); float long_dec = start_lon - longitude; long_dec = long_dec*1000000; long long_dec_int = long(long_dec); //long_dec_int = abs(long_dec_int); Serial.print("log.txt="); //We print the "variable" we want to change on the screen Serial.write(0x22); Serial.print("START point coordinates are stored"); //Print the "value" we want to be displayed Serial.write(0x22); Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); Serial.print("lat.val="); //Print the "variable" we want to change Serial.print(latitude); //Print the "value" we want to be displayed Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); Serial.print("lat_dec.val="); //Print the "variable" we want to change Serial.print(lat_dec_int); //Print the "value" we want to be displayed Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); Serial.print("long.val="); Serial.print(longitude); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); Serial.print("long_dec.val="); Serial.print(long_dec_int); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); smartdelay(1000); } if(int(Received[0]) == 1) //If the first character of "Received" is "1" //distance finish mode { gps.f_get_position(&flat, &flon, &age); smartdelay(100); int distance = TinyGPS::distance_between(flat, flon, start_lat, start_lon); gps.f_get_position(&start_lat, &start_lon, &age); Serial.print("distance.val="); //We print the "variable" we want to change on the screen Serial.print(distance); //Print the "value" we want to be displayed Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); Serial.print("log.txt="); Serial.write(0x22); Serial.print("Distance between START and FINSIH was calculated"); Serial.write(0x22); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); smartdelay(1000); gps.stats(&chars, &sentences, &failed); } if(int(Received[0]) == 2) //If the first character of "Received" is "2" //Altitude start mode { Altitude_S = gps.f_altitude(); Serial.print("log.txt="); Serial.write(0x22); Serial.print("Altitude START point was stored"); Serial.write(0x22); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); Serial.print("alt_s.val="); Serial.print(Altitude_S); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); smartdelay(1000); } if(int(Received[0]) == 3) //If the first character of "Received" is "3" Altitude finish mode { Altitude_F = gps.f_altitude(); Altitude = Altitude_F - Altitude_S; Serial.print("log.txt="); Serial.write(0x22); Serial.print("Altitude FINISH point was stored and altitude difference calculated"); Serial.write(0x22); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); Serial.print("alt_f.val="); Serial.print(Altitude_F); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); Serial.print("altitude.val="); Serial.print(Altitude); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); smartdelay(1000); } }//end if serial available int battery_level = map(analogRead(battery),814,977,10,100); battery_level = constrain(battery_level,10,100); //977 analog read = 4.2V using a divider of R2=10K and R1=30K; 812 = 3.5V (low battery) Serial.print("battery.val="); //We print the variable we want to cahnge on the screen Serial.print(battery_level); //Print the value we want to be displayed Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); int satelites = gps.satellites(); if(satelites < 50) { Serial.print("satelites.val="); //We print the variable we want to cahnge on the screen Serial.print(satelites); //Print the value we want to be displayed Serial.write(0xff); //Always add 3 full bytes after... Serial.write(0xff); Serial.write(0xff); } smartdelay(1000); } //GPS functions. See TtinyGPS library example for more static void smartdelay(unsigned long ms) { unsigned long start = millis(); do { while (ss.available()) gps.encode(ss.read()); } while (millis() - start < ms); } static void print_float(float val, float invalid, int len, int prec) { if (val == invalid) { 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 print_int(unsigned long val, unsigned long invalid, int len) { char sz[32]; if (val == invalid) strcpy(sz, "*******"); else 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 print_date(TinyGPS &gps) { int year; byte month, day, hour, minute, second, hundredths; unsigned long age; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); if (age == TinyGPS::GPS_INVALID_AGE) Serial.print("********** ******** "); else { char sz[32]; sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ", month, day, year, hour, minute, second); Serial.print(sz); } print_int(age, TinyGPS::GPS_INVALID_AGE, 5); smartdelay(0); } static void print_str(const char *str, int len) { int slen = strlen(str); for (int i=0; i<len; ++i) Serial.print(i<slen ? str[i] : ' '); smartdelay(0); }