Библиотека 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)
проверяется наличие данных в буфере приёма. цикл крутится пока есть инфа в буфере.