GPS логгер
- Войдите на сайт для отправки комментариев
Изначально я открыл тему в ветке "Проекты" но уже задолбали советами перенеси... Перенес, вот только судя по предыдущим советам с 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?
Как я понял 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 карту.
судя по предыдущим советам с NMEA протоколом никто толком не работал...
для работы с NMEA никаких особых талантов не нужно - это текстовой протокол и разбирается он соответвенно - как строка
Прямо в этом же разделе форума на этой же странице - свежая тема посвещенная NMEA
http://arduino.ru/forum/programmirovanie/parsing-nmea
Еше один умник подтвердил всказаное мною в начале предположение "судя по предыдущим советам с NMEA протоколом никто толком не работал..." - суть совета: ты не смотри что библиотека TinyGPS уже умеет вытаскивать и выводить в COM порт нужные тебе значения(как описанно здесь), а именно эти:
Изучи весьма неслабый обьем по работе тексотм, изобрети велосипед, напиши парсер, а все почему? Да автор совета просто сам нифига не знает про TinyGPS, соответственно и подсказать как нужно задать вопрос библиотеке для получения нужных данных не может, сам не знает...
Я понимаю что днные скорее всего выводятся в виде char и это будут числа от 48 до 56 для цифр и 127 для пробелов, но собрать из них десятичное числос помощью if проще чем парсер писать....