So, I'm working on a data logging setup to record the flight of a rocket, it takes less than 10 seconds to reach apogee so the code cannot have any long delays, I'm working with an arduino nano but I've a Uno somewhere around that I can use if needed. The SD module is a "Micro SD card adapter" (the long one).
I would like to log the 3 axis of the ADXL but at least one. Then, don't know why doesn't it compile, nothing on the web, working on that for 4 hours now...
Here's the code, good luck.
//libraries
#include <Wire.h>
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
#include <SD.h>
#include <SPI.h>
//define leds
#define LedR 3
#define LedW 4
//SD setup
File myFile;
int CS=10; //pin10
int CSb=8;
int i;
int chipSelect = 8; //Pin8
//registres ADXL345
char POWER_WTL = 0x2D; //power control
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
//Buffer
char values[10];
//BMP180 setup
Adafruit_BMP085 bmp;
float tempC;
float pressure;
//ADXL345 setup
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
//setRange(ADXL345_RANGE_16_G);
int x,y,z;
double xg,yg,zg;
double totals[3]
//VOID
//SETUP
void setup() {
//PinMode
pinMode(LedR, OUTPUT);
pinMode(LedW, OUTPUT);
pinMode(CSb, OUTPUT);
pinMode(CS, OUTPUT);
pinMode(8, OUTPUT); //Pin Sd Output Arduino
//Serial
Serial.begin(38400);
//Verif BMP
bmp.begin();
if (!bmp.begin())
{
problem;
}
//verif ADXL
accel.begin();
if (!accel.begin())
{
problem;
}
writeRegister(DATA_FORMAT, 0x11); //set range
writeRegister(POWER_CTL, 0x08); //mode mesure
writeRegister(BW_RATE, 0x0D); //test
//SD begin
SPI.begin();
SPI.setDataMode(SPI_MODE0);
if (!SD.begin(8))
{
problem;
return;
}
SPI.setDataMode(SPI_MODE3);
digitalWrite(CS, HIGH);
writeRegister(DATA_FORMAT, 0x01);
writeRegister(POWER_CTL, 0x08);
//SD crash File
char filename[] = "Crash.txt";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
}
myFile = SD.open(filename, FILE_WRITE);
break;
//SD config
myFile.println("Time in MilliSeconds,X_Axis,Y_Axis,Z_Axis, X_G's,Y_G's,Z_G's");
SPI.setDataMode(SPI_MODE3);
digitalWrite(CS, HIGH);
}
}
//VOID
//LOOP
void loop() {
//SD
time = millis();
//log time
myFile.print(time);
myFile.print(',');
//sync data
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
myFile.flush();
//ADXL
readRegister(DATAX0, 6, values);
//10bit => 8bit
x = ((int)values[1]<<8)|(int)values[0];
y = ((int)values[3]<<8)|(int)values[2];
z = ((int)values[5]<<8)|(int)values[4];
//convertit raw => g
xg=x*g;
yg=y*g;
zg=z*g;
//store vals
totals[0] = xg;
totals[1] = yg;
totals[2] = zg;
//log accels
myFile.print(x);
myFile.print(',');
myFile.print(y);
myFile.print(',');
myFile.print(z);
myFile.print(',');
for (i = 0; i < 3; i = i + 1) {
myFile.print(totals[i]);
myFile.print(',');
//BMP-180
tempC = bmp.readTemperature();
pressure = bmp.readPressure();
myFile.println("Temp: ");
myFile.print(tempC);
myFile.print("°C");
myFile.println("Press: ");
myFile.print(pressure);
myFile.print("Pa");
myFile.print(',');
//Delay
//delay(250); //Pause entre reads
}
//FUNCTIONS
void problem() {
while (1)
{
digitalWrite(LedW, HIGH);
delay(500);
digitalWrite(LedW, LOW);
delay(500);
}
}
void writeRegister(char registerAddress, char value){
digitalWrite(CS, LOW);
SPI.transfer(registerAddress);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
void readRegister(char registerAddress, int numBytes, char * values){
char address = 0x80 | registerAddress;
if(numBytes > 1)address = address | 0x40;
digitalWrite(CS, LOW);
SPI.transfer(address);
for(int i=0; i<numBytes; i++){
values[i] = SPI.transfer(0x00);
}
digitalWrite(CS, HIGH);
}