0 голосов
Используется 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;
    }
 }

}
назад (28 баллов) 1 3 9
исправил назад

1 Ответ

0 голосов
 
Лучший ответ
Проблема решена.
В кейсах нужно объединять блоки если создаешь переменные.
 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;
      }
назад (28 баллов) 1 3 9
исправил назад
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
...