Долгое получение координат от GPS

Тема в разделе "Arduino & Shields", создана пользователем raccoon, 22 апр 2019.

  1. raccoon

    raccoon Нерд

    Здравствуйте! Есть Arduino Uno и GPS-модуль GPS Bee kit. Подключен к ардуино через Wireless SD Shield Arduino. Также подключен акселлерометр GY-521. Проблема в следующем - данные с GPS (широта, долгота, скорость) начинают поступать спустя долгое время. Такое возникает периодично - вчера, например, информация отображалась спустя 10 минут работы, а сегодня уже больше часа ничего нет (вывод ниже).
    Код (C++):
    Latitude  Longitude  Speed
    (deg)     (deg)     kmph
    --------------------------
    ********* ********** ***** AcX = 2104 | AcY = 15068 | AcZ = -3460
    ********* ********** ***** AcX = 2088 | AcY = 14920 | AcZ = -3560
    ********* ********** ***** AcX = 2080 | AcY = 15008 | AcZ = -3312
    ********* ********** ***** AcX = 1984 | AcY = 14972 | AcZ = -3388
     
    Сам код
    Код (C++):
    #include <SoftwareSerial.h>
    //начало вставки кода №1
    #include <Wire.h>

    //конец вставки кода №1
    #include <TinyGPS.h>

    TinyGPS gps;
    SoftwareSerial ss(0, 1);

    static void smartdelay(unsigned long ms);
    static void print_float(float val, float invalid, int len, int prec);
    static void print_int(unsigned long val, unsigned long invalid, int len);
    static void print_str(const char *str, int len);
    int16_t AcX,AcY,AcZ;
    const int MPU_addr=0x68;

    void setup()
    {
      Serial.begin(9600);
      Wire.beginTransmission(MPU_addr);
      Wire.write(0x6B);  // PWR_MGMT_1 register
      Wire.write(0);     // set to zero (wakes up the MPU-6050)
      Wire.endTransmission(true);
      Serial.println("Latitude  Longitude  Speed");
      Serial.println(" (deg)     (deg)     kmph");
      Serial.println("--------------------------");

      ss.begin(9600);

    //конец вставки кода №3
    }

    void loop()
    {
     
      float flat, flon;
      unsigned long age, date, time, chars = 0;
      unsigned short sentences = 0, failed = 0;
      static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

      Wire.beginTransmission(MPU_addr);
      Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
      AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)  
      AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
      AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
     
      gps.f_get_position(&flat, &flon);
      print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
      print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
      print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
      Serial.print("AcX = "); Serial.print(AcX);
      Serial.print(" | AcY = "); Serial.print(AcY);
      Serial.print(" | AcZ = "); Serial.print(AcZ);
     
      Serial.println();
      smartdelay(1000);
    }

    static void smartdelay(unsigned long ms)
    {
      unsigned long start = millis();
      do
      {
        while (ss.available())
          gps.encode(ss.read());
      } while (millis() - start < ms);
    }

    static void print_float(float val, float invalid, int len, int prec)
    {
      if (val == invalid)
      {
        while (len-- > 1)
          Serial.print('*');
        Serial.print(' ');
      }
      else
      {
        Serial.print(val, prec);
        int vi = abs((int)val);
        int flen = prec + (val < 0.0 ? 2 : 1); // . and -
        flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
        for (int i=flen; i<len; ++i)
          Serial.print(' ');
      }
      smartdelay(0);
    }

    static void print_int(unsigned long val, unsigned long invalid, int len)
    {
      char sz[32];
      if (val == invalid)
        strcpy(sz, "*******");
      else
        sprintf(sz, "%ld", val);
      sz[len] = 0;
      for (int i=strlen(sz); i<len; ++i)
        sz[i] = ' ';
      if (len > 0)
        sz[len-1] = ' ';
      Serial.print(sz);
      smartdelay(0);
    }

    static void print_str(const char *str, int len)
    {
      int slen = strlen(str);
      for (int i=0; i<len; ++i)
        Serial.print(i<slen ? str[i] : ' ');
      smartdelay(0);
    }
    В чем заключается проблема и как её можно решить?
     
  2. связь со спутником плохая
     
  3. raccoon

    raccoon Нерд

    На улице на данный момент проверить нет возможности. Всё делается в квартире. Модуль располагается максимально близко к окну.
     
  4. DetSimen

    DetSimen Спамовредитель Модератор

    Надо, чтобы окно было южное.
     
  5. raccoon

    raccoon Нерд

    Окно выходит на юг
     
  6. Надо, чтобы окно выходило на небо с обзором градусов 120, и желательно без стекла, и выше всех соседних зданий. И ещё вайфай соседский надо отключить.
     
    DetSimen нравится это.
  7. b707

    b707 Гуру

    и чего ж вы хотите? скажите спасибо, что вообще находит спутники...

    Только не говорите, что вы собирались использовать свою самоделку в помещении :)
     
  8. raccoon

    raccoon Нерд

    Нет, я буду использовать самоделку в машине. Я конечно не эксперт, но пару дней GPS в помещении примерно через 10 минут уже начинал выдавать информацию, а вчера запустил и ничего. При том, что девайс был на том же месте
     
  9. parovoZZ

    parovoZZ Гуру

    а игрушка как-то по-другому должна работать?