In my project I am using BMP,MPU,INA 219 Sensor and GPS module. These all modules individually work properly but when integrated into one circuit the gps module is not giving any output. I am using Arduino mega 2560 as my microcontroller and Xbee as my rf module for transmitting data. The gps module is connected at serial1 of mega and xbee is connected at serial2 of mega. Below is my code (note: some part of code is commented because not in use) (note: I have tried tinyGPS++, tinyGPSPlus earlier but then also no output).
#include <Adafruit_BMP280.h>
#include <Adafruit_INA219.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <SD.h>
#include <Wire.h>
#include <SPI.h>
#include <Servo.h>
#include <NMEAGPS.h>
//#include <AltSoftSerial.h>
#include <NeoSWSerial.h>
NMEAGPS gps;
gps_fix fix;
//AltSoftSerial gpsSerial;
NeoSWSerial gpsSerial(19,18);
#define MAX_ENTRIES 15
#define BUZZER_PIN 7
// Define the RX and TX pins for the GPS module Serial1
//static const int RXPin = 19, TXPin = 18;
//static const uint32_t GPSBaud = 9600;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float shuntVoltage = 0;
float busVoltage = 0;
float current_mA = 0;
float loadVoltage = 0;
float power_mW = 0;
Adafruit_MPU6050 mpu;
Adafruit_BMP280 bmp;
Adafruit_INA219 ina219;
const int chipSelect = 4;
Servo servo1;
Servo servo2;
const int servo1Pin = 9; // pin for your servo1
const int servo2Pin = 10;
int flag=0;
const int sgy1=11;
const int sgy2=12; // pin for your servo2
int packetCounter = 0;
String result[MAX_ENTRIES];
String dataStr="";
String TEAM_ID="#2022ASI-021";
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
gpsSerial.begin(9600);
while (!Serial)
delay(10);
Serial2.begin(9600);
Serial.println(F("BMP280 test"));
bmp.begin(0x76);
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
Serial.println("Adafruit MPU6050 test!");
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
uint32_t currentFrequency;
if (!ina219.begin()) {
Serial.println("Failed to find INA219 chip");
while (1) {
delay(10);
}
}
ina219.setCalibration_16V_400mA();
Serial.println("");
delay(100);
/* Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
while (1);
}
Serial.println("card initialized.");*/
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
pinMode(BUZZER_PIN, OUTPUT);
}
void BMP_DATA(){
result[5]=String(bmp.readTemperature());
result[4]=String(bmp.readPressure());
result[3]=String(bmp.readAltitude(1016));
}
void INA_DATA(){
shuntVoltage = ina219.getShuntVoltage_mV();
busVoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
loadVoltage = busVoltage + (shuntVoltage / 1000);
result[6]=String(loadVoltage);
}
void MPU_DATA(){
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
ax=a.acceleration.x;
ay=a.acceleration.y;
az=a.acceleration.z;
float roll = atan2(ay, az) * 180.0 / PI;
float pitch = atan(-ax / sqrt(ay * ay + az * az)) * 180.0 / PI;
result[12]=String(ax)+" "+String(ay)+" "+String(az)+" "+String(roll)+" "+String(pitch);
gx=g.gyro.x;
gy=g.gyro.y;
gz=g.gyro.z;
result[13]=String(gx)+" "+String(gy)+" "+String(gz);
}
void sdcard1(){
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataStr);
dataFile.close();
} else {
Serial.println("Error opening datalog.txt");
}
}
void loop() {
/*if (gps.available(gpsSerial)) {
fix = gps.read();
result[11] = String(fix.satellites);
result[8] = String(fix.latitude(), 6);
result[9] = String(fix.longitude(), 6);
result[10] = String(fix.altitude());
if (fix.valid.time) {
result[7] = String(fix.dateTime.hours) + ":" + String(fix.dateTime.minutes) + ":" + String(fix.dateTime.seconds);
} else {
result[7] = "No valid time";
}
}*/
/*if(fix.altitude()==100){
flag++;
}
if (fix.valid.altitude && fix.altitude() < 100 && flag==2) {
servo1.write(90);
servo2.write(90);
}
if(fix.altitude()<10){
digitalWrite(BUZZER_PIN, HIGH);
}*/
unsigned long timestamp = millis() / 1000;
if(bmp.readAltitude()>130)
{
servo1.write(90);
servo2.write(90);
}
MPU_DATA();
BMP_DATA();
INA_DATA();
packetCounter++;
result[0]="#2022ASI-021";
result[1]= timestamp;
result[2]=packetCounter;
if (gps.available(gpsSerial)) {
fix = gps.read();
result[11] = String(fix.satellites);
result[8] = String(fix.latitude(), 6);
result[9] = String(fix.longitude(), 6);
result[10] = String(fix.altitude());
if (fix.valid.time) {
result[7] = String(fix.dateTime.hours) + ":" + String(fix.dateTime.minutes) + ":" + String(fix.dateTime.seconds);
} else {
result[7] = "No valid time";
}
}
for (int i = 0; i < sizeof(result)/sizeof(result[0]); i++){
if (result[i]){
dataStr += result[i]+",";
}
}
Serial2.println(dataStr);
delay(2000);
Serial2.flush();
//sdcard1();
dataStr="";
}
Please provide the reason for this behaviour along with detailed solution.
I want that all my sensors including gps give output continuously.