Используется GPS/GLONASS v1 (Troyka-модуль).
В примере из библиотеки, когда нет спутников, case GPS_ERROR_SAT: выполняется.
в моей программе case GPS_ERROR_SAT: не выполняется ни в void setup () ни в void loop()
в раздел "if (gps.available()) // если пришли данные с GPS-модуля" программа "заходит".
если модуля нет, то раздел else //check the GPS module выполняется.
Если модуль есть и спутники есть "case GPS_OK:" выполняется...
но когда явно нет спутников просто происходит бездействие, картинка на LCD просто замирает...
когда спутники появляются все продолжает работать инфа выводится на дисплей... =(((
может кто подскажет в чем дело...
/*
*This code destined to check the system and print info to the LCD display.
*by 8-4 bit parallel interface in the project "Treveller assistant 1"
*Autor: Ponomarev Andrew
*Data of writing: 09/05/2023
*
*/
#include <TroykaGPS.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#define MAX_SIZE_MASS 16 // задаём размер массива для времени, даты, широты и долготы
LiquidCrystal myLcd(14, 15, 5, 4, 3, 2); // create myLcd object LiquidCrystal type to use this libraries methods for it (rs, en, d4, d5, d6, d7);
SoftwareSerial gpsSerial(7, 6); // создаём объект для работы с программным Serial и передаём ему пины RX и TX
GPS gps(gpsSerial); // создаём объект класса GPS и передаём в него объект gpsSerial
bool satCheck = 0;
char strTime[MAX_SIZE_MASS]; // массив для хранения текущего времени
char strDate[MAX_SIZE_MASS]; // массив для хранения текущей даты
char latitudeBase60[MAX_SIZE_MASS]; // массив для хранения широты в градусах, минутах и секундах
char longitudeBase60[MAX_SIZE_MASS]; // массив для хранения долготы в градусах, минутах и секундах
void setup()
{
//---------print the greeting----------
myLcd.begin(16, 2);
myLcd.setCursor(2, 0);
myLcd.print("Hello world!");
for (int positionCounter = 16; positionCounter >= 0; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("Start chek sist.");
delay(150);
}
//----------check the SoftwareSerial---------
gpsSerial.begin(115200);
myLcd.clear();
myLcd.setCursor(0, 0);
myLcd.print("Check SW_Serial");
if (gpsSerial)
{
myLcd.setCursor(0, 1);
myLcd.print("SW_Serial is OK");
}
else
{
while(1)
{
myLcd.clear();
myLcd.setCursor(0, 0);
myLcd.print("Check SW_Serial");
for (int positionCounter = 20; positionCounter >= 0; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("check the connection");
delay(150);
}
}
}
delay(2000);
//----------check the BMP280------------
//-----------check the MicroSDcard----------
//----------check the GPS module---------
myLcd.clear();
myLcd.setCursor(0, 0);
myLcd.print("initial the GPS");
delay(2000);
gpsSerial.write("$PMTK251,9600*17\r\n");
gpsSerial.end();
gpsSerial.begin(9600);
for (int positionCounter = 16; positionCounter >= -12; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("GPS init is OK on speed 9600");
delay(150);
}
myLcd.clear();
myLcd.setCursor(0, 0);
myLcd.print("Check the GPS");
myLcd.setCursor(0, 1);
myLcd.print("Get out outside");
delay(5000);
while (!satCheck)
{
if (gps.available()) // если пришли данные с GPS-модуля
{
gps.readParsing(); // считываем данные и парсим
switch (gps.getState()) // проверяем состояние GPS-модуля
{
case GPS_OK: // всё OK
myLcd.clear();
myLcd.setCursor(0, 0);
myLcd.print(" ___GPS is OK___");
delay(1000);
myLcd.setCursor(0, 1);
myLcd.print("Sat: "); // выводим количество видимых спутников
int numOfSat = gps.getSat();
if (numOfSat > 3) satCheck = 1;
myLcd.setCursor(7, 1);
myLcd.print(numOfSat);
delay(3000);
break;
case GPS_ERROR_DATA: // ошибка данных
myLcd.setCursor(0, 1);
myLcd.println(" GPS error data ");
delay(3000);
break;
case GPS_ERROR_SAT: // нет соединения со спутниками
for (int positionCounter = 16; positionCounter >= -19; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("GPS is not connected to satellites!");
delay(150);
}
delay(1000);
break;
}
}
else //check the GPS module
{
myLcd.clear();
myLcd.setCursor(3,0);
myLcd.print("Attention");
for (int positionCounter = 16; positionCounter >= -4; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("Check the GPS module");
delay(150);
}
delay(500);
}
}
}
void loop()
{
if (gps.available()) // если пришли данные с gps-модуля
{
gps.readParsing(); // считываем данные и парсим
switch(gps.getState()) // проверяем состояние GPS-модуля
{
case GPS_OK: // всё OK
// выводим координаты широты и долготы
// 1. в градусах, минутах и секундах
// 2. градусах в виде десятичной дроби
// LCD info output
// |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
// |y|y|y|y|y|y|y|y|A|x|x |x | |S |x |x | 0
// |z|z|z|z|z|z|z|z|T|h|h |m |m |V |x |x | 1
//----------------display number of sattelits-----------------//
myLcd.clear();
myLcd.setCursor(13, 0);
myLcd.print("S");
int numOfSat = gps.getSat();
myLcd.setCursor(14, 0);
myLcd.print(numOfSat);
//------------------display actualy speed---------------------------//
myLcd.setCursor(13, 1);
myLcd.print("V");
myLcd.setCursor(14, 1);
myLcd.print(gps.getSpeedKm());
//----------------display latitude and longitude in float number---------------------------//
myLcd.setCursor(0, 0);
float latitude = gps.getLatitudeBase10();
myLcd.print(latitude,6); //yyyyyyyy
myLcd.setCursor(0, 1);
float longitude = gps.getLongitudeBase10();
myLcd.print(longitude,6); //zzzzzzyy
//---------------выводим высоту над уровнем моря--------------------//
myLcd.setCursor(8, 0);
myLcd.print("A");
myLcd.setCursor(9, 0);
myLcd.print((int)gps.getAltitude());
//----------------выводим текущее время------------//
myLcd.setCursor(8, 1);
myLcd.print("T");
myLcd.setCursor(9, 1);
myLcd.print(gps.getHour());
myLcd.setCursor(11, 1);
myLcd.print(gps.getMinute());
break;
case GPS_ERROR_DATA: // ошибка данных
myLcd.clear();
myLcd.setCursor(0, 1);
myLcd.println(" GPS error data ");
delay(3000);
break;
case GPS_ERROR_SAT: // нет соединения со спутниками
for (int positionCounter = 16; positionCounter >= -19; positionCounter--)
{
myLcd.setCursor(positionCounter, 1);
myLcd.print("GPS is not connected to satellites!");
delay(150);
}
delay(1000);
break;
}
}
}