//RC Altimeter2 by James Nowicki     7-15-2024
//
//This program uses an Arduino Uno, an SD drive, and a BMP-388 Altimeter chip
//To measure and record altimeter data.  The program can store up to 255 files
//of altimeter data until it needs to be reset using the "RC_Alt_Reset.ino" program.

#include <Wire.h>  //Library to enable I2C
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#include <SPI.h>
#include <SD.h>
#include <EEPROM.h>

File logData;

#define SD_ChipSelectPin 4
#define SEALEVELPRESSURE_HPA (1013.25)

//Variables
int index = 1;
float altitude_data;
float zeronum;
int filenum=0;
String tempname = "";

Adafruit_BMP3XX bmp;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.print("Initializing SD Card...");

  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println("Initialization Failed!");
    while(true);  // stay here.
  }

  Serial.println("SD Card Opperational.");
  Serial.println();
  
  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
  
  // Check that Altimeter chip is working
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  // Determine average value for ground level altitude
  altitude_data = bmp.readAltitude(SEALEVELPRESSURE_HPA);
  delay(1000);
  altitude_data = bmp.readAltitude(SEALEVELPRESSURE_HPA);
  for (int x=1;x<5;x++){
    delay(1000);
    altitude_data = altitude_data + bmp.readAltitude(SEALEVELPRESSURE_HPA);
  }
  zeronum = altitude_data/5;
  zeronum = zeronum-0.4;

  //Retrieve last data file number for file naming
  //File names can range from 1 to 256, after which the EEPROM value needs to be reset to 1
  //To reset the EEPROM use the progrram "RC_Alt_Reset.ino"
  filenum = EEPROM.read(0);
  filenum = filenum + 1;
  EEPROM.update(0,filenum);
  tempname = "DATA" + String(filenum);
  Serial.print("Filename will be:  Altitude/");
  Serial.println(tempname);
}

void loop() {
  delay(1000);
  logData = SD.open("Altitude/"+tempname, FILE_WRITE); 

  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  
  altitude_data = bmp.readAltitude(SEALEVELPRESSURE_HPA);
  altitude_data = altitude_data - zeronum;
  altitude_data = altitude_data*3.281;  //convert to feet

  Serial.print("Data Count:");
  Serial.print(index);
  Serial.print("     Relative Altitude = ");
  Serial.print(altitude_data);
  Serial.println(" ft");
  
  if (logData){
    logData.print(index);
    logData.print(", ");
    logData.print(altitude_data);
    logData.println(", ");
    logData.close();
  }else{
     Serial.print("error opening file on SD card!");
    }

  index = index + 1;
}
