Дата и время GPS не отображаются правильно в Arduino Uno,NEO6M GPS модуль

Я изучаю, как работает модуль Arduino и GPS, чтобы я мог применить его к другому проекту. Мои компоненты-Arduino Uno, GPS-модуль NEO-6M и TFT-дисплей Adafruit 1.8".

Код работал не так, как ожидалось. Он отображает "ожидание sats".

Тем не менее, он по-прежнему отображает общее время и дату, 1-1-1970 и 12:00:00, в течение некоторого времени до adisplays местного времени.

Плюс обновленный код занимает гораздо больше времени для отображения времени

Вот код до сих пор. То, что я хотел бы сделать, это:

  1. Дисплей "ожидание sats"
  2. продолжить после получения успешного сигнала GPS
  3. отрегулируйте GPS-время и дату в соответствии с местными условиями
  4. отображение даты и времени

В конце концов это станет основой для скоростного и GPS-треккера для моих радиоуправляемых автомобилей. Любая помощь очень ценится.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <TimeLib.h>

#define cs   10
#define dc   8
#define rst  9

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

static const int RXPin = 2, TXPin = 3; //GPS communication

// Измените это значение в соответствии с вашим часовым поясом
const int UTC_offset = -4;   // Время Восточной Австралии равно 10

static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);

time_t prevDisplay = 0; // Подсчет времени последнего отображения

void setup()
{

  Serial.begin(9600);  //установить скорость передачи данных для последовательного монитора
     ss.begin(GPSBaud);  //установить скорость передачи данных для GPS

   tft.initR(INITR_BLACKTAB);     //правильный INITR для моего дисплея

  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(20, 58);
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN,ST7735_BLACK);
  tft.println("GPS Date & Time");
  tft.print("        Monitor");
  delay(3000);
  tft.fillScreen(ST7735_BLACK);
}

void loop()
{
 
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN,ST7735_BLACK);
 
     if (ss.available() < 1)
{
       gps.encode(ss.read());
 }

        GPS_Timezone_Adjust();  // Функция регулировки времени

}
 

void GPS_Timezone_Adjust(){
  while (ss.available() > 0) {
    gps.encode(ss.read());
    if (gps.location.isUpdated()) {
     
      int Year = gps.date.year();
      byte Month = gps.date.month();
      byte Day = gps.date.day();
      byte Hour = gps.time.hour();
      byte Minute = gps.time.minute();
      byte Second = gps.time.second();

//Hour = hourFormat12();
        // Установить время из строки данных GPS
        setTime(Hour, Minute, Second, Day, Month, Year);
        // посчитать текущее время часового пояса по значению смещения
        adjustTime(UTC_offset * SECS_PER_HOUR); 
     
    }
  }

  if (timeStatus()!= timeNotSet) {
  if (now() != prevDisplay) {     
      prevDisplay = now();
      ClockDisplay();
    }
 }
} 

void ClockDisplay(){
    tft.setCursor(5, 8);
     
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);
    tft.print("Date:   ");
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);


      if(month() < 10){
        tft.print("0");
        }
      tft.print(month());
     
      tft.print("-");

      if(day() < 10){
        tft.print("0");
        }
      tft.print(day());

      tft.print("-");
     
      tft.print(year());
     

    tft.setCursor(4, 30);
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);
    tft.print("Time:   ");
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);

      if(hourFormat12() < 10){
        tft.print("0");
        }
    tft.print(hourFormat12());
    tft.print(":");

      if(minute() < 10){
        tft.print("0");
        }
    tft.print(minute());
    tft.print(":");

      if(second() < 10){
        tft.print("0");
        }
    tft.print(second());

    if (isAM()) {
    tft.println(" AM ");
    } else {
    tft.println(" PM ");
    }

    tft.setCursor(5,50);
    tft.setTextColor(ST7735_WHITE,ST7735_RED);
    tft.println("RAW GPS DATE & TIME");

    tft.setCursor(5,58);
    tft.print(gps.date.month());
    tft.print("-");
    tft.print(gps.date.day());
    tft.print("-");
    tft.print(gps.date.year());

    tft.setCursor(5,66);
    tft.print(gps.time.hour());
    tft.print(":");
    tft.print(gps.time.minute());
    tft.print(":");
    tft.print(gps.time.second());
     
  smartDelay(400);
  }
    // крайний срок для хорошего восстановления
      static void smartDelay(unsigned long ms)
  {
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

, 👍1


2 ответа


0

Я предполагаю, что GPS-модуль не получает показания времени до тех пор, пока не получит блокировку GPS. Это может занять много секунд.

Вы не опубликовали свой код, поэтому мы не можем сказать, как вы справляетесь с показаниями времени.

Я бы предложил проверить время полуночи 1970 года (которое в UNIX называется "эпохой") и обработать его специальным кодом. Если вы читаете время как числовое значение, оно почти наверняка равно 0.

,

Мне интересно, не в этой ли части кода проблема если (timeStatus()!= набор времени) { если (сейчас() != перед просмотром) { predDisplay = сейчас(); Отображение часов(); } }, @Tvr4

какая библиотека определяет функцию " Временной интервал ()"? Вам нужно сообщить нам, какие библиотеки/фреймворки вы используете., @Duncan C


1

Дисплей "ожидание результатов" ... продолжайте, когда будет получен успешный сигнал GPS

Вы (или библиотека Arduino, которую вы используете) используете время.библиотека h, которая начинается 1 января 1970 года. Если никаких корректировок не будет сделано, время.h сообщит об этом 1 января 1970 года.

Вы не ждете (или библиотека Arduino, которую вы используете, не ждет) индикации "хороший сигнал GPS" от модуля GPS перед отображением времени.

отрегулируйте время и дату GPS в соответствии с местными

Если вы используете время.h вы (или используемая вами библиотека Arduino) должны установить смещение часового пояса вместо корректировки времени вручную. Это позволит воспользоваться временем.h библиотечные утилиты, которые занимаются сложными случаями, такими как вычисление времени и даты, которые пересекают полночь по отношению к UTC (он же GMT).

отображение даты и времени

Время.h библиотека хранит дату / время как количество секунд с 1 января 1970 года. Поэтому при отображении текущего времени используйте время.вызов функции h для преобразования этого счетчика в текущее местное время.

Советы / Предложения:

  • GPS - модуль представляет собой радиоприемник. Это работает лучше всего, когда вид на небо не заслонен зданиями, деревьями, холмами или плохой погодой. Такие препятствия приводят к замедлению времени блокировки или отсутствию блокировки вообще. Чем больше спутников может видеть GPS-модуль, тем лучше.
  • GPS - модуль-это компьютер в себе и сам по себе. Компьютер несколько раз проанализирует сообщения со спутников, прежде чем будет готов сообщить данные о местоположении и времени. Если возможно, оставьте GPS-модуль включенным, даже если Arduino не включен. Это, вероятно, должно уменьшить или устранить задержку, необходимую модулю GPS, прежде чем сообщать о местоположении и времени.

Добавлено позже...

@Tvr4 поднимает хороший вопрос. В то время как время.h более распространен (используется почти везде в программировании на C), в парадигме Arduino часто используется встроенная библиотека времени Arduino. Для получения дополнительной информации это обсуждается в этом вопросе / ответе stackoverflow. Если вы хотите погрузиться в библиотеку времени Arduino, код находится в этом репозитории github. Кроме того, вы должны найти дополнительную справку по этому времени libaray в файле readme, отображаемом на этой веб-странице.

,

Функция timeStatus() является частью функции TimeLib Вот страница в библиотеке https://playground.arduino.cc/Code/Time/, @Tvr4

...спасибо. Добавил дополнительный текст к ответу в соответствии с вашим предложением., @st2000