Hi, I am working with Max30003 and SD card module.
below is my code.
/
/*
SD card test
This example shows how use the utility libraries on which the'
SD library is based in order to get info about your SD card.
Very useful for testing a card when you're not sure whether its working or not.
The circuit:
SD card attached to SPI bus as follows:
** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
** CS - depends on your SD card shield or module.
Pin 4 used here for consistency with other Arduino examples
created 28 Mar 2011
by Limor Fried
modified 9 Apr 2012
by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include "SD.h"
#include "protocentral_Max30003.h"
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 0;
MAX30003 max30003;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
pinMode(MAX30003_CS_PIN,OUTPUT);
digitalWrite(MAX30003_CS_PIN,HIGH); //disable device
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
bool ret = max30003.max30003ReadInfo();
if(ret){
Serial.println("Max30003 read ID Success");
}else{
while(!ret){
//stay here untill the issue is fixed.
ret = max30003.max30003ReadInfo();
Serial.println("Failed to read ID, please make sure all the pins are connected");
delay(10000);
}
}
Serial.println("Initialising the chip ...");
max30003.max30003Begin(); // initialize MAX30003
delay(1000);
Serial.print("\nInitializing SD card...");
pinMode(chipSelect,OUTPUT);
digitalWrite(chipSelect,LOW); //disable device
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
// while (1);
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.println();
Serial.print("Card type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
// while (1);
}
Serial.print("Clusters: ");
Serial.println(volume.clusterCount());
Serial.print("Blocks x Cluster: ");
Serial.println(volume.blocksPerCluster());
Serial.print("Total Blocks: ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
// print the type and size of the first FAT-type volume
uint32_t volumesize;
Serial.print("Volume type is: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize /= 2; // SD card blocks are always 512 bytes (2 blocks are 1KB)
Serial.print("Volume size (Kb): ");
Serial.println(volumesize);
Serial.print("Volume size (Mb): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Gb): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
digitalWrite(chipSelect,HIGH); //disable device
}
void loop(void) {
digitalWrite(MAX30003_CS_PIN,LOW); //disable device
max30003.getEcgSamples(); //It reads the ecg sample and stores it to max30003.ecgdata .
Serial.println(max30003.ecgdata);
digitalWrite(MAX30003_CS_PIN,HIGH); //disable device
delay(8);
}
issue is that both are initalized correctly but i am getting 0 values from max30003 ecg sensor. when i run max30003 alone, it gives correct value. can you please tell whats the issue? Any help would be much appriciated. @msfujino
Which pin of XIAO is connected to the chip select pin of the SD card?
pin 0
Which pin of XIAO is connected to the chip select pin of the MAX30003 board?
pin 7
Where is the definition of “MAX30003_CS_PIN”?
it is in header file of max30003
Please explain the connection between the SD card, MAX30003 board and XIAO_nRF52840 using pin names.
i am using 8 as sclk, 9 as miso and 10 as mosi. these 3 pins are common between sd card and max30003.
Please show us the sketch of MAX30003 when it is executed alone.
#include<SPI.h>
#include "protocentral_Max30003.h"
MAX30003 max30003;
void setup()
{
Serial.begin(57600); //Serial begin
pinMode(MAX30003_CS_PIN,OUTPUT);
digitalWrite(MAX30003_CS_PIN,HIGH); //disable device
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
bool ret = max30003.max30003ReadInfo();
if(ret){
Serial.println("Max30003 read ID Success");
}else{
while(!ret){
//stay here untill the issue is fixed.
ret = max30003.max30003ReadInfo();
Serial.println("Failed to read ID, please make sure all the pins are connected");
delay(10000);
}
}
Serial.println("Initialising the chip ...");
max30003.max30003Begin(); // initialize MAX30003
}
void loop()
{
max30003.getEcgSamples(); //It reads the ecg sample and stores it to max30003.ecgdata .
Serial.println(max30003.ecgdata);
delay(8);
}
Please show a sketch of the SD card when it is executed alone.
#include <SPI.h>
#include <SD.h>
const int chipSelect = 0;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
// wait for Serial Monitor to connect. Needed for native USB port boards only:
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
while (true);
}
Serial.println("initialization done.");
}
void loop() {
// make a string for assembling the data to log:
String dataString = "";
// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
I guess that SD.open(), dataFile.println(), dataFile.close() and Serial.println(), which are executed each time in loop{}, take more than 10mS, Can max30003.getEcgSamples() return the desired data?
Ya. initialization is correct and give correct id as expected but samples output is not correct. I have done inialization of sd card after max… when its done. it gives odd result…
It seems to me that the SD process is taking too long and not reading the correct data from MAX.
Try to shorten the execution time by using open() in setup() and loop() only to write to the file, and close the file at an appropriate time. What will be the result?
What is the MAX data rate?
You must write to SD at a data rate of at least the MAX data rate.
Please show me a sketch that works properly with XIAO_ESP32C3.
I don’t think that is the cause, but the SPI configuration is different between nRF52 and ESP32.