我已经测试了GPS代码,而没有超声波传感器和加速度计的代码,它工作得很好。
但是现在我正在尝试将GPS与加速度计和超声波传感器一起使用,GPS无法向我提供正确的数据。 但是,加速度计和超声波传感器会将正确的值返回给arduino串行监视器。
由于我使用的是Adafruit Ultimate GPS Breakout v3,因此在解析NMEA数据时, 我应该得到类似的东西 时间:xx:xx:xx.xxx 日期:xx / xx / xxxx 位置等
相反,只有到达日期并用0填充。
已经尝试仅使用GPS代码来验证是否是GPS模块问题。
整个代码
//Declare Needed header file
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#define GPSSerial Serial1
Adafruit_GPS GPS(&GPSSerial);
#define GPSECHO false
uint32_t timer=millis();
//Declare the pins
#define echoPin 7
#define trigPin 8
//Define Accelerometer Address
const int MPU=0x68;
//Declare Accelerometer Variable
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
float f1=1.3;
byte *fp = (byte *) &f1;
//Declare the ultrasonic variables
long duration;
long distance;
void setup()
{
//Join I2C bus as Slave with Address 8;
Wire.begin (8);
//Call SendData Command
Wire.onRequest(SendData);
//Setup Pins as output and input to operate ultrasonic sensor
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
//Setup for Accelerometer Sensor
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
//Begin Serial Monitor
Serial.begin (9600);
//GPS Sensor Setting
Serial.begin (9600);
Serial.println("Adafruit GPS Test");
GPS.begin (9600);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
delay(1000);
}
void loop ()
{
dist();
GY521();
readGPS();
delay(3000);
}
//Obtain Ultrasonic Data
void dist()
{
digitalWrite (trigPin,LOW);
delayMicroseconds(2);
digitalWrite(trigPin,HIGH);
delayMicroseconds(2);
digitalWrite(trigPin,LOW);
duration=pulseIn(echoPin,HIGH);
distance=duration/58.2;
Serial.print(distance);
Serial.println(" cm");
}
//Obtain Accelerometer Data
void GY521()
{
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,12,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
Serial.println("Accelerometer: ");
Serial.print("X= "); Serial.println(AcX);
Serial.print("Y= "); Serial.println(AcY);
Serial.print("Z= "); Serial.println(AcZ);
// Serial.print("f1= ");
// Serial.print(fp[0], HEX);
// Serial.print(fp[1], HEX);
// Serial.print(fp[2], HEX);
// Serial.print(fp[3], HEX);
// Serial.println();
}
void readGPS()
{
// read data from the GPS in the 'main loop'
char c = GPS.read();
// if you want to debug, this is a good time to do it!
if (GPSECHO)
if (c);
// if a sentence is received, we can check the checksum, parse it...
if (GPS.newNMEAreceived()) {
// a tricky thing here is if we print the NMEA sentence, or data
// we end up not listening and catching other sentences!
// so be very wary if using OUTPUT_ALLDATA and trying to print out data
// this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
// if millis() or timer wraps around, we'll just reset it
if (timer > millis()) timer = millis();
// approximately every 2 seconds or so, print out the current stats
if (millis() - timer > 2000) {
timer = millis(); // reset the timer
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);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
if (GPS.fix) {
Serial.print("Location: ");
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
}
}
}
void SendData()
{
byte test[]={distance,AcZ>>0x8, AcZ, fp[0], fp[1], fp[2], fp[3]};
Wire.write(test,7);
}
仅GPS代码
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#define GPSSerial Serial1
Adafruit_GPS GPS(&GPSSerial);
#define GPSECHO false
uint32_t timer=millis();
void setup()
{
Serial.begin (9600);
Serial.println("Adafruit GPS Test");
GPS.begin (9600);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
delay(1000);
}
void loop()
{
readGPS();
}
void readGPS()
{
// read data from the GPS in the 'main loop'
char c = GPS.read();
// if you want to debug, this is a good time to do it!
if (GPSECHO)
if (c);
// if a sentence is received, we can check the checksum, parse it...
if (GPS.newNMEAreceived()) {
// a tricky thing here is if we print the NMEA sentence, or data
// we end up not listening and catching other sentences!
// so be very wary if using OUTPUT_ALLDATA and trying to print out data
// this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
// if millis() or timer wraps around, we'll just reset it
if (timer > millis()) timer = millis();
// approximately every 2 seconds or so, print out the current stats
if (millis() - timer > 2000) {
timer = millis(); // reset the timer
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);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
if (GPS.fix) {
Serial.print("Location: ");
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
}
}
}
我需要获取这些数据
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: ");
Serial.println((int)GPS.satellites);