Некорректно работает GPS (GY-NEO6MV2)

Всем привет, делаю проект, который использует данные GPS (Дата, время, местоположение). Есть скетч в котором GPS работает корректно, удается получить все необходимые данные, но при переносе в проект на выходе нет данных.
Код рабочий:

[code]
#include "TinyGPS++.h"
#include <SoftwareSerial.h>

static const int RXPin = 3, TXPin = 2;

TinyGPSPlus gps;
SoftwareSerial Serial_GPS(RXPin, TXPin);

void setup()
{
  Serial.begin(9600);
  Serial_GPS.begin(9600);
}


void loop()
{
  //Проверка подключения
  while (Serial_GPS.available() > 0)
    if (gps.encode(Serial_GPS.read())) {
      getGPS();
      delay(500);
    }
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while (true);
  }
}


void getGPS()
{
  //широта и долгота
  Serial.print(F("Location: "));
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6); //широта
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6); //долгота
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    if ((gps.time.hour() + 3) > 23) Serial.print(gps.date.day() + 1); //день
    else Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.month()); //месяц
    Serial.print(F("/"));
    Serial.print(gps.date.year()); //год
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    int now_hour = gps.time.hour() + 3;
    if (now_hour >= 24) now_hour - 24;
    if (now_hour < 10) Serial.print(F("0"));
    Serial.print(now_hour); //часы
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute()); //минуты
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second()); //секунды
    Serial.print(F("."));
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.println();
}
[/code]

И кусок кода проекта, до проверки актуальности gps все работает:

[code]
#include <LiquidCrystal_I2C.h>
#include "SD.h"
#include <DHT.h>
#include "iarduino_HC_SR04.h"
#include "TinyGPS++.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include <VL53L0X.h>

//Переменные
VL53L0X laz;
DHT dht(4, DHT21);
iarduino_HC_SR04 UZV(5, 6);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
TinyGPSPlus gps;
static const int RXPin = 3, TXPin = 2;
SoftwareSerial Serial_GPS(RXPin, TXPin);
const int SDchipSelect = 10;
const int PinKey = 8;
const int Pip = 9;
int Status = 0;
uint32_t ms;
bool button_state      = 0;
bool button_long_state = 0;
uint32_t ms_button = 0;
int t = 0;
int UZ = 0;

void setup() {
  Serial.begin(9600);
  Serial_GPS.begin(9600);
  dht.begin();
  Wire.begin();

  //Включение экрана
  lcd.init();
  lcd.backlight();

  //Пииип
  analogWrite(Pip, 1);
  delay(1000);
  analogWrite(Pip, 0);

  //Стартовый экран
  char s1[] = "Generation 2";
  char s2[] = "Initialisation...";
  char s3[] = "Done";
  char s4[] = "Temperature ";
  char s5[] = "Humidity ";
  lcd.setCursor(4, 0);
  for (int i = 0; i < strlen(s1); i++) {
    lcd.print(s1[i]);
    delay(100);
  }
  lcd.setCursor(2, 2);
  for (int i = 0; i < strlen(s2); i++) {
    lcd.print(s2[i]);
    delay(100);
  }

  //Кнопка
  pinMode(PinKey, INPUT_PULLUP);

  //Наличие SD
  while (!SD.begin(SDchipSelect)) {
    lcd.clear();
    delay(500);
    lcd.setCursor(7, 1);
    lcd.print("No SD!");
    delay(500);
  }

  //GPS проверка подключения
  while ((!gps.date.isValid() or !gps.time.isValid() or !gps.location.isValid()) && digitalRead(PinKey) == 1) {
    if (gps.date.isValid()) Serial.println("Date is valid");
    if (gps.time.isValid()) Serial.println("Time is valid");
    if (gps.location.isValid()) Serial.println("Location is valid");
    lcd.clear();
    delay(500);
    lcd.setCursor(3, 1);
    lcd.print("Waiting GPS...");
    delay(500);
  }

[/code]

Проблема в том, что код останавливается на проверке данных с GPS и код дальше не идет, и данных нет.
Заранее спасибо!

Внимательно перечитал текст, но так и не нашёл в нём ни вопроса, ни просьбы. Это было просто для нашей информации? Спасибо, принято к сведению.

Вопросы: В чем принципиальное различие между двумя программами, из-за которого модуль отказывается работать корректно? Как это можно исправить?

Ответ: вторая программа приведена неполностью, потому ничего сказать нельзя.

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

Максимально коротко:

[code]
#include "TinyGPS++.h"
#include <SoftwareSerial.h>

TinyGPSPlus gps;
static const int RXPin = 3, TXPin = 2;
SoftwareSerial Serial_GPS(RXPin, TXPin);

void setup() {
  Serial.begin(9600);
  Serial_GPS.begin(9600);

  while (!gps.date.isValid() or !gps.time.isValid() or !gps.location.isValid()) {
    if (!gps.date.isValid()) Serial.println("Date is invalid");
    if (!gps.time.isValid()) Serial.println("Time is invalid");
    if (!gps.location.isValid()) Serial.println("Location is invalid");
    delay(1000);
  }
  Serial.println("GPS valid");
}
[/code]

Цикл не разрывается. Почему так происходит и как это решить?

Последний пример получился неудачный - в нём с gps и не читается ничего…
Исходный скетч, я так понимаю, практически не отличается от примера из библиотеки. Печатает, то он в Serial что?

А где в нерабочем скетче аналог строк 20 21 первого скетча ???

Там не то, что ничего не читается, GPS модуль вообще не заводится, если в Serial вывести координаты или время и дату, то будут просто нули

Вам надо все входящие символы от GPS скармливать библиотеке !!! Оно именно так работает !!!

Не очень понимаю что значит “Скармливать библиотеке”. Это как? Добавил 20 21 строку из рабочего скетча, но в квартире gps не ловит в принципе, пока не могу проверить работоспособность

Брать из Serial_GPS и отдавать в gps.encode …

Как библиотека поймает полный пакет - появятся данные этого пакета.

Спасибо, завтра проверю

Скетч заработал, осталось побороть нехватку памяти на ардуине. Спасибо большое! Однако возник новый вопрос касательно геолокации. Тк в широте и долготе 6 цифр после запятой, то записать их в переменную типа float не выйдет, в какую переменную можно сохранить эти данные?

Почему? Кто или что мешает? У всех выходит не только шесть, но и семь записать.

Ну, вместо float можно использовать самописную fixed - там для GPS разрядности хватит, но хватит ли у Вас квалификации, чтобы это реализовать…
А если ограничиваться толь встроенными типами, то варианта два:

  1. Довольствоваться тем, что обеспечивает float.
  2. Перейти на 32-разрядную платформу и воспользоваться double.

Но вариант с самописной fixed очень интересный - там можно безо всяких усилий осуществлять переход через 180-й меридиан.

Его интересует вариант, когда целая часть по модулю может достигать 180. Тогда на 7 дробных разрядов мантиссы уже не хватает.

А кому и зачем нужен такой вариант? Один градус широты - 60 морских миль (или 111 138 метров). 1e-7 градуса это 1.1 сантиметра! ТС правда думает, что ему нужна такая точность при работе с GPS?

Как раз это понятно, еще 200 лет назад К. Ф. Гаусс писал:
«Недостатки математического образования с наибольшей отчётливостью проявляются в чрезмерной точности численных расчётов»

Опять же:

Вот куда девать лишние цифры?

И - конкретное применение: вот уронили Вы коробок со спичками. Как, зная координаты углов, определить ориентацию коробка относительно сторон света?

Ачё, Роскомнадзор уже и Авито заблокировал? Хреново :frowning: