and how about adxl345 dataloggering? because this two modules use spi and because of the data rete I have to use HSPI for both!
and when I try to use them it didn't work
I try to use RTOS but it steal not working properly
here is the code:
#include "FS.h"
#include "SD.h"
#include <SPI.h>
//Assign the Chip Select signal to pin 10.
int CS1=10;
int CS2=9;
int btn=17;
//This is a list of some of the registers available on the ADXL345.
//To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
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
char sample = 0x2C; //Sample rate
//This buffer will hold values read from the ADXL345 registers.
char values[10];
//These variables will be used to hold the x,y and z axis accelerometer values.
int16_t x,y,z;
float x1;
float y2;
float z1;
String dataMessage;
//int x = 32767 ;
unsigned long time1 ;
//unsigned long time2,time3;
void setup() {
Serial.begin(115200);
//Initiate an SPI communication instance.
SPI.begin();
//Set up the Chip Select pin to be an output from the Arduino.
pinMode(CS1, OUTPUT);
pinMode(CS2, OUTPUT);
pinMode(btn,OUTPUT);
digitalWrite(btn,LOW);
//Before communication starts, the Chip Select pin needs to be set high.
digitalWrite(CS1, HIGH);
digitalWrite(CS2, HIGH);
//Put the ADXL345 into +/- 8G range by writing the value 0x01 to the DATA_FORMAT register.
writeRegister(DATA_FORMAT, 0x02);
//Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
writeRegister(POWER_CTL, 0x08); //Measurement mode
writeRegister(sample, 0x0F);
digitalWrite(CS1, LOW);
initSDCard();
// If the data.txt file doesn't exist
// Create a file on the SD card and write the data labels
File file = SD.open("/data.txt");
if(!file) {
writeFile(SD, "/data.txt", "Time, x, y, z \r\n");
}
else {
}
file.close();
digitalWrite(CS1, HIGH);
time1 = millis();
xTaskCreate(
task1, // Function that should be called
"Task 1", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL // Task handle
);
xTaskCreate(
task2, // Function that should be called
"Task 2", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL // Task handle
);
}
void loop() {
/*
digitalWrite(CS1, LOW);
Serial.println("Start");
dataMessage = String(time1) + "," + String(x1) + "," + String(y2) + "," + String(z1)+ "\r\n";
File file = SD.open("/data.txt", FILE_APPEND);
if(!file) {
return;
}
if (digitalRead(btn)==0){
file.print(dataMessage);
}else if(digitalRead(btn)==1){
file.close();
Serial.println("end");
}
//time2 = millis();
//time3 = time2-time1;
//Serial.println(time3);
digitalWrite(CS1, HIGH);
*/
}
void initSDCard(){
if (!SD.begin()) {
return;
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
return;
}
if(cardType == CARD_MMC){
} else if(cardType == CARD_SD){
} else if(cardType == CARD_SDHC){
} else {
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
}
// Write to the SD card
void writeFile(fs::FS &fs, const char * path, const char * message) {
File file = fs.open(path, FILE_WRITE);
if(!file) {
return;
}
if(file.print(message)) {
} else {
}
file.close();
}
//This function will write a value to a register on the ADXL345.
//Parameters:
// char registerAddress - The register to write a value to
// char value - The value to be written to the specified register.
void writeRegister(char registerAddress, char value){
//Set Chip Select pin low to signal the beginning of an SPI packet.
digitalWrite(CS2, LOW);
//Transfer the register address over SPI.
SPI.transfer(registerAddress);
//Transfer the desired register value over SPI.
SPI.transfer(value);
//Set the Chip Select pin high to signal the end of an SPI packet.
digitalWrite(CS2, HIGH);
}
//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
//Parameters:
// char registerAddress - The register addresse to start the read sequence from.
// int numBytes - The number of registers that should be read.
// char * values - A pointer to a buffer where the results of the operation should be stored.
void readRegister(char registerAddress, int numBytes, char * values){
//Since we're performing a read operation, the most significant bit of the register address should be set.
char address = 0x80 | registerAddress;
//If we're doing a multi-byte read, bit 6 needs to be set as well.
if(numBytes > 1)address = address | 0x40;
//Set the Chip select pin low to start an SPI packet.
digitalWrite(CS2, LOW);
//Transfer the starting register address that needs to be read.
SPI.transfer(address);
//Continue to read registers until we've read the number specified, storing the results to the input buffer.
for(int i=0; i<numBytes; i++){
values[i] = SPI.transfer(0x00);
}
//Set the Chips Select pin high to end the SPI packet.
digitalWrite(CS2, HIGH);
}
void task1(void * parameters){
//Reading 6 bytes of data starting at register DATAX0 will retrieve the x,y and z acceleration values from the ADXL345.
//The results of the read operation will get stored to the values[] buffer.
for(;;){
readRegister(DATAX0, 6, values);
//The ADXL345 gives 10-bit acceleration values, but they are stored as bytes (8-bits). To get the full value, two bytes must be combined for each axis.
//The X value is stored in values[0] and values[1].
x = ((int)values[1]<<8)|(int)values[0];
x = (x*100)/64;
x1 = x;
x1/=100;
//The Y value is stored in values[2] and values[3].
y = ((int)values[3]<<8)|(int)values[2];
y = (y*100)/64;
y2 = y;
y2/=100;
//The Z value is stored in values[4] and values[5].
z = ((int)values[5]<<8)|(int)values[4];
z = (z*100)/64;
z1 = z;
z1/=100;
}
}
void task2(void * parameters){
for(;;){
Serial.println("Start");
dataMessage = String(time1) + "," + String(x1) + "," + String(y2) + "," + String(z1)+ "\r\n";
File file = SD.open("/data.txt", FILE_APPEND);
if(!file) {
return;
}
if (digitalRead(btn)==0){
file.print(dataMessage);
}else if(digitalRead(btn)==1){
file.close();
Serial.println("end");
}
//time2 = millis();
//time3 = time2-time1;
//Serial.println(time3);
digitalWrite(CS1, HIGH);
}
}