La biblioteca TinyGPS no actualiza los datos de GPS cuando se usa Arduino ADC

-1

Tengo un problema en el que estoy usando la biblioteca TinyGPS para obtener datos NMEA de un GPS, al mismo tiempo que muestro el ADC en al mismo tiempo. El problema es que lee la multa ADC, pero parece que ejecuta los datos del GPS una vez, y luego el valor nunca vuelve a cambiar. Por lo tanto, tendrá un valor y nunca cambiará a menos que apague / encienda el arduino, incluso si está moviendo, la posición del GPS no se actualizará.

Pero, el código GPS por sí mismo funciona, y el código ADC por sí mismo funciona perfectamente, solo cuando se combinan como abajo, ¡¿parece que se reinician o interfieren ?!

#include "TinyGPS.h"
#include <SoftwareSerial.h>
TinyGPS gps;

#define RXPIN 10
#define TXPIN 11

SoftwareSerial nss(RXPIN, TXPIN);
const int DATA_COUNT = 50;

// flags

boolean triggered = 0;

// GLOBALS

unsigned  long previousMillis2 = 0;
unsigned long currentMillis2 = 0;
unsigned long start = 0;
unsigned long end_signal = 0;
unsigned long deltaT = 0;
int c = 0;


// GPS variables

unsigned long fix_age, time, date, speed, course;
unsigned long chars;
unsigned short sentences, failed_checksum;
float lat = 0, lon = 0;
double previous_lat = 0;
double previous_long = 0;
float updated_lat = 0;
float updated_long = 0;
float average_lat = 0;
float average_long = 0;
// -------------------

long interval = 20; // interval in milliseconds (10ms => 100Hz)
int data = 0;
float voltage = 0.0;
int THRESHOLD_COUNT = 0;

int start_index = 0;
int jack = 0; 
float THRESHOLD = 0.2;

//CALIBRATION DATA FOR ACCELEROMETER
float one_G = 647.0; // OFFSET OF 1G Z axis
float neg_G = 372.0; // OFFSET OF -1G Z axis
// Our ZERO G Reference should be in the middle of these two readings
float mZ = (one_G + neg_G) / 2.0; // ZERO_G REFERENCE FOR Z AXIS
// Estimate Z axis specific sensitivity difference of 2G between readings
float senZ = (one_G - neg_G) / 2.0;
float sensitivity = 440.0; // FROM DATASHEET TYPICAL SENSIVITIY 440mV/G

float data_window[DATA_COUNT]; // samples held per second 


void ReadAccelerometer();
void count_items();
void get_GPS_data();



void setup()
{
  // The data is sent via the serial port. Initialize it.
  Serial.begin(115200);


  // GPS needs to be at 4800 BAUD

   nss.begin(4800);

   delay(2000);

}


void get_GPS_data()
{
  Serial.println("Entering GPS function");

    while (nss.available())
  { Serial.println("H1");
    c = nss.read();
    if(gps.encode(c));
    {
      Serial.print(c);
      Serial.println("Hi2");


// retrieves +/- lat/long in 100000ths of a degree
gps.f_get_position(&lat, &lon, &fix_age);

// time in hhmmsscc, date in ddmmyy
gps.get_datetime(&date, &time, &fix_age);

// returns speed in 100ths of a knot
speed = gps.speed();

// course in 100ths of a degree
course = gps.course();
//Serial.println(time);
Serial.println("");
Serial.print(lat,4);
Serial.print(",");
Serial.print(lon, 4);
Serial.println("");
delay (500);

  }    
}


  Serial.println("Leaving GPS function");
}

int hell = -1; 

void loop()
{

  currentMillis2 = millis(); // Do at 50HZ

   if((currentMillis2 - previousMillis2) > interval) 
   {
      previousMillis2 = currentMillis2;

      ReadAccelerometer(); // Read in voltage 

      data_window[start_index] = voltage; // Fill voltage value into circular 

      // Reset to wrap around the buffer
      if (start_index == DATA_COUNT)
      {
        count_items(); // Call Threshold counting function
        start_index = 0; // Wrap array around

        triggered = false; // reset triggered flag after 1 second

      } else if (start_index == 10) // execute every 1 second....
        {

                    get_GPS_data();

                    previous_lat = lat;
                    previous_long = lon;

                    Serial.println("this should print once a second");
                    hell++;
                    Serial.println(hell);
        }


      start_index++; // Increment Circular buffer running index



  }

  deltaT = THRESHOLD_COUNT * (interval); // Interval needs to be in mS/ DeltaT will be in mS

 if((deltaT >= 60) && (triggered != true)) // Need to find the threshold value 
 {
   triggered = true;

      get_GPS_data();

   Serial.print("CAR HIT");
   Serial.print(lat, 4);
   Serial.print(" Latitude, ");
   Serial.print(lon, 4);
   Serial.print(" Longitude   ");
   Serial.println("");
   Serial.println("");


  THRESHOLD_COUNT = 0; // Reset counted indexes

 }


 }  
  void count_items()
{
  for (int i = 0; i < DATA_COUNT; i++)
  {
    if(data_window[i] >= THRESHOLD)
    {
      THRESHOLD_COUNT++; // count items greater than threshold
    }

  }
}


void ReadAccelerometer()
{


      // Read values from the ADC converter and send them out the serial port.
      data = analogRead(2); // READ ANALOG PIN 2 100uS
      voltage = ((data) / 1024.0) * 5.0;



}

Consulte aquí para obtener más información sobre esto. Resumen rápido

  • Algunas partes del programa se comportan de manera impredecible
  • Un montón de SRAM disponible
  • Mover las variables alrededor de la otra parece ayudar
pregunta zacharoni16

1 respuesta

1

Me gusta el mismo problema y la solución es:

una vez que lea los datos del GPS, cierre el puerto serie desde el que está leyendo el GPS.

Y comience el puerto justo antes de que desee leer datos de GPS.

Una forma mejor de escribir código:

Cree un puerto ficticio y use la funcionalidad Serial.listen ().

Espero que pueda ser útil!

    
respondido por el Som

Lea otras preguntas en las etiquetas