Функция millis() работает со встроенным кодом и выдает результат, но при создании собственной библиотеки она не работает.

Я создаю библиотеку для GPS, чтобы использовать ее в своем проекте. Я использую Adafruit GPS и его библиотеку для создания собственной библиотеки, в которой я использую функцию millis() для отображения местоположения GPS через 1 минуту (60 с). Поэтому, когда я создал свой встроенный код, функция работает очень хорошо, а также отображает местоположение после 60 секунд. Но я создал файл header и cpp для своей собственной библиотеки, в котором он не дает никаких ошибок, но результаты (местоположение) не отображаются. Не показывает никакого вывода. Поэтому я напечатал время, равное 0 (прикрепил скриншот вывода)

Мой код обновляет GPS каждые 30 секунд и печатает местоположение каждую минуту. Он также проверяет, соответствует ли старое местоположение новому местоположению каждую минуту.

Я думаю, что проблема с моей библиотекой или с функцией millis(). Я новичок в программировании Arduino, пожалуйста, помогите мне с этим.

Мой встроенный код:

#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 10);
Adafruit_GPS GPS(&mySerial);


#define GPSECHO  true
uint32_t timer = millis();
float old_lat,old_lon,new_lat,new_lon;

void setup()
{

  Serial.begin(9600);
  delay(1000);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand("$PMTK220,30000*1F");
  mySerial.println(PMTK_Q_RELEASE);
}

void loop()                     // запускаем снова и снова
{
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    //Serial.println(GPS.lastNMEA()); // это также устанавливает флаг newNMEAreceived() в false
    if (!GPS.parse(GPS.lastNMEA()))   // это также устанавливает флаг newNMEAreceived() в false
      return;  // мы можем не разобрать предложение, и в этом случае мы должны просто ждать другого
  }

if (GPS.fix) {

      old_lat = GPS.latitudeDegrees;
      old_lon = GPS.longitudeDegrees;
      if (timer > millis())  timer = millis();
      if (millis() - timer > 60000) {  
        timer = millis();
          Serial.println("Location 1 minute:");
          displaytime();
          new_lat = GPS.latitudeDegrees;
          new_lon = GPS.longitudeDegrees;

          if (new_lat == old_lat){
            new_lat = old_lat;
          }
          else{
            new_lat = GPS.latitudeDegrees;
          }
          Serial.print("Final Latitude: ");
          Serial.println(new_lat,6);

          if (new_lon == old_lon){
            new_lon = old_lon;
          }
          else{
            new_lon = GPS.longitudeDegrees;
          }
          Serial.print("Final Longitude: ");
          Serial.println(new_lon,6);


}
}
}

void displaytime(){
    Serial.print("\nTime: ");
    if (GPS.hour < 10) { Serial.print('0'); }
    Serial.print(GPS.hour, DEC); Serial.print(':');
    if (GPS.minute < 10) { Serial.print('0'); }
    Serial.print(GPS.minute, DEC); Serial.print(':');
    if (GPS.seconds < 10) { Serial.print('0'); }
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    if (GPS.milliseconds < 10) {
      Serial.print("00");
    } else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
      Serial.print("0");
    }
    Serial.println(GPS.milliseconds);
}

Мой заголовочный файл:

/*
 * GPS.h - library used to show Latitude and Longitude 
 */

 #ifndef GPS_Loc_h
 #define GPS_Loc_h

 #include "Arduino.h"

class SoftwareSerial;
class Adafruit_GPS;

 class GPS_Loc
 {
  public:
    GPS_Loc();
    void displaytime();
    void displayloc();
    uint32_t timer;
    float old_lat,old_lon,new_lat,new_lon;
 };

 #endif 

Мой файл cpp:

/*
 * GPS_Loc.cpp - библиотека, используемая для отображения широты и долготы.
 */

 #include "Arduino.h"
 #include "GPS_Loc.h"

 #include "Adafruit_GPS.h"
 #include "SoftwareSerial.h"

 #define GPSECHO  true

SoftwareSerial mySerial(11,10); 
Adafruit_GPS GPS(&mySerial); 

GPS_Loc::GPS_Loc()
{
  timer = millis();
  old_lat = old_lat;
  old_lon = old_lon;
  new_lat = new_lat;
  new_lon = new_lon;
}

void GPS_Loc::displayloc(){
  //Serial.println("Базовый тест библиотеки Adafruit GPS!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand("$PMTK220,30000*1F");
  mySerial.println(PMTK_Q_RELEASE);
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    //Serial.println(GPS.lastNMEA()); // это также устанавливает флаг newNMEAreceived() в false
    if (!GPS.parse(GPS.lastNMEA()))   // это также устанавливает флаг newNMEAreceived() в false
      return;  // мы можем не разобрать предложение, и в этом случае мы должны просто ждать другого
    }

if (GPS.fix) {

      old_lat = GPS.latitudeDegrees;
      old_lon = GPS.longitudeDegrees;
      if (timer > millis())  timer = millis();
      if (millis() - timer > 60000) {  
        timer = millis();
          Serial.println("Location 1 minute:");
          displaytime();
          new_lat = GPS.latitudeDegrees;
          new_lon = GPS.longitudeDegrees;

          if (new_lat == old_lat){
            new_lat = old_lat;
          }
          else{
            new_lat = GPS.latitudeDegrees;
          }
      Serial.print("Location lat: ");
          Serial.println(new_lat,6);

          if (new_lon == old_lon){
            new_lon = old_lon;
          }
          else{
            new_lon = GPS.longitudeDegrees;
          }

          Serial.print("Location long: ");          
          Serial.println(new_lon,6);


}
}
}

void GPS_Loc::displaytime(){
    Serial.print("\nTime: ");
    if (GPS.hour < 10) { Serial.print('0'); }
    Serial.print(GPS.hour, DEC); Serial.print(':');
    if (GPS.minute < 10) { Serial.print('0'); }
    Serial.print(GPS.minute, DEC); Serial.print(':');
    if (GPS.seconds < 10) { Serial.print('0'); }
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    if (GPS.milliseconds < 10) {
      Serial.print("00");
    } else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
      Serial.print("0");
    }
    Serial.println(GPS.milliseconds);
}

Мой демонстрационный код, использующий мою собственную библиотеку:

#include <GPS_Loc.h>

GPS_Loc bgps;


void setup() {
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  bgps.displaytime();
  bgps.displayloc();
}

Вывод встроенного кода

, 👍0

Обсуждение

Я думаю, проблема может быть в GPS.begin(9600);. Вы инициализируете последовательное соединение каждый раз, когда вызываете displayLoc. Но во встроенном коде вы делаете это только один раз. Попробуйте добавить в свой класс функцию init, которая настроит серийный номер только один раз., @Gerben


1 ответ


1

Я думаю, Гербен что-то задумал. Если вы повторно инициализируете GPS в каждом цикле, а затем никогда не даете ему время для получения сигнала GPS, тогда ваше условие if (GPS.fix) никогда не будет истинным, и вы никогда не распечатаете никаких других данных. Весь ваш временной код находится внутри условия GPS.fix, которое не происходит, пока вы не получите исправление. Попробуйте поместить код инициализации внутри вашего конструктора для вашего класса. Что-то вроде:

GPS_Loc::GPS_Loc()
{
  timer = millis();
  old_lat = old_lat;
  old_lon = old_lon;
  new_lat = new_lat;
  new_lon = new_lon;

  //Serial.println("Базовый тест библиотеки Adafruit GPS!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand("$PMTK220,30000*1F");
  mySerial.println(PMTK_Q_RELEASE);
}

void GPS_Loc::displayloc(){
  delay(100); // короткая задержка для остановки неполадок
  char c = GPS.read();
  if (GPS.newNMEAreceived()) {
    //Serial.println(GPS.lastNMEA()); // это также устанавливает флаг newNMEAreceived() в false
    if (!GPS.parse(GPS.lastNMEA()))   // это также устанавливает флаг newNMEAreceived() в false
      return;  // мы можем не разобрать предложение, и в этом случае мы должны просто ждать другого
    }

if (GPS.fix) {

Также может быть полезно добавить небольшую задержку где-нибудь в коде, чтобы он не зацикливался до того, как будет получено исправление.

,

Тем не менее я не получаю вывод, @Krupali Mistry