GPS модуль готовый ко всем неожиданностям.
- Войдите на сайт для отправки комментариев
Пнд, 24/09/2018 - 15:02
Приветствую, форумчане. Имеется набор Arduino UNO и GPS приемник NEO-6M. Недавно возник такой вопрос по поводу GPS модуля. Суть в том, что взяв стандартный пример из библиотеке TinyGPSPlus столкнулся с тем, что при принятии неверных данных с модуля на com-порт лишь выводится надпись "INVALID". Но решил, что зачем смотреть на эту запись и решил, что просто буду останавливать подачу данных на порт. Но теперь возник вопрос, как сделать так, что если сломался модуль и посылаются те же координаты, что и были ранее(минкт 5-10 назад), чтоб и их не пускать к отображению и например выводить надпись "Wait"?
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while(true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
while (!gps.location.isValid())
{
Serial.end();
}
Serial.begin(115200);
delay(100);
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
Serial.println();
}
А какое действие совершили бы вы, чтобы понять неизменна ваша номинальная зарплата в сентябре по отношению к майской или уменьшилась?
Я бы сравнил два значения между собой. Но встречный вопрос: а что бы вы делали, если бы устройство было частью системы,где за одну секунду приходят порядка десяти разных данных, при чем периоды прихода таких пачек хаотичны, но время и координаты одинаковы. Вот на таком моменте я и застрял.
Я бы начал с чесания головы в попытке формализовать описание ситуации "зависло". Что с вашей точки зрения аварийная ситуация - отсутствие обновления определенной метрики в течении некоего периода? Отсутствие обновления нескольких метрик? Незначительные колебания значения метрики в определенном диапазоне?
В этом случае аварийной ситуацией считаю такую, когда потеряна на время связь со спутниками, а данные приходят. В итоге тяжело выстраивать зависимость тех же погодных условий (температуры, давления,магнитных полей и более подробных данных). Я понимаю, что существует погрешность, но хотелось бы предусмотреть.
В этом случае аварийной ситуацией считаю такую, когда потеряна на время связь со спутниками, а данные приходят.
Ну, значит, и анализировать нужно спутники, а не координаты.
Хм. Спасибо. Я и не зудумался о такой возможности.Если я не ошибаюсь,то для нормальной работы нужна связь с 4 спутниками, то есть нужно проверять переменную sat.
При аварии кол-во спутников меняется при неизменности координат?
При аварии кол-во спутников меняется при неизменности координат?
Если этот вопрос ко мне - понятия не имею.
Я лишь анализирую сформулированный ТС критерий и указываю, какие из этого критерия следуют выводы.
Если критерий сформулирован верно, то моя подсказка - путь к решению. Но может оказаться и так, что вывод покажется неразумным или невыполнимым. В этом случае нужно будет переформулировать критерий.
В любом случае для решения задачи (или детектирования ошибки) следует сформулировать критерий и осуществлять проверку именно по этому критерию. Это, - казалось бы, очевидная вещь, но часто на практике об этом забывают.
Да, ваша посдсказка со спутниками помогла. Но смоделировал такую ситуацию, что при работе устройства неожиданно сгорает модуль. Самое интересное, что продолжают писаться координаты и время, которые были переданы ранее. При чем сравнить предыдущую величину со следующей я не могу, так как приходят пачки с разной периодичностью. В цикле while на проверку последовательного порта Arduino начинает "выплёвывать" ошибки. Вот и не могу понять, что ему предоставить на проверку.
Надо либу ковырять - чего тут думать-то. Скорее всего заложен в нее алгоритм вытеснения старых данных новыми без учета некоего таймаута. Нет новых данных - в памяти болтаются старые, невытесненные.
Для обработки алгоритма использовал библиотеку TinyPLusGPS. Скорей всего она где-то их хранит, так как буфер порта пробывал очищать и не помогло(
Для обработки алгоритма использовал библиотеку TinyPLusGPS. Скорей всего она где-то их хранит, так как буфер порта пробывал очищать и не помогло(
ну так загляните в код библиотеки, не надо ее боятся - там такой же См, как и в вашем скетче
Заглянул и понял, как я позабыл теорию( Искал решения и понял, что лучше всего парсить код GPS, так как и места меньше займет и обработка данных быстрее. Плюс при отключении модуля, переменные точно будут обнулятся и процесс проверки упроститься. Но вот с парсингом всё плохо. После функции strtok я застрял. Не мог у понять, как разбитые строки присвоить в переменные, а тем более преобразовать в общий вид. Буду рад советам в плане литературы.
Так, например:
typedef struct { uint32_t timestamp; uint8_t status; ... } gprmc_t ; gprmc_t gprmc; ... fieldNumber = 0x00; while (ch) { ch = strtok(buffer, ','); switch (fieldNumber) { ... case 0x01: gprmc.timestamp = stringToTimeStamp(ch ); break; case 0x02: gprmc.status = (0 == strcmp(ch, "A")); break; ... } fieldNumber++; }Так, например:
typedef struct { uint32_t timestamp; uint8_t status; ... } gprmc_t ; gprmc_t gprmc; ... fieldNumber = 0x00; while (ch) { ch = strtok(buffer, ','); switch (fieldNumber) { ... case 0x01: gprmc.timestamp = stringToTimeStamp(ch ); break; case 0x02: gprmc.status = (0 == strcmp(ch, "A")); break; ... } fieldNumber++; }Это конечно всё красиво,но боюсь, что надо всё таки в учебник заглянуть. Получилось сделать временную структуру для проверки на стабильность, но она на строчек сто, при этом Расшифровывает только RMC, где беру координаты и дату со временем. Sadman41, подскажите пожалуйста книжку, или,если вам не будет трудно пару уроков с дом. заданием. Честно для меня неприятный пробел(
Учебники, как тут пишут опытные поросяты и коты, - это Керниган и Ритчи, да Страуструпп. Я-то сильно эти делом не увлекаюсь, мне двадцати операторов хватает на все ))
Тогда такой вопрос. Приходит сообщениие типа GPGGA и мы видим его в терминале в виде последовательность повторяющейся каждую секунду( в зависимости от интервала). Команда strtok позволяет разделить строку на подстроки опираясь на запятые, как разделительные знаки. Я не могу понять, как дальше эти строки внести в переменные и преобразовать.
Ну, я же вам показал пример: берете fieldNumber , которая будет обозначать номер поля (фрагмента) строки. strtok же фрагментами вам нарубит строку, так? Ну вот, значит, получили кусок, switch-ом проанализировали какой он по счету от начала, им же "положили" в желаемую переменную. Затем номер поля увеличили и опять strtok сделали. Затем вновь switch моможет по номеру фрагмента засунуть в нужную переменную. And again, again and again, пока strtok не вернет NULL, т.е. дойдет до конца строки.
Самый простой вариант, по-моему, с минимумом оверхеда.
Хорошо. Попробую сделать по вашему примеру.
вниз
вниз
Хорошо. Попробую сделать по вашему примеру.
strncmp – сравнение строк с ограничением количества сравниваемых символов.
strtok – разбиение строки на части по указанному разделителю.
может это поможет ?
Прошу прощения за молчание. Был немного занят другим. Вашему вниманию такая "простыня". И да, sadman41, ваш способ непонял всё равно.