Библиотека GPS и отдельный файл с кодом
- Войдите на сайт для отправки комментариев
Ср, 20/07/2016 - 18:23
Доброго времени суток
написал такой код:
#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. С чем это может быть связано?
Вынес часть кода согласно второго сообщения (просто в файл), это можно применять без ограничений? Там нет критики возвращает этот код значения переменных или использует какие-либо библиотеки?
ss - это софтовый порт. в условии
while(ss.available() > 0)проверяется наличие данных в буфере приёма. цикл крутится пока есть инфа в буфере.