Получите GPS-координаты с помощью беспроводного трекера Heltec на базе Arduino

Я купил беспроводной трекер Heltec Arduino.

Я хочу получить GPS-позицию. Я взял оригинальный пример «GPSDisplayOnTFT» из IDE (я внес несколько изменений, потому что оригинальный код у меня не работал).

Пример из IDE

Мой экран всегда показывает:

peek: 0
LAT: 0.00
valid: 0

Я добавил комментарий к коду, чтобы показать строку.

Это мой код:

#include "Arduino.h"
#include "HT_st7735.h"
#include "HT_TinyGPS++.h"

TinyGPSPlus GPS;
HT_st7735 st7735;

#define VGNSS_CTRL 3

void GPS_test(void)
{
  Serial.println("GPS 1");
    Serial1.begin(9600,SERIAL_8N1,33,34);    
    Serial.println("GPS_test");
  delay(1000);
    while(1)
    {
    st7735.st7735_fill_screen(ST7735_BLACK);
        if(Serial1.available()>0)
        {
            if(Serial1.peek()!='\n')
            {
                GPS.encode(Serial1.read());
        String peek = "peek: " + (String)GPS.encode(Serial1.read());
        Serial.println(peek);
         st7735.st7735_write_str(0, 0, peek);
     
            }
            else
            {
                Serial1.read();
                if(GPS.time.second()==0)
                {
          Serial.println("second==0");
                    continue;
                }
                st7735.st7735_fill_screen(ST7735_BLACK);
                st7735.st7735_write_str(0, 0, (String)"GPS_test");
                String time_str = (String)GPS.time.hour() + ":" + (String)GPS.time.minute() + ":" + (String)GPS.time.second()+ ":"+(String)GPS.time.centisecond();
                st7735.st7735_write_str(0, 20, time_str);
        Serial.println(time_str);
                String latitude = "LAT: " + (String)GPS.location.lat();
                st7735.st7735_write_str(0, 40, latitude);
        Serial.println(latitude);

                String longitude  = "LON: "+  (String)GPS.location.lng();
                st7735.st7735_write_str(0, 60, longitude);
        Serial.println(longitude);

                
                delay(5000);
                while(Serial1.read()>0);
            }

      Serial.println("***************************");
      Serial.println(Serial1.peek());
      Serial.println(Serial1.read());
      Serial.println(GPS.location.lat());
      st7735.st7735_write_str(0, 20, "LAT: " + (String)GPS.location.lat());

      //ПРИМЕЧАНИЕ: всегда показывает «0»
      st7735.st7735_write_str(0, 40, "valid: " + (String)GPS.satellites.isValid());
      Serial.println("*********** fin ***********");

        }
    else{
     Serial.println("Serial 1 no available"); 
     st7735.st7735_fill_screen(ST7735_BLACK);
      st7735.st7735_write_str(10, 50, (String)"Unavailable");
     delay(5000);
    }
    Serial.println("while 1");

    delay(5000);
    }
}

void setup(){
  delay(100);
  Serial.begin(115200);
  Serial.println("setup 1");
  pinMode(VGNSS_CTRL,OUTPUT);
    digitalWrite(VGNSS_CTRL,LOW);
    
  st7735.st7735_init();
  st7735.st7735_fill_screen(ST7735_BLACK);
  st7735.st7735_write_str(20, 10, (String)"Loading ...");
  st7735.st7735_write_str(20, 50, (String)"GPS_test");

  Serial.println("setup 2");
  GPS_test();
  Serial.println("setup 3");

}

void loop(){
  Serial.println("loop 1");
  delay(3000);
  Serial.println("loop 2");
}

Я не уверен, нужно ли мне подключать антенну к модулю GNSS.

Могу ли я что-то распечатать в журналах, чтобы получить больше информации?

========= ОТРЕДАКТИРОВАНО =========

Это вывод последовательного монитора:

01:13:43.526 -> GPS_test started
01:18:12.693 -> setup 1
01:18:12.871 -> setup 2
01:18:12.871 -> GPS 1
01:18:12.904 -> GPS_test
01:18:14.201 -> peek: 0
01:18:14.232 -> ***************************
01:18:14.232 -> 106
01:18:14.232 -> 106
01:18:14.232 -> 0.00
01:18:14.329 -> *********** fin ***********
01:18:14.329 -> while 1
01:18:19.610 -> peek: 0
01:18:19.685 -> ***************************
01:18:19.685 -> 79
01:18:19.685 -> 79
01:18:19.685 -> 0.00
01:18:19.738 -> *********** fin ***********
01:18:19.738 -> while 1
01:18:25.036 -> peek: 0

, 👍0


2 ответа


1

Многие COTS GNSS модули, когда они не заблокированы, отправляют NMEA сообщение только с запятыми, где ожидаются широта и долгота.

UC6580, используемый в Heltec Wireless Tracker, по-видимому, использует формат данных NMEA 0183.

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

Если мы перейдем в учетную запись TinyGPSPlus github.com, то увидим пример файла Arduino INO. Этот пример отслеживает несколько спутников и сообщает «Количество спутников, высота, азимут и отношение сигнал/шум». Эти данные обычно доступны еще до того, как модуль GNSS будет заблокирован (выдавая значения широты и долготы). Поэтому они полезны при исследовании проблемы.

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

,

1

#define VGNSS_CTRL 3

На основе примера кода со страницы Heltec Github. Контакт для VGNSS_Ctrl — это контакт 37 вместо контакта 3, как показано в вашем коде.

Дальнейшая проверка принципиальной схемы для Heltec Wireless Tracker V1.0 подтвердила, что VGNSS_Ctrl действительно находится на контакте 37, который используется для активации VDD_GNSS (т. е. для включения питания для модуля GPS).

,