GPS логгер

AS31979
Offline
Зарегистрирован: 22.12.2015

Взялся за создание автономного GPS логгера с большим временем автономной работы с упором именно на пониженное энергопотребление.

Сначала хотел взять за основу https://pluspda.ru/blog/aliexpress/39653.html - аппаратный COM порт + минимальная нагрузка на микроконтролер. Но столкнулся с тем что записанное таким логгером ни одна  программа под виндой читать не желает...(у автора небольшой косяк с открытием/закрытием файла)

Нашел второй вариант https://pluspda.ru/blog/aliexpress/62773.html  больше на грузка на микроконтролер, не аппаратный COM порт, зато выдает данные в удобо читаемом варианте, и фактически решена задача установки меток.  Экран потребляет мизерный ток, но дает широчайшие возможности в плане индикации.

Зато вылезла другая засада - в Excel  все зашло со свистом, логгер пишет 47907878 / 33329908, а вот Google Earth Pro требует координат вида 47.907878 / 33.329908. Причем именно точку, не запатую...

К сожалению автор статьи данный аспект не осветил, когда искал примеры в интернете то видел что в некоторых на экран выводятся координаты уже с точкой - подскажите пожайлуста как это сделать?

AS31979
Offline
Зарегистрирован: 22.12.2015

На форуме нашел вроде подходящий пример, http://arduino.ru/forum/programmirovanie/pomogite-ponyat-gps

Но там используется библиотека TinyGPS++ - где скачать не понятно....

А от чего - ахринеть?

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Цитата:

Но там используется библиотека TinyGPS++ - где скачать не понятно....

Достаточно набрать в гугле TinyGPS++.h и зайти по первой же ссылке на гитхаб.

AS31979
Offline
Зарегистрирован: 22.12.2015

Победил дурную регистрацию на "гитхаб", дело сдвинулось с мертвой точки

#include <SoftwareSerial.h>
//#include <TinyGPS.h>
#include <TinyGPS++.h>
#include <PCD8544.h>
#include <SD.h> //CS-D10, MOSI-D11, MISO-D12, SCK-D13, GND — GND, 5V — VCC (опционально в моем случае, в некоторых при отсутствии преобразователя подключаем на 3.3В)
File GPS_file;
TinyGPSPlus gps;
SoftwareSerial gpsSerial(2, 8);//RX - 8 pin, TX - 2 pin

static PCD8544 lcd; //RST - D6, CE - D7, DC - D5, DIN - D4, CLK - D3, VCC - 5V (опционально, при наличии преобразователя на 3.3В линии), Light - GND, GND - GND
bool newdata = false;
unsigned long start;
//////////////////////////////////long lat, lon; 
float lat, lng;/////////////////////////////////
unsigned long time, date;


void setup() {
  
lcd.begin(84, 48);
gpsSerial.begin(9600);
Serial.begin(9600);

pinMode(10, OUTPUT);
if (!SD.begin(10)){
lcd.setCursor(0, 0);
lcd.println("SD-");
return;}
lcd.setCursor(0, 0);
lcd.println("SD+");
GPS_file = SD.open("GPSLOG.txt", FILE_WRITE);
if (GPS_file){
Serial.print("Writing to test.txt...");
GPS_file.print("LATITUDE");
GPS_file.print(",");
GPS_file.print("LONGITUDE");
GPS_file.print(",");
GPS_file.print("DATE");
GPS_file.print(",");
GPS_file.print("TIME");
GPS_file.print(",");
GPS_file.print("ALTITUDE");
GPS_file.println();
GPS_file.close();
Serial.println("done.");
}else{
    Serial.println("error opening test.txt");
}

lcd.setCursor(0,3);
lcd.print("ALT: ");
lcd.setCursor(0,2);
lcd.print("SPD: ");
lcd.setCursor(0,4);
lcd.print("LAT: ");
lcd.setCursor(0,5);
lcd.print("LON: ");
}  
void loop() {
if (millis() - start > 1000){
newdata = readgps();
if (newdata){
start = millis();
gps.encode(gpsSerial.read());//////////////////////////
//////////////////////////gps.get_position(&lat, &lon);
////////////////////////gps.get_datetime(&date, &time);

lcd.setCursor(10,1);
lcd.print(gps.date.day());
lcd.setCursor(30,1);
lcd.print(gps.date.month());
lcd.setCursor(50,1);
lcd.print(gps.date.year());
lcd.setCursor(55,0);
lcd.print(gps.time.hour()+3);
lcd.print(gps.time.minute());
lcd.setCursor(22, 4);
lcd.print(gps.location.lat(),6);
lcd.setCursor(22, 5);
lcd.print(gps.location.lng(),6);
lcd.setCursor(22, 2);
////////////////////////lcd.print(gps.f_speed_kmph());
lcd.setCursor(22, 3);
//////////////////////////lcd.print(gps.f_altitude());
}

}

GPS_file = SD.open("GPSLOG.txt", FILE_WRITE);
if(GPS_file){
GPS_file.print(gps.location.lat(),6);
GPS_file.print(",");
GPS_file.print(gps.location.lng(),6);
GPS_file.print(",");
GPS_file.print(date);
GPS_file.print(",");
GPS_file.print(time*0.000001+3);
GPS_file.print(",");
//GPS_file.print(gps.f_altitude());
GPS_file.println();
GPS_file.close();
}else{
  lcd.setCursor(0, 0);
lcd.println("SD-");
}
}
bool readgps(){
while (gpsSerial.available()){
int b = gpsSerial.read();
if('\r' != b){
if (gps.encode(b))
return true;}}
return false;}

Точка ставится куда нужно, Google Earth Pro соглашается принимать точки. Отображение скорости и высоты не делал - для пешеходного туризма бешенная погрешность делает их безполезными.

/// этими значками закоментированны/помеченныглавные изменения

Зато теперь вылезла проблемма с отображением времени!!! Для библиотеки TinyGPS дата, месяц и год получалось взять одной строкой  "lcd.print(date);" то теперь приходится собиратьз 3-х, да еще и если число день/месяц однозначное 0 перед ним не ставится!

На экран то я дату вывел(подозреваю что через жопу), но возникает проблемма - как теперь в лог писать дату -  952019 вместо 09052019 как то совершенно нечитаемо!?

Подскажите как вернуть привычный формат даты?


 

AS31979
Offline
Зарегистрирован: 22.12.2015

Экран индикатора сейчас выглядит так:

Подозреваю что с отображением минут/часов будет таже фигня что и с датой...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AS31979 пишет:

А от чего - ахринеть?

Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов.

При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей.

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов.

При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей.

и еще предполагается, что автор хоть чуть-чуть что-то знает... а не задает вопросы. как в число десятичную точку добавить или как в дату вставить лидирующий нуль.

И еще мне понравилась фраза "победил регистрацию на Гитхабе". ДЛЯ ЧЕГО? скачать библиотеку - регистрация вообще не нужна

AS31979
Offline
Зарегистрирован: 22.12.2015

Для начала:

"Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов." - если бы я вкинул кусок кода не указывая авторства по вашему было бы лучше?

"При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей." - увы у автора образование в части програмирования 1 или 2 семестра Бейсика в институте, остальное самоучка. Пока дело качается переменных, простых циклов и условий особых проблем нет, но тут все завязанно на библиотеку на которую описания нет, нормальных паримеров тоже нет.

>95% примеров из интернета ограничиваются долгота, широта, высота, скорость и такое впечталение что их авторы больше сами нихрена не знают...

"И еще мне понравилась фраза "победил регистрацию на Гитхабе". ДЛЯ ЧЕГО? скачать библиотеку - регистрация вообще не нужна" - я не знаю как так получилась, но те ссылки по которым переходил для скачивания TinyGPS++ требовали регистрацию, если кое кто забыл что в браузерах сейчпас очень популярно автозапение/автологин и не дал конкретную ссылку то теперь пусть помолчит, покрайней мере до того момента когда научится давать более конкретные ответы...

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам намекают на то, что тема начата в несоответствующем разделе.

AS31979
Offline
Зарегистрирован: 22.12.2015

Теперь о деле, воткнуть точку в нужное место оказалось очень просто, нужно только получать координаты от библиотеке в виде long, а віводить на печать в виде float разделив на 1 000 000.

Нашел статью http://cxem.net/arduino/arduino123.php где хоть как то прокоментирован на руском стандартный пример работы с библиотекой (Файл - Примеры - TinyGPS - test_with_gps_device), обрадывался и почти сразу нарвался на облом - как не извращался не могу получить из этих строк примера переменую:

print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
//Количество спутников
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
//Горизонтальная точность

Как я понял gps.satellites()- вычислить/парсить нужную величину, TinyGPS::GPS_INVALID_SATELLITES - это уже ее получение...

Вот скетч который я пробовал - неудачные варианты закоментированны, бредятина получается

#include <SoftwareSerial.h>
#include <TinyGPS.h>/////////////////
#include <PCD8544.h>
#include <SD.h> //CS-D10, MOSI-D11, MISO-D12, SCK-D13, GND — GND, 5V — VCC (опционально в моем случае, в некоторых при отсутствии преобразователя подключаем на 3.3В)
File GPS_file;
TinyGPS gps;
SoftwareSerial gpsSerial(2, 8);//RX - 8 pin, TX - 2 pin

static PCD8544 lcd; //RST - D6, CE - D7, DC - D5, DIN - D4, CLK - D3, VCC - 5V (опционально, при наличии преобразователя на 3.3В линии), Light - GND, GND - GND
bool newdata = false;
unsigned long start;
long lat, lon;
unsigned long time, date;

float lat2;//////Переменная для вывода координат с точкой
float lon2;//////Переменная для вывода координат с точкой
byte Sats;//////Переменная для количества спутников
long HDOP;//////Переменная для погрешности


void setup() {
  
lcd.begin(84, 48);
gpsSerial.begin(9600);
Serial.begin(9600);

pinMode(10, OUTPUT);
if (!SD.begin(10)){
lcd.setCursor(0, 0);
lcd.println("SD-");
return;}
lcd.setCursor(0, 0);
lcd.println("SD+");
GPS_file = SD.open("GPSLOG.txt", FILE_WRITE);
if (GPS_file){
Serial.print("Writing to test.txt...");
GPS_file.print("LATITUDE");
GPS_file.print(",");
GPS_file.print("LONGITUDE");
GPS_file.print(",");
GPS_file.print("DATE");
GPS_file.print(",");
GPS_file.print("TIME");
GPS_file.print(",");
GPS_file.print("ALTITUDE");
GPS_file.println();
GPS_file.close();
Serial.println("done.");
}else{
    Serial.println("error opening test.txt");
}

lcd.setCursor(0,3);
lcd.print("HDOP: ");
lcd.setCursor(0,2);
lcd.print("Sats: ");
lcd.setCursor(0,4);
lcd.print("LAT : ");
lcd.setCursor(0,5);
lcd.print("LON : ");
} 

 
void loop() {
if (millis() - start > 1000){
newdata = readgps();
if (newdata){
start = millis();
gps.get_position(&lat, &lon);
gps.get_datetime(&date, &time);
//Так не идет вообще - компилятор пишет нет такой функции...
//gps.satellites(&Sats);
//gps.hdop(&HDOP);
//Так идет, но на выходе бред Sats=255, HDOP=-1
//Sats=(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES);
//HDOP=(gps.hdop(), TinyGPS::GPS_INVALID_HDOP);

lat2=lat;///////////////////////
lon2=lon;///////////////////////
lat2=lat2/1000000;///////////////////////
lon2=lon2/1000000;///////////////////////

lcd.setCursor(48,1);
lcd.print(date);
lcd.setCursor(55,0);
lcd.print(time*0.000001+3);
lcd.setCursor(30, 4);
lcd.print(lat2,6);
lcd.setCursor(30, 5);
lcd.print(lon2,6);
lcd.setCursor(30, 2);
//Тоже непонятки - показывает от 10 до 15 спутников
lcd.print(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES);//////////////
lcd.setCursor(30, 3);
//Аннологичные непонятки - показывает 14640
lcd.print(gps.hdop(), TinyGPS::GPS_INVALID_HDOP);//////////////
}
}
GPS_file = SD.open("GPSLOG.txt", FILE_WRITE);
if(GPS_file){
GPS_file.print(lat2,6);////////////////////////
GPS_file.print(",");
GPS_file.print(lon2,6);////////////////////////
GPS_file.print(",");
GPS_file.print(date);
GPS_file.print(",");
GPS_file.print(time*0.000001+5);
GPS_file.print(",");
GPS_file.print(gps.f_altitude());
GPS_file.println();
GPS_file.close();
}else{
  lcd.setCursor(0, 0);
lcd.println("SD-");
}
}
bool readgps(){
while (gpsSerial.available()){
int b = gpsSerial.read();
if('\r' != b){
if (gps.encode(b))
return true;}}
return false;}

Кто может подсказать как получить в виде числовых переменных количество спутников и погрешность?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AS31979 пишет:

"Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов." - если бы я вкинул кусок кода не указывая авторства по вашему было бы лучше?

Было бы лучше, если бы Вы придерживались принятых правил сетевой этики.

AS31979 пишет:

Кто может подсказать как получить в виде числовых переменных количество спутников и погрешность?

Для начала выкинуть библиотеку TinyGPS и разбирать сообщение от датчика самостоятельно.