IT'S ALLIIIIVVVEEEE!!!!! I "re-Frankenstein'd" it, moving methodically and systematically, fixing any errors along the way. I was able to get rid of some variables, some "BMP" lines and didn't use the "Adafruit_Sensor.h" library at all. I have not really looked back and compared the two codes yet but this one works as expected.
#include <SPI.h>
#include <Wire.h>
#include <RH_RF95.h>
#include "Adafruit_APDS9960.h"
#include <Adafruit_GPS.h>
#include <Adafruit_SHT31.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_LIS3MDL.h>
#include <Adafruit_LSM6DS33.h>
#include "RTClib.h"
#include "avr/dtostrf.h"
#define GPSSerial Serial1
#include <Servo.h>
RTC_PCF8523 rtc;
#include <SD.h>
Adafruit_GPS GPS(&GPSSerial);
#define GPSECHO false
Servo servo;
Adafruit_SHT31 sht30; // humidity
Adafruit_BMP280 bmp280; // use I2C interface
Adafruit_LIS3MDL lis3mdl; // magnetometer
Adafruit_LSM6DS33 lsm6ds33; // accelerometer, gyroscope
Adafruit_APDS9960 apds; // proximity, light, color, gesture
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
#define RF95_FREQ 433.0
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
int MaxAlt = 0;
int MaxSpd = 0;
int MaxTem = 0;
int MinTem = 10000;
void setup() {
sht30.begin();
bmp280.begin();
lis3mdl.begin_I2C();
lsm6ds33.begin_I2C();
apds.begin();
apds.enableColor(true);
servo.attach(5);
servo.write(90);
rtc.start();
SD.begin(10);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
Serial.begin(115200);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
delay(1000);
GPSSerial.println(PMTK_Q_RELEASE);
delay(100);
// manual reset
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
while (1);
}
if (!rf95.setFrequency(RF95_FREQ)) {
while (1);
}
bmp280.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. */
rf95.setTxPower(23, false);
if (!SD.begin(10)) {
Serial.println("Card failed");
}
if (!apds.begin()) {
Serial.println("failed to initialize device! Please check your wiring.");
}
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (! rtc.initialized() || rtc.lostPower()) {
Serial.println("RTC is NOT initialized, let's set the time!");
}
}
void loop() {
if (GPS.altitude > MaxAlt) {MaxAlt = GPS.altitude; }
if (GPS.speed > MaxSpd) {MaxAlt = GPS.speed; }
if (bmp280.readTemperature() > MaxTem) {MaxTem = bmp280.readTemperature(); }
if (bmp280.readTemperature() < MinTem) {MinTem = bmp280.readTemperature(); }
sensors_event_t temp_event, pressure_event;
sensors_event_t accel;
sensors_event_t gyro;
sensors_event_t temp;
lsm6ds33.getEvent(&accel, &gyro, &temp);
lis3mdl.read();
DateTime now = rtc.now();
float magnetic_x, magnetic_y, magnetic_z;
float Lo = GPS.longitude;
float La = GPS.latitude;
int Al = GPS.altitude;
int Sp = GPS.speed;
int humidity = sht30.readHumidity();
float temperature = temp_event.temperature;
float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
delay(1000);
char c = GPS.read();
if (GPS.newNMEAreceived()) {
Serial.println(GPS.lastNMEA()); // 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 (GPS.fix) {
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print(GPS.speed); Serial.println("kn");
Serial.print(GPS.altitude); Serial.println("m");
}
delay(1000);
char radiopacket[2] = "N";
Serial.println(radiopacket);
radiopacket[1] = 0;
rf95.send((uint8_t *)radiopacket, 2);
rf95.waitPacketSent();
delay(1000);
char Lat[1] = {};
dtostrf(La, 9, 4, Lat);
Serial.print("Sending "); Serial.println(Lat);
rf95.send((uint8_t *) &Lat, 9);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Lon[1] = {};
dtostrf(Lo, 9, 4, Lon);
Serial.print("Sending "); Serial.println(Lon);
rf95.send((uint8_t *) &Lon, 9);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Spd[1] = {};
dtostrf(Sp, 3, 0, Spd);
Serial.print("Sending "); Serial.println(Spd);
rf95.send((uint8_t *) &Spd, 3);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Alt[1] = {};
dtostrf(Al, 6, 0, Alt);
Serial.print("Sending "); Serial.println(Alt);
rf95.send((uint8_t *) &Alt, 6);
delay(10);
rf95.waitPacketSent();
String dataString = "";
dataString += String(int(now.month())) += "/";
dataString += String(int(now.day())) += "/";
dataString += String(int(now.year())) += " ";
dataString += String(int(now.hour())) += ":";
dataString += String(int(now.minute())) += ":";
dataString += String(int(now.second())) += " ";
dataString += String(GPS.latitude, 4);
dataString += String(GPS.lat) += ", ";
dataString += String(GPS.longitude, 4);
dataString += String(GPS.lon) += " ";
dataString += String(bmp280.readTemperature()) += " C Min:";
dataString += String(MinTem) += " C Max:";
dataString += String(MaxTem) += " C Humidity:";
dataString += String(sht30.readHumidity()) += "% ";
dataString += String(bmp280.readPressure()) += " Pa ";
dataString += String(GPS.speed) += " kn ";
dataString += String(MaxSpd) += " kn MAX ";
dataString += String(GPS.altitude) += " m ";
dataString += String(MaxAlt) += " m MAX MagX:";
dataString += String(lis3mdl.x) += " MagY:";
dataString += String(lis3mdl.y) += " MagZ:";
dataString += String(lis3mdl.z) += " uTesla Acc x:";
dataString += String(accel.acceleration.x) += " Acc y:";
dataString += String(accel.acceleration.y) += " Acc z:";
dataString += String(accel.acceleration.z) += " m/s^2 Gyro x:";
dataString += String(gyro.gyro.x) += " Gyro y:";
dataString += String(gyro.gyro.y) += " Gyro z:";
dataString += String(gyro.gyro.z) += " dps Proximity:";
dataString += String(apds.readProximity());
File dataFile = SD.open("datalog.txt", FILE_WRITE); //Opens new text file on SD card called datalog.txt
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
Serial.println(dataString);
if (MaxAlt > 4000 && GPS.altitude < 3000) {
servo.write(15); // moves servo to 70 degrees
}
}