Advertisement
Guest User

Untitled

a guest
Nov 12th, 2022
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.29 KB | None | 0 0
  1. #include <MemoryFree.h>;
  2. #include <pgmStrToRAM.h>;
  3. ////////////////////////////////
  4. #include <Adafruit_VEML6070.h>
  5.  
  6. #include <AltSoftSerial.h>
  7.  
  8. #include <TinyGPS++.h>
  9. #include <TinyGPSPlus.h>
  10.  
  11. //#include <RingBuf.h>
  12. #include <SdFatConfig.h>
  13. #include <sdios.h>
  14. #include <BufferedPrint.h>
  15. #include <FreeStack.h>
  16. #include <MinimumSerial.h>
  17. #include <SdFat.h>
  18.  
  19. #include <Wire.h>
  20. #include <Adafruit_Sensor.h>
  21. #include <Adafruit_TCS34725.h>
  22. #include <NMEAGPS.h>
  23. #include <GPSport.h>
  24. #include <Streamers.h>
  25. #include <DFRobot_OxygenSensor.h>
  26. #include <SPI.h>
  27. #include <SoftwareSerial.h>
  28. #include <Adafruit_BNO055.h>
  29. #include <BMP280_DEV.h>  // Include the BMP280_DEV.h library
  30. #include "Adafruit_BME680.h"
  31.  
  32.  
  33.  
  34.  
  35.  
  36. ////------------------------------------------TO-DO-------------------------------
  37. //GPS SDCARD 9DOF TEMP
  38. //
  39. ///////////////////////////////////////////////////constants//////////////////////////////////////////
  40. #define RXpin 17
  41. #define TXpin 16
  42. #define FILE_BASE_NAME "Data"        //sd
  43. #define Oxygen_IICAddress ADDRESS_3  //02
  44. #define COLLECT_NUMBER 10            // collect number, the collection range is 1-100. //02
  45. const int chipSelect = 53;
  46. #define SEALEVELPRESSURE_HPA (1013.25)
  47.  
  48.  
  49.  
  50. #define ms 0
  51. #define UTCTime 1
  52. #define Altitude 2
  53. #define Lat 3
  54. #define Long 4
  55. #define Altitude 5
  56. #define BNOonboardTemp 6
  57. #define temperatureOutside 7
  58. #define OrientX 8
  59. #define OrientY 9
  60. #define OrientZ 10
  61. #define AccelX 11
  62. #define AccelY 12
  63. #define AccelZ 13
  64. #define GravityX 14
  65. #define GravityY 15
  66. #define GravityZ 16
  67. #define Magx 17
  68. #define Magy 18
  69. #define Magz 19
  70. #define GyroX 20
  71. #define GyroY 21
  72. #define BMETemp 22
  73. #define BMEPressure 23
  74. #define BMEHumidity 24
  75. #define BMEGas 25
  76. #define Red 26
  77. #define Green 27
  78. #define Blue 28
  79. #define IR 29
  80. #define UV 30
  81. #define barPressure 31
  82. #define O2 32
  83.  
  84. //SD card header count and header fields
  85. const uint8_t ANALOG_COUNT = 33;
  86. String dataPoints[ANALOG_COUNT] = { "ms", "UTCTime", "Altitude", "lat", "long", "Altitude", "BNOonboardTemp", "temperatureOutside", "OrientX", "OrientY", "OrientZ", "AccelX", "AccelY", "AccelZ", "GravityX", "GravityY", "GravityZ", "Magx", "Magy", "Magz", "GyroX", "GyroY", "BMETemp", "BMEPressure", "BMEHumidity", "BMEGas", "Red", "Green", "Blue", "IR", "UV", "Pressure", "02" };
  87. //Sd storage array
  88. String data[ANALOG_COUNT];
  89.  
  90. #define Oxygen_IICAddress ADDRESS_3
  91. #define COLLECT_NUMBER 10  // collect number, the collection range is 1-100.
  92.  
  93. #define GPSSerial Serial1
  94.  
  95. //SD card
  96. const uint32_t SAMPLE_INTERVAL_MS = 1000;
  97.  
  98. /* Set the delay between fresh samples BNO055 */
  99. uint16_t BNO055_SAMPLERATE_DELAY_MS = 1000;
  100.  
  101.  
  102. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. //////////////////////////////////////////////////Objects///////////////////////////////////////////////////
  104. ////Create instance Software Serial
  105. SoftwareSerial mySerial(RXpin, TXpin);
  106.  
  107. Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);  //Instantiate BNO-055
  108.  
  109. Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);  //RGB
  110.  
  111. DFRobot_OxygenSensor oxygen;
  112.  
  113. Adafruit_VEML6070 uv = Adafruit_VEML6070();  //UV SENSOR
  114.  
  115. float temperature, pressure, altitude;  // Create the temperature, pressure and altitude variables
  116. BMP280_DEV bmp280;
  117. Adafruit_BME680 bme; // I2C
  118.  
  119. ////------------------------------------------------------------------------------
  120. //////SD Card
  121. #define FILE_BASE_NAME "Data"
  122. //==============================================================================
  123. // Error messages stored in flash.
  124. #define error(msg) sd.errorHalt(F(msg))
  125. //-------------------------------------------
  126.  
  127. // File system object.
  128. SdFat sd;
  129.  
  130. // Log file.
  131. SdFile file;
  132.  
  133. // Time in micros for next data record.
  134. uint32_t logTime;
  135.  
  136. //GPS obj
  137. TinyGPSPlus gps;
  138.  
  139. AltSoftSerial altSerial;
  140.  
  141. long msElapsed = millis();
  142.  
  143. boolean isStarted = false;
  144.  
  145. void setup() {
  146.   //SD card base file name
  147.   const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
  148.   char fileName[13] = FILE_BASE_NAME "00.csv";
  149.   //  // Open serial communications and wait for port to open:
  150.   Serial.begin(115200);
  151.   altSerial.begin(115200);
  152.   uv.begin(VEML6070_HALF_T);
  153.   delay(1000);
  154.  
  155.   //sd HALT ERROR
  156.   if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) {
  157.     sd.initErrorHalt();
  158.   }
  159.   if (!bme.begin()) {
  160.     Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
  161.     while (1)
  162.       ;
  163.   }
  164.   // Find an unused file name.
  165.   if (BASE_NAME_SIZE > 6) {
  166.     error("FILE_BASE_NAME too long");
  167.   }
  168.   while (sd.exists(fileName)) {
  169.     if (fileName[BASE_NAME_SIZE + 1] != '9') {
  170.       fileName[BASE_NAME_SIZE + 1]++;
  171.     } else if (fileName[BASE_NAME_SIZE] != '9') {
  172.       fileName[BASE_NAME_SIZE + 1] = '0';
  173.       fileName[BASE_NAME_SIZE]++;
  174.     } else {
  175.       error("Can't create file name");
  176.     }
  177.   }
  178.   if (!file.open(fileName, O_WRONLY | O_CREAT | O_EXCL)) {
  179.     error("file.open");
  180.   }
  181.   //INITIALIZE BNO 055 ACCELEROMETER
  182.   if (!bno.begin()) {
  183.     /* There was a problem detecting the BNO055 ... check your connections */
  184.     // Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
  185.     // while (1);
  186.   }
  187.   //oversampling and filter init
  188.   bme.setTemperatureOversampling(BME680_OS_8X);
  189.   bme.setHumidityOversampling(BME680_OS_2X);
  190.   bme.setPressureOversampling(BME680_OS_4X);
  191.   bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  192.   bme.setGasHeater(320, 150);  // 320*C for 150 ms
  193.   oxygen.begin(Oxygen_IICAddress);
  194.  
  195.   bmp280.begin();
  196.   writeHeader();
  197.   int msElapsed = millis();
  198. }
  199.  
  200.  
  201.  
  202.  
  203. void loop() {
  204.   Serial.println("begin");
  205.  
  206.   // Time for next record.
  207.   logTime += 1000UL * SAMPLE_INTERVAL_MS;
  208.   // Wait for log time.
  209.   int32_t diff;
  210.   do {
  211.     diff = micros() - logTime;
  212.   } while (diff < 0);
  213.   unsigned long endTime = bme.beginReading();
  214.   // // Check for data rate too high.
  215.   // if (diff > 10) {
  216.   //   error("Missed data record");
  217.   // }
  218.  
  219.   // Serial.println("Start ");
  220.   // Serial.println(millis());
  221.   // Serial.println(gps.satellites.value());
  222.  
  223.   // char c;
  224.   // Serial.println("Latitude");
  225.  
  226.   // Serial.println(gps.location.lat());
  227.  
  228.  
  229.   // if (Serial.available()) {
  230.   //   c = Serial.read();
  231.  
  232.   //   altSerial.print(c);
  233.   // }
  234.   // if (altSerial.available()) {
  235.  
  236.   //   c = gps.encode(altSerial.read());
  237.   //   delay(100);
  238.   //   Serial.print(c);
  239.   // }
  240.   // Serial.println("--");
  241.   //GPSloop();
  242.   //  if (Serial.available()) {
  243.   //    char c = Serial.read();
  244.   //    GPSSerial.println(c);
  245.   //  }
  246.   //  if (GPSSerial.available()) {
  247.   //    char c = GPSSerial.read();
  248.   //    Serial.print(c);
  249.   //  }
  250.   //measureGPS();
  251.   //measureBNO();
  252.   measureUV();
  253.   //measureBMP280();
  254.   delay(250);
  255.   measureBME680();
  256.   delay(250);
  257.   measureColor();
  258.   measure02();
  259.   measureIR();
  260.   logData();
  261.   Serial.println(endTime);
  262. }
  263.  
  264.  
  265. ////////////////////////////////////////////Functions///////////////////////////////////
  266. ////--------------------------
  267. void measureIR() {
  268.   data[IR] = analogRead(A0);
  269. }
  270. void measureGPS() {
  271.  
  272.   data[ms] = logTime / 1000;  //fills micros field
  273.   data[UTCTime] = gps.time.value();
  274.   data[Lat] = gps.location.lat();
  275.   data[Long] = gps.location.lng();
  276.   data[Altitude] = gps.altitude.meters();
  277. }
  278. void measureBME680(){
  279.   bme.beginReading();
  280.   data[BMETemp] = bme.temperature;
  281.   data[BMEPressure] = bme.pressure/100.0;
  282.   data[BMEHumidity] = bme.humidity;
  283.   data[BMEGas] = bme.gas_resistance;
  284. }
  285. void measureBMP280() {
  286.   bmp280.startNormalConversion();
  287.  
  288.   bmp280.getMeasurements(temperature, pressure, altitude);
  289.   delay(100);                                                   // Start BMP280 forced conversion (if we're in SLEEP_MODE)
  290.   if (bmp280.getMeasurements(temperature, pressure, altitude))  // Check if the measurement is complete
  291.   {
  292.     data[temperatureOutside] = temperature;
  293.     data[barPressure] = pressure;
  294.     data[Altitude] = altitude;
  295.   }
  296. }
  297. void measureUV() {
  298.   data[UV] = uv.readUV();
  299. }
  300. void measureColor() {
  301.  
  302.   float red, green, blue;
  303.   //acquire values
  304.   tcs.getRGB(&red, &green, &blue);
  305.   //store in array
  306.  
  307.   data[Red] = (int(red));
  308.   data[Green] = (int(green));
  309.   data[Blue] = (int(blue));
  310. }
  311. void measure02() {
  312.   float oxygenData = oxygen.getOxygenData(COLLECT_NUMBER);
  313.   data[O2] = oxygenData;
  314.   // Serial.println("Oxygen");
  315.   // Serial.println(oxygenData);
  316. }
  317. void measureBNO() {
  318.  
  319.   uint8_t system, gyro, accel, mag = 0;
  320.   sensors_event_t orientationData, angVelocityData, linearAccelData, magnetometerData, accelerometerData, gravityData;
  321.  
  322.   bno.getCalibration(&system, &gyro, &accel, &mag);
  323.   bno.getEvent(&orientationData, Adafruit_BNO055::VECTOR_EULER);
  324.   bno.getEvent(&angVelocityData, Adafruit_BNO055::VECTOR_GYROSCOPE);
  325.   bno.getEvent(&linearAccelData, Adafruit_BNO055::VECTOR_LINEARACCEL);
  326.   bno.getEvent(&magnetometerData, Adafruit_BNO055::VECTOR_MAGNETOMETER);
  327.   bno.getEvent(&accelerometerData, Adafruit_BNO055::VECTOR_ACCELEROMETER);
  328.   bno.getEvent(&gravityData, Adafruit_BNO055::VECTOR_GRAVITY);
  329. }
  330. // void printEvent(sensors_event_t* event) {
  331. //   double x = -1000000, y = -1000000, z = -1000000;  //dumb values, easy to spot problem
  332. //   if (event->type == SENSOR_TYPE_ACCELEROMETER) {
  333.  
  334. //     x = event->acceleration.x;
  335. //     y = event->acceleration.y;
  336. //     z = event->acceleration.z;
  337. //     data[AccelX] = x;
  338. //     data[AccelY] = y;
  339. //     data[AccelZ] = z;
  340. //   } else if (event->type == SENSOR_TYPE_ORIENTATION) {
  341.  
  342. //     x = event->orientation.x;
  343. //     y = event->orientation.y;
  344. //     z = event->orientation.z;
  345. //     data[OrientX] = x;
  346. //     data[OrientY] = y;
  347. //     data[OrientZ] = z;
  348. //   } else if (event->type == SENSOR_TYPE_GYROSCOPE) {
  349.  
  350. //     x = event->gyro.x;
  351. //     y = event->gyro.y;
  352. //     z = event->gyro.z;
  353. //     data[GyroX] = x;
  354. //     data[GyroY] = y;
  355. //     data[GyroZ] = z;
  356.   // } else if (event->type == SENSOR_TYPE_ROTATION_VECTOR) {
  357.  
  358.   //   x = event->gyro.x;
  359.   //   y = event->gyro.y;
  360.   //   z = event->gyro.z;
  361.   //   data[RotX] = x;
  362.   //   data[RotY] = y;
  363.   //   data[RotZ] = z;
  364.   // } else if (event->type == SENSOR_TYPE_LINEAR_ACCELERATION) {
  365.  
  366. //     x = event->acceleration.x;
  367. //     y = event->acceleration.y;
  368. //     z = event->acceleration.z;
  369. //   } else if (event->type == SENSOR_TYPE_GRAVITY) {
  370.  
  371. //     x = event->acceleration.x;
  372. //     y = event->acceleration.y;
  373. //     z = event->acceleration.z;
  374. //     data[GravityX] = x;
  375. //     data[GravityY] = y;
  376. //     data[GravityZ] = z;
  377. //   } else {
  378. //     Serial.print("Unk:");
  379. //   }
  380. // }
  381.  
  382. //------------------------------------------------------------------------------
  383. //Write data header.
  384. void writeHeader() {
  385.   file.print(F("micros,"));
  386.  
  387.   for (uint8_t i = 0; i < ANALOG_COUNT; i++) {
  388.     file.print(String(dataPoints[i]));
  389.     file.write(",");
  390.   }
  391.   file.println();
  392. }
  393. //-----------------------------------------------------------
  394. //------------------------------------------------------------------------------
  395. // Log a data record. Captured in array
  396. void logData() {
  397.   int column;
  398.   if (!file.open("data00.csv", O_WRONLY | O_CREAT | O_APPEND)) {
  399.     error("open CSV failed");
  400.   }
  401.  
  402.   // Write ADC data to CSV record.
  403.   for (uint8_t i = 0; i < ANALOG_COUNT; i++) {
  404.     file.write(',');
  405.     file.print(data[i]);
  406.   }
  407.  
  408.   //return carriage //newline
  409.   //file.print("\r");
  410.   file.write("\n");
  411.   file.close();
  412. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement