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