GPS логгер

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

Изначально я открыл тему в ветке "Проекты" но уже задолбали советами перенеси... Перенес, вот только судя по предыдущим советам с NMEA протоколом никто толком не работал... Изнальная тема тут - http://arduino.ru/forum/proekty/gps-logger#comment-454549

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

Arduino Pro Mini - 8Мгц 3,3В - минумум "левых" потребителей энергии и штатные 3,3 В питания(меньше выпаивать лишние детали)

Приемник GPS G28U7FTTL - у него есть аппаратный вход EN, при подаче на него 0 - приемник засыпает

За питание отвечает хитрый Step-Down-Step-Up-Converter - любое напряжение от 1,8 до 5 В от переганяет в 3,3 вольта и собственное потребление мизерное.

Экран 5110 - сильно удився когда узнал насколько маленькое у него потребление, а информативность...

Li-Io и зарядок для него немерянно в любом магазине радиодеталей...

За основу был взят логгер из статьи https://pluspda.ru/blog/aliexpress/62773.html, с использованием прогрмамного COM порта пока мирюсь. Видимо автор в статье забыл описать какуе то тонкость  для конвертации результатов в Excel  и Google Earth Pro, пришлось допиливать скетч чтобы долгота и широта сразу писались в виде 47.907878,33.329908, а не 47907878,33329908.

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

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

  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);

Как минимум в СОМ порт эта информация уходит...

Беда в том что програмирования у меня 2 семестра Бейсика в институте, остальное самоучка, нормального описания возможностей TinyGPS нет. Если касается формул, работы с портами и простыми операторами проблем нет, но с библиотеками и вложенными функциями мозгов уже не хватает.

Подскажите как вытащить информацию о спутниках и погрешности желательно в виде byte, int или word?

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

Как я понял 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;}

В данный моменнтересует только та часть где идет вывод на LCD, записать на CD потом не проблема, я понимаю как работает тот кусок программы что пишет на CD карту.

b707
Онлайн
Зарегистрирован: 26.05.2017

AS31979 пишет:

судя по предыдущим советам с NMEA протоколом никто толком не работал...

для работы с NMEA никаких особых талантов не нужно - это текстовой протокол и разбирается он соответвенно - как строка

Прямо в этом же разделе форума на этой же странице - свежая тема посвещенная NMEA

http://arduino.ru/forum/programmirovanie/parsing-nmea

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

Еше один умник подтвердил всказаное мною в начале предположение "судя по предыдущим советам с NMEA протоколом никто толком не работал..." - суть совета: ты не смотри что библиотека TinyGPS уже умеет вытаскивать и выводить в COM порт нужные тебе значения(как описанно здесь), а именно эти:

 Изучи весьма неслабый обьем по работе тексотм, изобрети велосипед, напиши парсер, а все почему? Да автор совета просто сам нифига не знает про TinyGPS,  соответственно и подсказать как нужно задать вопрос библиотеке для получения нужных данных не может, сам не знает...

Я понимаю что днные скорее всего выводятся в виде char и это будут числа от 48 до 56 для цифр и 127 для пробелов, но собрать из них десятичное числос помощью if проще чем парсер писать....