GPS логгер
- Войдите на сайт для отправки комментариев
Взялся за создание автономного 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. Причем именно точку, не запатую...
К сожалению автор статьи данный аспект не осветил, когда искал примеры в интернете то видел что в некоторых на экран выводятся координаты уже с точкой - подскажите пожайлуста как это сделать?
На форуме нашел вроде подходящий пример, http://arduino.ru/forum/programmirovanie/pomogite-ponyat-gps
Но там используется библиотека TinyGPS++ - где скачать не понятно....
А от чего - ахринеть?
Но там используется библиотека TinyGPS++ - где скачать не понятно....
Достаточно набрать в гугле TinyGPS++.h и зайти по первой же ссылке на гитхаб.
Победил дурную регистрацию на "гитхаб", дело сдвинулось с мертвой точки
#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 как то совершенно нечитаемо!?
Подскажите как вернуть привычный формат даты?
Экран индикатора сейчас выглядит так:
Подозреваю что с отображением минут/часов будет таже фигня что и с датой...
А от чего - ахринеть?
Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов.
При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей.
Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов.
При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей.
и еще предполагается, что автор хоть чуть-чуть что-то знает... а не задает вопросы. как в число десятичную точку добавить или как в дату вставить лидирующий нуль.
И еще мне понравилась фраза "победил регистрацию на Гитхабе". ДЛЯ ЧЕГО? скачать библиотеку - регистрация вообще не нужна
Для начала:
"Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов." - если бы я вкинул кусок кода не указывая авторства по вашему было бы лучше?
"При этом автор должен не сам задавть вопросы, а отвечать на вопросы читателей." - увы у автора образование в части програмирования 1 или 2 семестра Бейсика в институте, остальное самоучка. Пока дело качается переменных, простых циклов и условий особых проблем нет, но тут все завязанно на библиотеку на которую описания нет, нормальных паримеров тоже нет.
>95% примеров из интернета ограничиваются долгота, широта, высота, скорость и такое впечталение что их авторы больше сами нихрена не знают...
"И еще мне понравилась фраза "победил регистрацию на Гитхабе". ДЛЯ ЧЕГО? скачать библиотеку - регистрация вообще не нужна" - я не знаю как так получилась, но те ссылки по которым переходил для скачивания TinyGPS++ требовали регистрацию, если кое кто забыл что в браузерах сейчпас очень популярно автозапение/автологин и не дал конкретную ссылку то теперь пусть помолчит, покрайней мере до того момента когда научится давать более конкретные ответы...
Вам намекают на то, что тема начата в несоответствующем разделе.
Теперь о деле, воткнуть точку в нужное место оказалось очень просто, нужно только получать координаты от библиотеке в виде long, а віводить на печать в виде float разделив на 1 000 000.
Нашел статью http://cxem.net/arduino/arduino123.php где хоть как то прокоментирован на руском стандартный пример работы с библиотекой (Файл - Примеры - TinyGPS - test_with_gps_device), обрадывался и почти сразу нарвался на облом - как не извращался не могу получить из этих строк примера переменую:
Как я понял 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;}Кто может подсказать как получить в виде числовых переменных количество спутников и погрешность?
"Раздел "Проекты" предназначен для размещения своих (а не чужих!) проектов." - если бы я вкинул кусок кода не указывая авторства по вашему было бы лучше?
Было бы лучше, если бы Вы придерживались принятых правил сетевой этики.
Кто может подсказать как получить в виде числовых переменных количество спутников и погрешность?
Для начала выкинуть библиотеку TinyGPS и разбирать сообщение от датчика самостоятельно.