Библиотека GPS и отдельный файл с кодом

Lictor
Offline
Зарегистрирован: 01.10.2015

Доброго времени суток

написал такой код:

#include <TimerOne.h> //библиотека прерывания по таймеру

#include <tinyFAT.h>
#include <UTFT.h>
#include <UTFT_tinyFAT.h>  //подключение библиотек экрана и работы с SD для экрана

#include <RTC.h>    //библиотека микросхемы часов

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 10, TXPin = 11;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin); //подключение модуля GPS

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];   //объявление встроенных шрифтов

UTFT myGLCD(R61581, 38, 39, 40, 41);  //инициализация экрана
UTFT_tinyFAT myFiles(&myGLCD);        //создание объекта экрана
RTC time;                              //создание объекта часов

double LAT, LNG;
byte L, SEC;

void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);
  myGLCD.InitLCD(LANDSCAPE);  //ориентация экрана
  myGLCD.clrScr(); //очистка экрана
  file.initFAT();

  time.begin(RTC_DS1302, A15, A13, A14); //инициализация микросхемы времени
  Timer1.initialize(1000000); //в микросекундах (примерно)      http://robocraft.ru/blog/arduino/614.html
  Timer1.attachInterrupt( Chasy ); // разрешение функции прерывания
}

void loop() {
  if (L > 4) {
    Timer1.detachInterrupt();
    while (ss.available() > 0)
      if (gps.encode(ss.read()))
        displayInfo();
    L = 0;
    Timer1.attachInterrupt( Chasy );
  }
  myGLCD.printNumF(LAT, 6, 90, 110);
  myGLCD.printNumF(LNG, 6, 90, 130);
  myGLCD.printNumI(SEC, 90, 150);
}

void Chasy() {  //не выводить а только обновлять значения???
  myGLCD.setFont(SmallFont);
  myGLCD.setBackColor(5, 53, 5);
  myGLCD.setColor(255, 255, 255);
  myGLCD.print(time.gettime("d-m-Y"), 20, 293);
  myGLCD.print(time.gettime("H:i:s, D"), 10, 303);
  L++;
}

void displayInfo() {
  Serial.print(F("Location: "));
  if (gps.location.isValid())
  {
    LAT = gps.location.lat();
    LNG = gps.location.lng();
  }
  else
  {
    LAT = 9.99999;
    LNG = LAT;
  }
  if (gps.time.isValid())
  {
    SEC = gps.time.second();
  }
  else
  {
    SEC = 99;
  }
}

Сам по себе он рабочий и нареканий по работе не вызывает. Но есть ряд вопросов.

while (ss.available() > 0)
{
      if (gps.encode(ss.read()))
{
        displayInfo();
}
}

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

Так же после определения координат значение секунд начинает обновляться чуть ли не раз в 15-30 секунд вместо 5. С чем это может быть связано? 

Вынес часть кода согласно второго сообщения (просто в файл), это можно применять без ограничений? Там нет критики возвращает этот код значения переменных или использует какие-либо библиотеки?

medic
Offline
Зарегистрирован: 06.02.2016

ss - это софтовый порт. в условии while (ss.available() > 0) проверяется наличие данных в буфере приёма. цикл крутится пока есть инфа в буфере.